collect_corrupt_items_vacuum.patch
text/x-diff
Filename: collect_corrupt_items_vacuum.patch
Type: text/x-diff
Part: 0
Message:
collect_corrupt_items_vacuum.patch
Patch
Format: unified
| File | + | − |
|---|---|---|
| contrib/pg_visibility/pg_visibility.c | 13 | 0 |
diff --git a/contrib/pg_visibility/pg_visibility.c b/contrib/pg_visibility/pg_visibility.c index 53aaf61cb94..700ebeaa018 100644 --- a/contrib/pg_visibility/pg_visibility.c +++ b/contrib/pg_visibility/pg_visibility.c @@ -18,6 +18,7 @@ #include "funcapi.h" #include "miscadmin.h" #include "storage/bufmgr.h" +#include "storage/proc.h" #include "storage/procarray.h" #include "storage/smgr.h" #include "utils/rel.h" @@ -562,12 +563,19 @@ collect_corrupt_items(Oid relid, bool all_visible, bool all_frozen) Buffer vmbuffer = InvalidBuffer; BufferAccessStrategy bstrategy = GetAccessStrategy(BAS_BULKREAD); TransactionId OldestXmin = InvalidTransactionId; + uint8 oldStatusFlags; rel = relation_open(relid, AccessShareLock); /* Only some relkinds have a visibility map */ check_relation_relkind(rel); + LWLockAcquire(ProcArrayLock, LW_EXCLUSIVE); + oldStatusFlags = MyProc->statusFlags; + MyProc->statusFlags |= PROC_IN_VACUUM; + ProcGlobal->statusFlags[MyProc->pgxactoff] = MyProc->statusFlags; + LWLockRelease(ProcArrayLock); + if (all_visible) OldestXmin = GetOldestNonRemovableTransactionId(rel); @@ -722,6 +730,11 @@ collect_corrupt_items(Oid relid, bool all_visible, bool all_frozen) items->count = items->next; items->next = 0; + LWLockAcquire(ProcArrayLock, LW_EXCLUSIVE); + MyProc->statusFlags = oldStatusFlags; + ProcGlobal->statusFlags[MyProc->pgxactoff] = MyProc->statusFlags; + LWLockRelease(ProcArrayLock); + return items; }