@ -89,7 +89,7 @@ typedef struct ReplicationSlotOnDisk
sizeof ( ReplicationSlotOnDisk ) - ReplicationSlotOnDiskConstantSize
sizeof ( ReplicationSlotOnDisk ) - ReplicationSlotOnDiskConstantSize
# define SLOT_MAGIC 0x1051CA1 /* format identifier */
# define SLOT_MAGIC 0x1051CA1 /* format identifier */
# define SLOT_VERSION 2 /* version for new files */
# define SLOT_VERSION 3 /* version for new files */
/* Control array for replication slot management */
/* Control array for replication slot management */
ReplicationSlotCtlData * ReplicationSlotCtl = NULL ;
ReplicationSlotCtlData * ReplicationSlotCtl = NULL ;
@ -855,8 +855,7 @@ ReplicationSlotsComputeRequiredXmin(bool already_locked)
SpinLockAcquire ( & s - > mutex ) ;
SpinLockAcquire ( & s - > mutex ) ;
effective_xmin = s - > effective_xmin ;
effective_xmin = s - > effective_xmin ;
effective_catalog_xmin = s - > effective_catalog_xmin ;
effective_catalog_xmin = s - > effective_catalog_xmin ;
invalidated = ( ! XLogRecPtrIsInvalid ( s - > data . invalidated_at ) & &
invalidated = s - > data . invalidated ! = RS_INVAL_NONE ;
XLogRecPtrIsInvalid ( s - > data . restart_lsn ) ) ;
SpinLockRelease ( & s - > mutex ) ;
SpinLockRelease ( & s - > mutex ) ;
/* invalidated slots need not apply */
/* invalidated slots need not apply */
@ -901,14 +900,20 @@ ReplicationSlotsComputeRequiredLSN(void)
{
{
ReplicationSlot * s = & ReplicationSlotCtl - > replication_slots [ i ] ;
ReplicationSlot * s = & ReplicationSlotCtl - > replication_slots [ i ] ;
XLogRecPtr restart_lsn ;
XLogRecPtr restart_lsn ;
bool invalidated ;
if ( ! s - > in_use )
if ( ! s - > in_use )
continue ;
continue ;
SpinLockAcquire ( & s - > mutex ) ;
SpinLockAcquire ( & s - > mutex ) ;
restart_lsn = s - > data . restart_lsn ;
restart_lsn = s - > data . restart_lsn ;
invalidated = s - > data . invalidated ! = RS_INVAL_NONE ;
SpinLockRelease ( & s - > mutex ) ;
SpinLockRelease ( & s - > mutex ) ;
/* invalidated slots need not apply */
if ( invalidated )
continue ;
if ( restart_lsn ! = InvalidXLogRecPtr & &
if ( restart_lsn ! = InvalidXLogRecPtr & &
( min_required = = InvalidXLogRecPtr | |
( min_required = = InvalidXLogRecPtr | |
restart_lsn < min_required ) )
restart_lsn < min_required ) )
@ -946,6 +951,7 @@ ReplicationSlotsComputeLogicalRestartLSN(void)
{
{
ReplicationSlot * s ;
ReplicationSlot * s ;
XLogRecPtr restart_lsn ;
XLogRecPtr restart_lsn ;
bool invalidated ;
s = & ReplicationSlotCtl - > replication_slots [ i ] ;
s = & ReplicationSlotCtl - > replication_slots [ i ] ;
@ -960,8 +966,13 @@ ReplicationSlotsComputeLogicalRestartLSN(void)
/* read once, it's ok if it increases while we're checking */
/* read once, it's ok if it increases while we're checking */
SpinLockAcquire ( & s - > mutex ) ;
SpinLockAcquire ( & s - > mutex ) ;
restart_lsn = s - > data . restart_lsn ;
restart_lsn = s - > data . restart_lsn ;
invalidated = s - > data . invalidated ! = RS_INVAL_NONE ;
SpinLockRelease ( & s - > mutex ) ;
SpinLockRelease ( & s - > mutex ) ;
/* invalidated slots need not apply */
if ( invalidated )
continue ;
if ( restart_lsn = = InvalidXLogRecPtr )
if ( restart_lsn = = InvalidXLogRecPtr )
continue ;
continue ;
@ -1012,6 +1023,8 @@ ReplicationSlotsCountDBSlots(Oid dboid, int *nslots, int *nactive)
if ( s - > data . database ! = dboid )
if ( s - > data . database ! = dboid )
continue ;
continue ;
/* NB: intentionally counting invalidated slots */
/* count slots with spinlock held */
/* count slots with spinlock held */
SpinLockAcquire ( & s - > mutex ) ;
SpinLockAcquire ( & s - > mutex ) ;
( * nslots ) + + ;
( * nslots ) + + ;
@ -1069,6 +1082,8 @@ restart:
if ( s - > data . database ! = dboid )
if ( s - > data . database ! = dboid )
continue ;
continue ;
/* NB: intentionally including invalidated slots */
/* acquire slot, so ReplicationSlotDropAcquired can be reused */
/* acquire slot, so ReplicationSlotDropAcquired can be reused */
SpinLockAcquire ( & s - > mutex ) ;
SpinLockAcquire ( & s - > mutex ) ;
/* can't change while ReplicationSlotControlLock is held */
/* can't change while ReplicationSlotControlLock is held */
@ -1294,7 +1309,12 @@ InvalidatePossiblyObsoleteSlot(ReplicationSlot *s, XLogRecPtr oldestLSN,
{
{
MyReplicationSlot = s ;
MyReplicationSlot = s ;
s - > active_pid = MyProcPid ;
s - > active_pid = MyProcPid ;
s - > data . invalidated_at = restart_lsn ;
s - > data . invalidated = RS_INVAL_WAL_REMOVED ;
/*
* XXX : We should consider not overwriting restart_lsn and instead
* just rely on . invalidated .
*/
s - > data . restart_lsn = InvalidXLogRecPtr ;
s - > data . restart_lsn = InvalidXLogRecPtr ;
/* Let caller know */
/* Let caller know */