>> Having CheckPointTwoPhase() do the flush would mean shifting the data >> from KnownPreparedList into TwoPhaseState shmem. > > Er, no. For CheckPointTwoPhase(), at recovery what needs to be done is > to have all the entries in KnownPreparedList() flushed to disk and > have those entries removed while holding a shared memory lock.
The KnownPreparedList is constructed by the recovery process. CheckPointTwoPhase() gets called by the checkpointer process. The checkpointer does not have access to this valid KnownPreparedList. >And for > the rest we need to be careful to have PrescanPreparedTransactions, > RecoverPreparedTransactions and StandbyRecoverPreparedTransactions > aware of entries that are in KnownPreparedList(). Yeah, that part is straightforward. It does involve duplication of the earlier while loops to work against KnownPreparedList. A smart single while loop which loops over the 2PC files followed by the list would help here :-) > Let's leave the > business of putting the information from KnownPreparedList to > TwoPhaseState in RecoverPreparedTransactions, which need to be aware > of entries in KnownPreparedList() anyway. The only thing that differs > is how the 2PC information is fetched: from the segments or from the > files in pg_twophase. > Yeah. This part is also ok. We also got to be careful to mark the shmem gxact entry with "ondisk = false" and need to set prepare_start_lsn/prepare_end_lsn properly as well. >> I wonder what's the best location for this in the common case when we >> do shutdown of standby. We could add code in XLOG_CHECKPOINT_SHUTDOWN >> and XLOG_CHECKPOINT_ONLINE xlog_redo code path. > > ShutdownXLOG() calls CreateRestartPoint() when a standby shuts down, > so doing all the durability work in CheckPointTwoPhase() would take > care of any problems. > ShutdownXLOG() gets called from the checkpointer process. See comments above about the checkpointer not having access to the proper KnownPreparedList. The following test sequence will trigger the issue: 1) start master 2) start replica 3) prepare a transaction on master 4) shutdown master 5) shutdown replica CheckPointTwoPhase() in (5) does not sync this prepared transaction because the checkpointer's KnownPreparedList is empty. Regards, Nikhils -- Nikhil Sontakke http://www.2ndQuadrant.com/ PostgreSQL Development, 24x7 Support, Training & Services -- Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-hackers