diff options
author | Amit Kapila <akapila@postgresql.org> | 2019-01-28 11:31:44 +0530 |
---|---|---|
committer | Amit Kapila <akapila@postgresql.org> | 2019-01-28 11:31:44 +0530 |
commit | a23676503b746b7f1588cd2ab0c60411032d32da (patch) | |
tree | ac7f172ec94771441558639e0725e6d56d6e7b47 /src/backend/access | |
parent | ac88d2962a96a9c7e83d5acfc28fe49a72812086 (diff) | |
download | postgresql-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.c | 2 | ||||
-rw-r--r-- | src/backend/access/brin/brin_pageops.c | 10 | ||||
-rw-r--r-- | src/backend/access/heap/hio.c | 47 | ||||
-rw-r--r-- | src/backend/access/heap/vacuumlazy.c | 17 | ||||
-rw-r--r-- | src/backend/access/transam/xact.c | 14 |
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(); |