Hi,
I think I am getting closer:
If I start postgres without background worker, then works following code:
//
https://git.postgresql.org/gitweb/?p=postgresql.git;a=blob;f=src/backend/access/nbtree/nbtxlog.c;h=c536e224321dbc46574aa76876b9d49fa4b5e9a4;hb=REL9_6_10#l549
if (CountDBBackends(InvalidOid) == 0)
return latestRemovedXid;
And it returns from the btree_xlog_delete_get_latestRemovedXid function.
In case if we have a background worker, then
CountDBBackends(InvalidOid) = 1 and as a result it aborts.
Comment before if statement clearly tells about possible race condition:
/*
* If there's nothing running on the standby we don't need to derive a
* full latestRemovedXid value, so use a fast path out of here. This
* returns InvalidTransactionId, and so will conflict with all HS
* transactions; but since we just worked out that that's zero people,
* it's OK.
*
* XXX There is a race condition here, which is that a new backend might
* start just after we look. If so, it cannot need to
conflict, but this
* coding will result in throwing a conflict anyway.
*/
Regards,
--
Alexander Kukushkin