From: | Greg Nancarrow <gregn4422(at)gmail(dot)com> |
---|---|
To: | 刘鹏程 <pengchengliu(at)tju(dot)edu(dot)cn> |
Cc: | Andres Freund <andres(at)anarazel(dot)de>, PostgreSQL-development <pgsql-hackers(at)postgresql(dot)org> |
Subject: | Re: Re: Parallel scan with SubTransGetTopmostTransaction assert coredump |
Date: | 2021-05-17 12:58:41 |
Message-ID: | CAJcOf-eDcGVUx0+HjeYzj73AK+x2OOLEQLcfPn4ThEG9pwZpSw@mail.gmail.com |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-hackers |
On Sat, May 15, 2021 at 12:37 PM 刘鹏程 <pengchengliu(at)tju(dot)edu(dot)cn> wrote:
>
>
> BTW, I test it in a high performance server. It is verly easily be reproduced. My colleague and me use different environment both can reproduce it.
>
Hi Pengcheng,
Although the issue won't reproduce easily in my system, I can
certainly see how, for the snapshots used in the parallel worker case,
the Active snapshot used is potentially an earlier snapshot that the
Transaction snapshot. I don't know why it is getting a newer
Transaction snapshot in InitializeParallelDSM(), when it has
previously pushed the return value of GetTransactionSnapshot() as the
Active snapshot.
So I too hope Tom or Robert can explain what is going on here and how
to resolve it (as you requested them to, in your other post).
I actually think that the Assert in SubTransGetTopmostTransaction() is
correct, but in the parallel-worker case, the snapshots are not being
setup correctly.
Can you try the trivial change below and see if it prevents the coredump?
Regards,
Greg Nancarrow
Fujitsu Australia
diff --git a/src/backend/access/transam/parallel.c
b/src/backend/access/transam/parallel.c
index 14a8690019..870889053f 100644
--- a/src/backend/access/transam/parallel.c
+++ b/src/backend/access/transam/parallel.c
@@ -216,7 +216,7 @@ InitializeParallelDSM(ParallelContext *pcxt)
int i;
FixedParallelState *fps;
dsm_handle session_dsm_handle = DSM_HANDLE_INVALID;
- Snapshot transaction_snapshot = GetTransactionSnapshot();
+ Snapshot transaction_snapshot = GetActiveSnapshot();
Snapshot active_snapshot = GetActiveSnapshot();
/* We might be running in a very short-lived memory context. */
From | Date | Subject | |
---|---|---|---|
Next Message | Amit Langote | 2021-05-17 13:30:47 | Re: Skip partition tuple routing with constant partition key |
Previous Message | Andrew Dunstan | 2021-05-17 12:55:19 | Re: Winflex docs and distro |