On 2020/09/08 13:11, Andres Freund wrote:
Hi,
On 2020-09-08 13:03:01 +0900, Ian Barwick wrote:
(...)
I wonder if it's possible to increment "xactCompletionCount"
during replay along these lines:
*** a/src/backend/access/transam/xact.c
--- b/src/backend/access/transam/xact.c
*************** xact_redo_commit(xl_xact_parsed_commit *
*** 5915,5920 ****
--- 5915,5924 ----
*/
if (XactCompletionApplyFeedback(parsed->xinfo))
XLogRequestWalReceiverReply();
+
+ LWLockAcquire(ProcArrayLock, LW_EXCLUSIVE);
+ ShmemVariableCache->xactCompletionCount++;
+ LWLockRelease(ProcArrayLock);
}
which seems to work (though quite possibly I've overlooked something I don't
know that I don't know about and it will all break horribly somewhere,
etc. etc.).
We'd also need the same in a few more places. Probably worth looking at
the list where we increment it on the primary (particularly we need to
also increment it for aborts, and 2pc commit/aborts).
Yup.
At first I was very confused as to why none of the existing tests have
found this significant issue. But after thinking about it for a minute
that's because they all use psql, and largely separate psql invocations
for each query :(. Which means that there's no cached snapshot around...
Do you want to try to write a patch?
Sure, I'll give it a go as I have some time right now.
Regards
Ian Barwick
--
Ian Barwick https://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Training & Services