BlockNumber pages_removed; /* pages remove by truncation */
BlockNumber lpdead_item_pages; /* # pages with LP_DEAD items */
BlockNumber nonempty_pages; /* actually, last nonempty page + 1 */
- bool lock_waiter_detected;
/* Statistics output by us, for table */
double new_rel_tuples; /* new estimated total # of tuples */
static bool should_attempt_truncation(LVRelState *vacrel,
VacuumParams *params);
static void lazy_truncate_heap(LVRelState *vacrel);
-static BlockNumber count_nondeletable_pages(LVRelState *vacrel);
+static BlockNumber count_nondeletable_pages(LVRelState *vacrel,
+ bool *lock_waiter_detected);
static long compute_max_dead_tuples(BlockNumber relblocks, bool hasindex);
static void lazy_space_alloc(LVRelState *vacrel, int nworkers,
BlockNumber relblocks);
vacrel->pages_removed = 0;
vacrel->lpdead_item_pages = 0;
vacrel->nonempty_pages = 0;
- vacrel->lock_waiter_detected = false;
/* Initialize instrumentation counters */
vacrel->num_index_scans = 0;
{
BlockNumber old_rel_pages = vacrel->rel_pages;
BlockNumber new_rel_pages;
+ bool lock_waiter_detected;
int lock_retry;
/* Report that we are now truncating */
* (which is quite possible considering we already hold a lower-grade
* lock).
*/
- vacrel->lock_waiter_detected = false;
+ lock_waiter_detected = false;
lock_retry = 0;
while (true)
{
* We failed to establish the lock in the specified number of
* retries. This means we give up truncating.
*/
- vacrel->lock_waiter_detected = true;
+ lock_waiter_detected = true;
ereport(elevel,
(errmsg("\"%s\": stopping truncate due to conflicting lock request",
vacrel->relname)));
* other backends could have added tuples to these pages whilst we
* were vacuuming.
*/
- new_rel_pages = count_nondeletable_pages(vacrel);
+ new_rel_pages = count_nondeletable_pages(vacrel, &lock_waiter_detected);
vacrel->blkno = new_rel_pages;
if (new_rel_pages >= old_rel_pages)
errdetail_internal("%s",
pg_rusage_show(&ru0))));
old_rel_pages = new_rel_pages;
- } while (new_rel_pages > vacrel->nonempty_pages &&
- vacrel->lock_waiter_detected);
+ } while (new_rel_pages > vacrel->nonempty_pages && lock_waiter_detected);
}
/*
* Returns number of nondeletable pages (last nonempty page + 1).
*/
static BlockNumber
-count_nondeletable_pages(LVRelState *vacrel)
+count_nondeletable_pages(LVRelState *vacrel, bool *lock_waiter_detected)
{
BlockNumber blkno;
BlockNumber prefetchedUntil;
(errmsg("\"%s\": suspending truncate due to conflicting lock request",
vacrel->relname)));
- vacrel->lock_waiter_detected = true;
+ *lock_waiter_detected = true;
return blkno;
}
starttime = currenttime;