autovac_truncate.patch
text/x-patch
Filename: autovac_truncate.patch
Type: text/x-patch
Part: 0
Message:
(auto)vacuum truncate exclusive lock
Patch
Format: unified
| File | + | − |
|---|---|---|
| src/backend/commands/vacuumlazy.c | 0 | 0 |
diff --git a/src/backend/commands/vacuumlazy.c b/src/backend/commands/vacuumlazy.c
new file mode 100644
index 0401b7f..fda2656
*** a/src/backend/commands/vacuumlazy.c
--- b/src/backend/commands/vacuumlazy.c
***************
*** 75,83 ****
* that the potential for improvement was great enough to merit the cost of
* supporting them.
*/
! #define AUTOVACUUM_TRUNCATE_LOCK_CHECK_INTERVAL 20 /* ms */
! #define AUTOVACUUM_TRUNCATE_LOCK_WAIT_INTERVAL 50 /* ms */
! #define AUTOVACUUM_TRUNCATE_LOCK_TIMEOUT 5000 /* ms */
/*
* Guesstimation of number of dead tuples per page. This is used to
--- 75,83 ----
* that the potential for improvement was great enough to merit the cost of
* supporting them.
*/
! #define VACUUM_TRUNCATE_LOCK_CHECK_INTERVAL 20 /* ms */
! #define VACUUM_TRUNCATE_LOCK_WAIT_INTERVAL 50 /* ms */
! #define VACUUM_TRUNCATE_LOCK_TIMEOUT 5000 /* ms */
/*
* Guesstimation of number of dead tuples per page. This is used to
*************** lazy_truncate_heap(Relation onerel, LVRe
*** 1306,1313 ****
*/
CHECK_FOR_INTERRUPTS();
! if (++lock_retry > (AUTOVACUUM_TRUNCATE_LOCK_TIMEOUT /
! AUTOVACUUM_TRUNCATE_LOCK_WAIT_INTERVAL))
{
/*
* We failed to establish the lock in the specified number of
--- 1306,1313 ----
*/
CHECK_FOR_INTERRUPTS();
! if (++lock_retry > (VACUUM_TRUNCATE_LOCK_TIMEOUT /
! VACUUM_TRUNCATE_LOCK_WAIT_INTERVAL))
{
/*
* We failed to establish the lock in the specified number of
*************** lazy_truncate_heap(Relation onerel, LVRe
*** 1318,1333 ****
*/
vacrelstats->lock_waiter_detected = true;
ereport(LOG,
! (errmsg("automatic vacuum of table \"%s.%s.%s\": "
"could not (re)acquire exclusive "
! "lock for truncate scan",
get_database_name(MyDatabaseId),
get_namespace_name(RelationGetNamespace(onerel)),
! RelationGetRelationName(onerel))));
return;
}
! pg_usleep(AUTOVACUUM_TRUNCATE_LOCK_WAIT_INTERVAL);
}
/*
--- 1318,1334 ----
*/
vacrelstats->lock_waiter_detected = true;
ereport(LOG,
! (errmsg("vacuum of table \"%s.%s.%s\": "
"could not (re)acquire exclusive "
! "lock for truncate scan (%d pages already truncated)",
get_database_name(MyDatabaseId),
get_namespace_name(RelationGetNamespace(onerel)),
! RelationGetRelationName(onerel),
! vacrelstats->pages_removed)));
return;
}
! pg_usleep(VACUUM_TRUNCATE_LOCK_WAIT_INTERVAL);
}
/*
*************** count_nondeletable_pages(Relation onerel
*** 1437,1443 ****
elapsed = currenttime;
INSTR_TIME_SUBTRACT(elapsed, starttime);
if ((INSTR_TIME_GET_MICROSEC(elapsed) / 1000)
! >= AUTOVACUUM_TRUNCATE_LOCK_CHECK_INTERVAL)
{
if (LockHasWaitersRelation(onerel, AccessExclusiveLock))
{
--- 1438,1444 ----
elapsed = currenttime;
INSTR_TIME_SUBTRACT(elapsed, starttime);
if ((INSTR_TIME_GET_MICROSEC(elapsed) / 1000)
! >= VACUUM_TRUNCATE_LOCK_CHECK_INTERVAL)
{
if (LockHasWaitersRelation(onerel, AccessExclusiveLock))
{