On Mon, Nov 20, 2023 at 4:28 PM Amit Kapila <amit.kapil...@gmail.com> wrote: > > 9. > +synchronize_one_slot(WalReceiverConn *wrconn, RemoteSlot *remote_slot, > + bool *slot_updated) > { > ... > + else > + { > + TransactionId xmin_horizon = InvalidTransactionId; > + ReplicationSlot *slot; > + > + ReplicationSlotCreate(remote_slot->name, true, RS_EPHEMERAL, > + remote_slot->two_phase, false); > + slot = MyReplicationSlot; > + > + SpinLockAcquire(&slot->mutex); > + slot->data.database = get_database_oid(remote_slot->database, false); > + > + /* Mark it as sync initiated by slot-sync worker */ > + slot->data.sync_state = SYNCSLOT_STATE_INITIATED; > + slot->data.failover = true; > + > + namestrcpy(&slot->data.plugin, remote_slot->plugin); > + SpinLockRelease(&slot->mutex); > + > + ReplicationSlotReserveWal(); > + > > How and when will this init state (SYNCSLOT_STATE_INITIATED) persist to disk? >
On closer inspection, I see that it is done inside wait_for_primary_and_sync() when it fails to sync. I think it is better to refactor the code a bit and persist it in synchronize_one_slot() to make the code flow easier to understand. -- With Regards, Amit Kapila.