@ -95,7 +95,6 @@ int recovery_min_apply_delay = 0;
/* options formerly taken from recovery.conf for XLOG streaming */
/* options formerly taken from recovery.conf for XLOG streaming */
char * PrimaryConnInfo = NULL ;
char * PrimaryConnInfo = NULL ;
char * PrimarySlotName = NULL ;
char * PrimarySlotName = NULL ;
char * PromoteTriggerFile = NULL ;
bool wal_receiver_create_temp_slot = false ;
bool wal_receiver_create_temp_slot = false ;
/*
/*
@ -318,8 +317,8 @@ typedef struct XLogRecoveryCtlData
/*
/*
* recoveryWakeupLatch is used to wake up the startup process to continue
* recoveryWakeupLatch is used to wake up the startup process to continue
* WAL replay , if it is waiting for WAL to arrive or failover trigger fil e
* WAL replay , if it is waiting for WAL to arrive or promotion to b e
* to appear .
* requested .
*
*
* Note that the startup process also uses another latch , its procLatch ,
* Note that the startup process also uses another latch , its procLatch ,
* to wait for recovery conflict . If we get rid of recoveryWakeupLatch for
* to wait for recovery conflict . If we get rid of recoveryWakeupLatch for
@ -2906,10 +2905,7 @@ recoveryApplyDelay(XLogReaderState *record)
{
{
ResetLatch ( & XLogRecoveryCtl - > recoveryWakeupLatch ) ;
ResetLatch ( & XLogRecoveryCtl - > recoveryWakeupLatch ) ;
/*
/* This might change recovery_min_apply_delay. */
* This might change recovery_min_apply_delay or the trigger file ' s
* location .
*/
HandleStartupProcInterrupts ( ) ;
HandleStartupProcInterrupts ( ) ;
if ( CheckForStandbyTrigger ( ) )
if ( CheckForStandbyTrigger ( ) )
@ -3155,8 +3151,8 @@ ReadRecord(XLogPrefetcher *xlogprefetcher, int emode,
* as for waiting for the requested WAL record to arrive in standby mode .
* as for waiting for the requested WAL record to arrive in standby mode .
*
*
* ' emode ' specifies the log level used for reporting " file not found " or
* ' emode ' specifies the log level used for reporting " file not found " or
* " end of WAL " situations in archive recovery , or in standby mode when a
* " end of WAL " situations in archive recovery , or in standby mode when
* trigger file is foun d. If set to WARNING or below , XLogPageRead ( ) returns
* promotion is triggere d. If set to WARNING or below , XLogPageRead ( ) returns
* XLREAD_FAIL in those situations , on higher log levels the ereport ( ) won ' t
* XLREAD_FAIL in those situations , on higher log levels the ereport ( ) won ' t
* return .
* return .
*
*
@ -3424,7 +3420,7 @@ WaitForWALToBecomeAvailable(XLogRecPtr RecPtr, bool randAccess,
*
*
* 1. Read from either archive or pg_wal ( XLOG_FROM_ARCHIVE ) , or just
* 1. Read from either archive or pg_wal ( XLOG_FROM_ARCHIVE ) , or just
* pg_wal ( XLOG_FROM_PG_WAL )
* pg_wal ( XLOG_FROM_PG_WAL )
* 2. Check trigger file
* 2. Check for promotion trigger request
* 3. Read from primary server via walreceiver ( XLOG_FROM_STREAM )
* 3. Read from primary server via walreceiver ( XLOG_FROM_STREAM )
* 4. Rescan timelines
* 4. Rescan timelines
* 5. Sleep wal_retrieve_retry_interval milliseconds , and loop back to 1.
* 5. Sleep wal_retrieve_retry_interval milliseconds , and loop back to 1.
@ -3481,10 +3477,10 @@ WaitForWALToBecomeAvailable(XLogRecPtr RecPtr, bool randAccess,
case XLOG_FROM_PG_WAL :
case XLOG_FROM_PG_WAL :
/*
/*
* Check to see if the trigger file exists . Note that we
* Check to see if promotion is requested . Note that we do
* do this only after failure , so when you create the
* this only after failure , so when you promote , we still
* trigger file , we still finish replaying as much as we
* finish replaying as much as we can from archive and
* can from archive and pg_wal before failover .
* pg_wal before failover .
*/
*/
if ( StandbyMode & & CheckForStandbyTrigger ( ) )
if ( StandbyMode & & CheckForStandbyTrigger ( ) )
{
{
@ -3840,14 +3836,13 @@ WaitForWALToBecomeAvailable(XLogRecPtr RecPtr, bool randAccess,
XLogPrefetcherComputeStats ( xlogprefetcher ) ;
XLogPrefetcherComputeStats ( xlogprefetcher ) ;
/*
/*
* Wait for more WAL to arrive . Time out after 5 seconds
* Wait for more WAL to arrive , when we will be woken
* to react to a trigger file promptly and to check if the
* immediately by the WAL receiver .
* WAL receiver is still active .
*/
*/
( void ) WaitLatch ( & XLogRecoveryCtl - > recoveryWakeupLatch ,
( void ) WaitLatch ( & XLogRecoveryCtl - > recoveryWakeupLatch ,
WL_LATCH_SET | WL_TIMEOUT |
WL_LATCH_SET | WL_EXIT_ON_PM_DEATH ,
WL_EXIT_ON_PM_DEATH ,
- 1L ,
5000L , WAIT_EVENT_RECOVERY_WAL_STREAM ) ;
WAIT_EVENT_RECOVERY_WAL_STREAM ) ;
ResetLatch ( & XLogRecoveryCtl - > recoveryWakeupLatch ) ;
ResetLatch ( & XLogRecoveryCtl - > recoveryWakeupLatch ) ;
break ;
break ;
}
}
@ -4294,14 +4289,11 @@ SetPromoteIsTriggered(void)
}
}
/*
/*
* Check to see whether the user - specified trigger file exists and whether a
* Check whether a promote request has arrived .
* promote request has arrived . If either condition holds , return true .
*/
*/
static bool
static bool
CheckForStandbyTrigger ( void )
CheckForStandbyTrigger ( void )
{
{
struct stat stat_buf ;
if ( LocalPromoteIsTriggered )
if ( LocalPromoteIsTriggered )
return true ;
return true ;
@ -4314,23 +4306,6 @@ CheckForStandbyTrigger(void)
return true ;
return true ;
}
}
if ( PromoteTriggerFile = = NULL | | strcmp ( PromoteTriggerFile , " " ) = = 0 )
return false ;
if ( stat ( PromoteTriggerFile , & stat_buf ) = = 0 )
{
ereport ( LOG ,
( errmsg ( " promote trigger file found: %s " , PromoteTriggerFile ) ) ) ;
unlink ( PromoteTriggerFile ) ;
SetPromoteIsTriggered ( ) ;
return true ;
}
else if ( errno ! = ENOENT )
ereport ( ERROR ,
( errcode_for_file_access ( ) ,
errmsg ( " could not stat promote trigger file \" %s \" : %m " ,
PromoteTriggerFile ) ) ) ;
return false ;
return false ;
}
}