aboutsummaryrefslogtreecommitdiff
path: root/src/backend/access
diff options
context:
space:
mode:
authorAmit Kapila <akapila@postgresql.org>2019-01-28 11:31:44 +0530
committerAmit Kapila <akapila@postgresql.org>2019-01-28 11:31:44 +0530
commita23676503b746b7f1588cd2ab0c60411032d32da (patch)
treeac7f172ec94771441558639e0725e6d56d6e7b47 /src/backend/access
parentac88d2962a96a9c7e83d5acfc28fe49a72812086 (diff)
downloadpostgresql-a23676503b746b7f1588cd2ab0c60411032d32da.tar.gz
postgresql-a23676503b746b7f1588cd2ab0c60411032d32da.zip
Revert "Avoid creation of the free space map for small heap relations."
This reverts commit ac88d2962a96a9c7e83d5acfc28fe49a72812086.
Diffstat (limited to 'src/backend/access')
-rw-r--r--src/backend/access/brin/brin.c2
-rw-r--r--src/backend/access/brin/brin_pageops.c10
-rw-r--r--src/backend/access/heap/hio.c47
-rw-r--r--src/backend/access/heap/vacuumlazy.c17
-rw-r--r--src/backend/access/transam/xact.c14
5 files changed, 31 insertions, 59 deletions
diff --git a/src/backend/access/brin/brin.c b/src/backend/access/brin/brin.c
index 8f008dd0080..467d91e6818 100644
--- a/src/backend/access/brin/brin.c
+++ b/src/backend/access/brin/brin.c
@@ -1150,7 +1150,7 @@ terminate_brin_buildstate(BrinBuildState *state)
freespace = PageGetFreeSpace(page);
blk = BufferGetBlockNumber(state->bs_currentInsertBuf);
ReleaseBuffer(state->bs_currentInsertBuf);
- RecordPageWithFreeSpace(state->bs_irel, blk, freespace, InvalidBlockNumber);
+ RecordPageWithFreeSpace(state->bs_irel, blk, freespace);
FreeSpaceMapVacuumRange(state->bs_irel, blk, blk + 1);
}
diff --git a/src/backend/access/brin/brin_pageops.c b/src/backend/access/brin/brin_pageops.c
index 2eb354f948f..164a4681556 100644
--- a/src/backend/access/brin/brin_pageops.c
+++ b/src/backend/access/brin/brin_pageops.c
@@ -310,7 +310,7 @@ brin_doupdate(Relation idxrel, BlockNumber pagesPerRange,
if (extended)
{
- RecordPageWithFreeSpace(idxrel, newblk, freespace, InvalidBlockNumber);
+ RecordPageWithFreeSpace(idxrel, newblk, freespace);
FreeSpaceMapVacuumRange(idxrel, newblk, newblk + 1);
}
@@ -461,7 +461,7 @@ brin_doinsert(Relation idxrel, BlockNumber pagesPerRange,
if (extended)
{
- RecordPageWithFreeSpace(idxrel, blk, freespace, InvalidBlockNumber);
+ RecordPageWithFreeSpace(idxrel, blk, freespace);
FreeSpaceMapVacuumRange(idxrel, blk, blk + 1);
}
@@ -654,7 +654,7 @@ brin_page_cleanup(Relation idxrel, Buffer buf)
/* Measure free space and record it */
RecordPageWithFreeSpace(idxrel, BufferGetBlockNumber(buf),
- br_page_get_freespace(page), InvalidBlockNumber);
+ br_page_get_freespace(page));
}
/*
@@ -703,7 +703,7 @@ brin_getinsertbuffer(Relation irel, Buffer oldbuf, Size itemsz,
/* Choose initial target page, re-using existing target if known */
newblk = RelationGetTargetBlock(irel);
if (newblk == InvalidBlockNumber)
- newblk = GetPageWithFreeSpace(irel, itemsz, true);
+ newblk = GetPageWithFreeSpace(irel, itemsz);
/*
* Loop until we find a page with sufficient free space. By the time we
@@ -895,7 +895,7 @@ brin_initialize_empty_new_buffer(Relation idxrel, Buffer buffer)
* pages whose FSM records were forgotten in a crash.
*/
RecordPageWithFreeSpace(idxrel, BufferGetBlockNumber(buffer),
- br_page_get_freespace(page), InvalidBlockNumber);
+ br_page_get_freespace(page));
}
diff --git a/src/backend/access/heap/hio.c b/src/backend/access/heap/hio.c
index 4c3e774eee2..3da0b49ccc4 100644
--- a/src/backend/access/heap/hio.c
+++ b/src/backend/access/heap/hio.c
@@ -239,14 +239,8 @@ RelationAddExtraBlocks(Relation relation, BulkInsertState bistate)
* Immediately update the bottom level of the FSM. This has a good
* chance of making this page visible to other concurrently inserting
* backends, and we want that to happen without delay.
- *
- * Since we know the table will end up with extraBlocks additional
- * pages, we pass the final number to avoid possible unnecessary
- * system calls and to make sure the FSM is created when we add the
- * first new page.
*/
- RecordPageWithFreeSpace(relation, blockNum, freespace,
- firstBlock + extraBlocks);
+ RecordPageWithFreeSpace(relation, blockNum, freespace);
}
while (--extraBlocks > 0);
@@ -383,9 +377,20 @@ RelationGetBufferForTuple(Relation relation, Size len,
* We have no cached target page, so ask the FSM for an initial
* target.
*/
- targetBlock = GetPageWithFreeSpace(relation,
- len + saveFreeSpace,
- false);
+ targetBlock = GetPageWithFreeSpace(relation, len + saveFreeSpace);
+
+ /*
+ * If the FSM knows nothing of the rel, try the last page before we
+ * give up and extend. This avoids one-tuple-per-page syndrome during
+ * bootstrapping or in a recently-started system.
+ */
+ if (targetBlock == InvalidBlockNumber)
+ {
+ BlockNumber nblocks = RelationGetNumberOfBlocks(relation);
+
+ if (nblocks > 0)
+ targetBlock = nblocks - 1;
+ }
}
loop:
@@ -479,14 +484,6 @@ loop:
{
/* use this page as future insert target, too */
RelationSetTargetBlock(relation, targetBlock);
-
- /*
- * In case we used an in-memory map of available blocks, reset it
- * for next use.
- */
- if (targetBlock < HEAP_FSM_CREATION_THRESHOLD)
- FSMClearLocalMap();
-
return buffer;
}
@@ -546,12 +543,9 @@ loop:
/*
* Check if some other backend has extended a block for us while
- * we were waiting on the lock. We only check the FSM -- if there
- * isn't one we don't recheck the number of blocks.
+ * we were waiting on the lock.
*/
- targetBlock = GetPageWithFreeSpace(relation,
- len + saveFreeSpace,
- true);
+ targetBlock = GetPageWithFreeSpace(relation, len + saveFreeSpace);
/*
* If some other waiter has already extended the relation, we
@@ -631,12 +625,5 @@ loop:
*/
RelationSetTargetBlock(relation, BufferGetBlockNumber(buffer));
- /*
- * In case we used an in-memory map of available blocks, reset it for next
- * use. We do this unconditionally since after relation extension we
- * can't skip this based on the targetBlock.
- */
- FSMClearLocalMap();
-
return buffer;
}
diff --git a/src/backend/access/heap/vacuumlazy.c b/src/backend/access/heap/vacuumlazy.c
index 9cfa65ca47f..37aa484ec3a 100644
--- a/src/backend/access/heap/vacuumlazy.c
+++ b/src/backend/access/heap/vacuumlazy.c
@@ -153,7 +153,7 @@ static BufferAccessStrategy vac_strategy;
static void lazy_scan_heap(Relation onerel, int options,
LVRelStats *vacrelstats, Relation *Irel, int nindexes,
bool aggressive);
-static void lazy_vacuum_heap(Relation onerel, LVRelStats *vacrelstats, BlockNumber nblocks);
+static void lazy_vacuum_heap(Relation onerel, LVRelStats *vacrelstats);
static bool lazy_check_needs_freeze(Buffer buf, bool *hastup);
static void lazy_vacuum_index(Relation indrel,
IndexBulkDeleteResult **stats,
@@ -758,7 +758,7 @@ lazy_scan_heap(Relation onerel, int options, LVRelStats *vacrelstats,
pgstat_progress_update_multi_param(2, hvp_index, hvp_val);
/* Remove tuples from heap */
- lazy_vacuum_heap(onerel, vacrelstats, nblocks);
+ lazy_vacuum_heap(onerel, vacrelstats);
/*
* Forget the now-vacuumed tuples, and press on, but be careful
@@ -896,7 +896,7 @@ lazy_scan_heap(Relation onerel, int options, LVRelStats *vacrelstats,
MarkBufferDirty(buf);
UnlockReleaseBuffer(buf);
- RecordPageWithFreeSpace(onerel, blkno, freespace, nblocks);
+ RecordPageWithFreeSpace(onerel, blkno, freespace);
continue;
}
@@ -935,7 +935,7 @@ lazy_scan_heap(Relation onerel, int options, LVRelStats *vacrelstats,
}
UnlockReleaseBuffer(buf);
- RecordPageWithFreeSpace(onerel, blkno, freespace, nblocks);
+ RecordPageWithFreeSpace(onerel, blkno, freespace);
continue;
}
@@ -1332,7 +1332,7 @@ lazy_scan_heap(Relation onerel, int options, LVRelStats *vacrelstats,
* taken if there are no indexes.)
*/
if (vacrelstats->num_dead_tuples == prev_dead_count)
- RecordPageWithFreeSpace(onerel, blkno, freespace, nblocks);
+ RecordPageWithFreeSpace(onerel, blkno, freespace);
}
/* report that everything is scanned and vacuumed */
@@ -1394,7 +1394,7 @@ lazy_scan_heap(Relation onerel, int options, LVRelStats *vacrelstats,
/* Remove tuples from heap */
pgstat_progress_update_param(PROGRESS_VACUUM_PHASE,
PROGRESS_VACUUM_PHASE_VACUUM_HEAP);
- lazy_vacuum_heap(onerel, vacrelstats, nblocks);
+ lazy_vacuum_heap(onerel, vacrelstats);
vacrelstats->num_index_scans++;
}
@@ -1465,10 +1465,9 @@ lazy_scan_heap(Relation onerel, int options, LVRelStats *vacrelstats,
* Note: the reason for doing this as a second pass is we cannot remove
* the tuples until we've removed their index entries, and we want to
* process index entry removal in batches as large as possible.
- * Note: nblocks is passed as an optimization for RecordPageWithFreeSpace().
*/
static void
-lazy_vacuum_heap(Relation onerel, LVRelStats *vacrelstats, BlockNumber nblocks)
+lazy_vacuum_heap(Relation onerel, LVRelStats *vacrelstats)
{
int tupindex;
int npages;
@@ -1505,7 +1504,7 @@ lazy_vacuum_heap(Relation onerel, LVRelStats *vacrelstats, BlockNumber nblocks)
freespace = PageGetHeapFreeSpace(page);
UnlockReleaseBuffer(buf);
- RecordPageWithFreeSpace(onerel, tblk, freespace, nblocks);
+ RecordPageWithFreeSpace(onerel, tblk, freespace);
npages++;
}
diff --git a/src/backend/access/transam/xact.c b/src/backend/access/transam/xact.c
index 92bda878043..0181976964c 100644
--- a/src/backend/access/transam/xact.c
+++ b/src/backend/access/transam/xact.c
@@ -48,7 +48,6 @@
#include "replication/walsender.h"
#include "storage/condition_variable.h"
#include "storage/fd.h"
-#include "storage/freespace.h"
#include "storage/lmgr.h"
#include "storage/predicate.h"
#include "storage/proc.h"
@@ -2494,12 +2493,6 @@ AbortTransaction(void)
pgstat_report_wait_end();
pgstat_progress_end_command();
- /*
- * In case we aborted during RelationGetBufferForTuple(), clear the local
- * map of heap pages.
- */
- FSMClearLocalMap();
-
/* Clean up buffer I/O and buffer context locks, too */
AbortBufferIO();
UnlockBuffers();
@@ -4721,13 +4714,6 @@ AbortSubTransaction(void)
pgstat_report_wait_end();
pgstat_progress_end_command();
-
- /*
- * In case we aborted during RelationGetBufferForTuple(), clear the local
- * map of heap pages.
- */
- FSMClearLocalMap();
-
AbortBufferIO();
UnlockBuffers();