v3-0001-PG14-Fix-parallel-worker-failed-assertion-and-coredump.patch
text/x-diff
Filename: v3-0001-PG14-Fix-parallel-worker-failed-assertion-and-coredump.patch
Type: text/x-diff
Part: 0
Patch
Format: unified
Series: patch v3-0001
| File | + | − |
|---|---|---|
| src/backend/access/transam/subtrans.c | 16 | 0 |
diff --git a/src/backend/access/transam/subtrans.c b/src/backend/access/transam/subtrans.c
index 6a8e521f894..ce7c90aa38f 100644
--- a/src/backend/access/transam/subtrans.c
+++ b/src/backend/access/transam/subtrans.c
@@ -29,6 +29,7 @@
#include "postgres.h"
#include "access/slru.h"
+#include "access/parallel.h"
#include "access/subtrans.h"
#include "access/transam.h"
#include "pg_trace.h"
@@ -152,6 +153,21 @@ SubTransGetTopmostTransaction(TransactionId xid)
TransactionId parentXid = xid,
previousXid = xid;
+ /*
+ * We may have different xmins in active and transaction snapshots in
+ * parallel workers. And TransactionXmin can be promoted to the max of them.
+ * So, we do this to avoid assert below when restore active snapshot with
+ * less xmin value.
+ *
+ * XXX: the same may be fixed by prohibiting read-only transactions (like
+ * parallel scans) to increment TransactionXmin.
+ */
+ if (IsParallelWorker())
+ {
+ xid = xid > TransactionXmin ? xid : TransactionXmin;
+ parentXid = xid;
+ previousXid = xid;
+ }
/* Can't ask about stuff that might not be around anymore */
Assert(TransactionIdFollowsOrEquals(xid, TransactionXmin));