Skip to content
Snippets Groups Projects
Select Git revision
  • benchmark-tools
  • postgres-lambda
  • master default
  • REL9_4_25
  • REL9_5_20
  • REL9_6_16
  • REL_10_11
  • REL_11_6
  • REL_12_1
  • REL_12_0
  • REL_12_RC1
  • REL_12_BETA4
  • REL9_4_24
  • REL9_5_19
  • REL9_6_15
  • REL_10_10
  • REL_11_5
  • REL_12_BETA3
  • REL9_4_23
  • REL9_5_18
  • REL9_6_14
  • REL_10_9
  • REL_11_4
23 results

standby.h

Blame
  • standby.h 3.99 KiB
    /*-------------------------------------------------------------------------
     *
     * standby.h
     *	  Definitions for hot standby mode.
     *
     *
     * Portions Copyright (c) 1996-2012, PostgreSQL Global Development Group
     * Portions Copyright (c) 1994, Regents of the University of California
     *
     * src/include/storage/standby.h
     *
     *-------------------------------------------------------------------------
     */
    #ifndef STANDBY_H
    #define STANDBY_H
    
    #include "access/xlog.h"
    #include "storage/lock.h"
    #include "storage/procsignal.h"
    #include "storage/relfilenode.h"
    
    /* User-settable GUC parameters */
    extern int	vacuum_defer_cleanup_age;
    extern int	max_standby_archive_delay;
    extern int	max_standby_streaming_delay;
    
    extern void InitRecoveryTransactionEnvironment(void);
    extern void ShutdownRecoveryTransactionEnvironment(void);
    
    extern void ResolveRecoveryConflictWithSnapshot(TransactionId latestRemovedXid,
    									RelFileNode node);
    extern void ResolveRecoveryConflictWithTablespace(Oid tsid);
    extern void ResolveRecoveryConflictWithDatabase(Oid dbid);
    
    extern void ResolveRecoveryConflictWithBufferPin(void);
    extern void SendRecoveryConflictWithBufferPin(ProcSignalReason reason);
    extern void CheckRecoveryConflictDeadlock(void);
    
    /*
     * Standby Rmgr (RM_STANDBY_ID)
     *
     * Standby recovery manager exists to perform actions that are required
     * to make hot standby work. That includes logging AccessExclusiveLocks taken
     * by transactions and running-xacts snapshots.
     */
    extern void StandbyAcquireAccessExclusiveLock(TransactionId xid, Oid dbOid, Oid relOid);
    extern void StandbyReleaseLockTree(TransactionId xid,
    					   int nsubxids, TransactionId *subxids);
    extern void StandbyReleaseAllLocks(void);
    extern void StandbyReleaseOldLocks(int nxids, TransactionId *xids);
    
    /*
     * XLOG message types
     */
    #define XLOG_STANDBY_LOCK			0x00
    #define XLOG_RUNNING_XACTS			0x10
    
    typedef struct xl_standby_locks
    {
    	int			nlocks;			/* number of entries in locks array */
    	xl_standby_lock locks[1];	/* VARIABLE LENGTH ARRAY */
    } xl_standby_locks;
    
    /*
     * When we write running xact data to WAL, we use this structure.
     */
    typedef struct xl_running_xacts
    {
    	int			xcnt;			/* # of xact ids in xids[] */
    	bool		subxid_overflow;	/* snapshot overflowed, subxids missing */
    	TransactionId nextXid;		/* copy of ShmemVariableCache->nextXid */
    	TransactionId oldestRunningXid;		/* *not* oldestXmin */
    	TransactionId latestCompletedXid;	/* so we can set xmax */
    
    	TransactionId xids[1];		/* VARIABLE LENGTH ARRAY */
    } xl_running_xacts;
    
    #define MinSizeOfXactRunningXacts offsetof(xl_running_xacts, xids)
    
    
    /* Recovery handlers for the Standby Rmgr (RM_STANDBY_ID) */
    extern void standby_redo(XLogRecPtr lsn, XLogRecord *record);
    extern void standby_desc(StringInfo buf, uint8 xl_info, char *rec);
    
    /*
     * Declarations for GetRunningTransactionData(). Similar to Snapshots, but
     * not quite. This has nothing at all to do with visibility on this server,
     * so this is completely separate from snapmgr.c and snapmgr.h.
     * This data is important for creating the initial snapshot state on a
     * standby server. We need lots more information than a normal snapshot,
     * hence we use a specific data structure for our needs. This data
     * is written to WAL as a separate record immediately after each
     * checkpoint. That means that wherever we start a standby from we will
     * almost immediately see the data we need to begin executing queries.
     */
    
    typedef struct RunningTransactionsData
    {
    	int			xcnt;			/* # of xact ids in xids[] */
    	bool		subxid_overflow;	/* snapshot overflowed, subxids missing */
    	TransactionId nextXid;		/* copy of ShmemVariableCache->nextXid */
    	TransactionId oldestRunningXid;		/* *not* oldestXmin */
    	TransactionId latestCompletedXid;	/* so we can set xmax */
    
    	TransactionId *xids;		/* array of (sub)xids still running */
    } RunningTransactionsData;
    
    typedef RunningTransactionsData *RunningTransactions;
    
    extern void LogAccessExclusiveLock(Oid dbOid, Oid relOid);
    extern void LogAccessExclusiveLockPrepare(void);
    
    extern void LogStandbySnapshot(TransactionId *nextXid);
    
    #endif   /* STANDBY_H */