Repurpose PROC_COPYABLE_FLAGS as PROC_XMIN_FLAGS
authorAlvaro Herrera <alvherre@alvh.no-ip.org>
Thu, 19 May 2022 14:20:32 +0000 (16:20 +0200)
committerAlvaro Herrera <alvherre@alvh.no-ip.org>
Thu, 19 May 2022 14:20:32 +0000 (16:20 +0200)
This is a slight, convenient semantics change from what commit
0f0cfb494004 ("Fix parallel operations that prevent oldest xmin from
advancing") introduced that lets us simplify the coding in the one place
where it is used.

Backpatch to 13.  This is related to commit 6fea65508a1a ("Tighten
ComputeXidHorizons' handling of walsenders") rewriting the code site
where this is used, which has not yet been backpatched, but it may well
be in the future.

Reviewed-by: Masahiko Sawada <sawada.mshk@gmail.com>
Discussion: https://postgr.es/m/202204191637.eldwa2exvguw@alvherre.pgsql

src/backend/storage/ipc/procarray.c
src/include/storage/proc.h

index ca22336e35d5672a46203ae9ae06b1c1ca2dedc9..cd58c5faf02965c0ce1823c40e9008e6cab1a180 100644 (file)
@@ -2685,17 +2685,14 @@ ProcArrayInstallRestoredXmin(TransactionId xmin, PGPROC *proc)
                TransactionIdIsNormal(xid) &&
                TransactionIdPrecedesOrEquals(xid, xmin))
        {
-               /* Install xmin */
+               /*
+                * Install xmin and propagate the statusFlags that affect how the
+                * value is interpreted by vacuum.
+                */
                MyProc->xmin = TransactionXmin = xmin;
-
-               /* walsender cheats by passing proc == MyProc, don't check its flags */
-               if (proc != MyProc)
-               {
-                       /* Flags being copied must be valid copy-able flags. */
-                       Assert((proc->statusFlags & (~PROC_COPYABLE_FLAGS)) == 0);
-                       MyProc->statusFlags = proc->statusFlags;
-                       ProcGlobal->statusFlags[MyProc->pgxactoff] = MyProc->statusFlags;
-               }
+               MyProc->statusFlags = (MyProc->statusFlags & ~PROC_XMIN_FLAGS) |
+                       (proc->statusFlags & PROC_XMIN_FLAGS);
+               ProcGlobal->statusFlags[MyProc->pgxactoff] = MyProc->statusFlags;
 
                result = true;
        }
index 15be21c00a6edc872e2106e452e400cd934e3b30..2579e619ebcdd7d72e10218cd4fab1b4ead35a58 100644 (file)
@@ -69,11 +69,10 @@ struct XidCache
        (PROC_IN_VACUUM | PROC_IN_SAFE_IC | PROC_VACUUM_FOR_WRAPAROUND)
 
 /*
- * Flags that are valid to copy from another proc, the parallel leader
- * process in practice.  Currently, flags that are set during parallel
- * vacuum and parallel index creation are allowed.
+ * Xmin-related flags. Make sure any flags that affect how the process' Xmin
+ * value is interpreted by VACUUM are included here.
  */
-#define                PROC_COPYABLE_FLAGS (PROC_IN_VACUUM | PROC_IN_SAFE_IC)
+#define                PROC_XMIN_FLAGS (PROC_IN_VACUUM | PROC_IN_SAFE_IC)
 
 /*
  * We allow a small number of "weak" relation locks (AccessShareLock,