Simon Riggs wrote:
The idea outlined before didn't deal with all call points for
RecordIsCleanupRecord(), so doesn't actually work.

Hmm, grep finds two call points for that:

!                       case RECOVERY_TARGET_PAUSE_CLEANUP:
!                                       /*
!                                        * Advance until we see a cleanup 
record, then pause.
!                                        */
!                                       if (RecordIsCleanupRecord(record))
!                                               pauseHere = true;
!                                       break;
!


and

+                                       /*
+                                        * Wait, kill or otherwise resolve any 
conflicts between
+                                        * incoming cleanup records and user 
queries. This is the
+ * main barrier that allows MVCC to work correctly when + * running standby servers. Only need to do this if there
+                                        * is a possibility that users may be 
active.
+                                        */
+                                       if (reachedSafeStartPoint && 
RecordIsCleanupRecord(record))
+                                               
ResolveRedoVisibilityConflicts(EndRecPtr, record);

The second we can easily handle by getting rid of ResolveRedoVisibilityConflicts functions and making the redo-functions call XactResolveRecoveryConflicts when necessary.

Is the first really useful? I would understand "advance until next cleanup record *that would block/kill queries*", but why would you want to advance until the next cleanup record? Anyway, if it is useful, you could do the pausing in XactResolveRecoveryConflicts, too.

--
  Heikki Linnakangas
  EnterpriseDB   http://www.enterprisedb.com

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

Reply via email to