diff --git a/src/backend/access/gin/ginfast.c b/src/backend/access/gin/ginfast.c index 853553853a5..55b4c0af0f5 100644 --- a/src/backend/access/gin/ginfast.c +++ b/src/backend/access/gin/ginfast.c @@ -895,8 +895,6 @@ ginInsertCleanup(GinState *ginstate, bool must_empty_list, */ processPendingPage(&accum, &datums, page, FirstOffsetNumber); - vacuum_delay_point(); - /* * Is it time to flush memory to disk? Flush if we are at the end of * the pending list, or if we have a full row and memory is getting @@ -1002,10 +1000,12 @@ ginInsertCleanup(GinState *ginstate, bool must_empty_list, UnlockReleaseBuffer(buffer); } + /* call vacuum_delay_point while not holding any buffer lock */ + vacuum_delay_point(); + /* * Read next page in pending list */ - vacuum_delay_point(); buffer = ReadBuffer(index, blkno); LockBuffer(buffer, GIN_SHARE); page = BufferGetPage(buffer); diff --git a/src/backend/access/hash/hash.c b/src/backend/access/hash/hash.c index 01d06b7c328..14f4da546f7 100644 --- a/src/backend/access/hash/hash.c +++ b/src/backend/access/hash/hash.c @@ -503,6 +503,9 @@ loop_top: Page page; bool split_cleanup = false; + /* call vacuum_delay_point while not holding any buffer lock */ + vacuum_delay_point(); + /* Get address of bucket's start page */ bucket_blkno = BUCKET_TO_BLKNO(cachedmetap, cur_bucket); @@ -716,8 +719,6 @@ hashbucketcleanup(Relation rel, Bucket cur_bucket, Buffer bucket_buf, bool retain_pin = false; bool clear_dead_marking = false; - vacuum_delay_point(); - page = BufferGetPage(buf); opaque = HashPageGetOpaque(page); diff --git a/src/backend/commands/analyze.c b/src/backend/commands/analyze.c index c590a2adc35..9e2d56e7abf 100644 --- a/src/backend/commands/analyze.c +++ b/src/backend/commands/analyze.c @@ -1207,8 +1207,6 @@ acquire_sample_rows(Relation onerel, int elevel, /* Outer loop over blocks to sample */ while (table_scan_analyze_next_block(scan, stream)) { - vacuum_delay_point(); - while (table_scan_analyze_next_tuple(scan, OldestXmin, &liverows, &deadrows, slot)) { /* @@ -1256,6 +1254,7 @@ acquire_sample_rows(Relation onerel, int elevel, pgstat_progress_update_param(PROGRESS_ANALYZE_BLOCKS_DONE, ++blksdone); + vacuum_delay_point(); } read_stream_end(stream); diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index b6c4216d428..60da5aa859d 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -2391,6 +2391,14 @@ vacuum_delay_point(void) { double msec = 0; + /* + * If we're holding locks or holding interrupts for some other reason, + * don't sleep, because we don't want to hold locks any longer than + * necessary. + */ + if (!INTERRUPTS_CAN_BE_PROCESSED()) + return; + /* Always check for interrupts */ CHECK_FOR_INTERRUPTS();