Just a note here. After examining the core dump I did notice something.
While in XidInMVCCSnapshot call the snapshot->suboverflowed is set true
although subxip == NULL and subxcnt == 0. As far as I understand,
snapshot->suboverflowed is set true in the GetRunningTransactionData
call.
And then I decided to put elog around CurrentRunningXacts->subxcnt's
assigment.
diff --git a/src/backend/storage/ipc/procarray.c
b/src/backend/storage/ipc/procarray.c
index 42a89fc5dc9..3d2db02f580 100644
--- a/src/backend/storage/ipc/procarray.c
+++ b/src/backend/storage/ipc/procarray.c
@@ -2781,6 +2781,9 @@ GetRunningTransactionData(void)
* increases if slots do.
*/
+ if (suboverflowed)
+ elog(WARNING, " >>> CurrentRunningXacts->subxid_overflow
is true");
+
CurrentRunningXacts->xcnt = count - subcount;
CurrentRunningXacts->subxcnt = subcount;
CurrentRunningXacts->subxid_overflow = suboverflowed;
... and did get a bunch of messages. I.e. subxid_overflow is set true
very often.
I've increased the value of PGPROC_MAX_CACHED_SUBXIDS. Once it becomes
more than 120 there are no messages and no failed assertions are
provided any more.
---
Best regards,
Maxim Orlov.