[GENERAL] Is there possibility btree_redo with XLOG_BTREE_DELETE done betweenstandby_redo and the end of backup - Mailing list pgsql-general

From y39chen
Subject [GENERAL] Is there possibility btree_redo with XLOG_BTREE_DELETE done betweenstandby_redo and the end of backup
Date
Msg-id 1495609157661-5963011.post@n3.nabble.com
Whole thread Raw
Responses Re: [GENERAL] Is there possibility btree_redo with XLOG_BTREE_DELETE done between standby_redo and the end of backup  (Tom Lane <tgl@sss.pgh.pa.us>)
List pgsql-general
is there possibility btree_redo with XLOG_BTREE_DELETE info done between
standby_redo and  the end of backup? I have PostgreSQL 9.3.14 which have
some patches to use and easy to happen.

//checkpoint
[26005-59251d35.6595-712522] 2017-05-24 05:42:22.343 GMT < > DEBUG:  00000:
recovery snapshots are now enabled
[26005-59251d35.6595-712523] 2017-05-24 05:42:22.343 GMT < > CONTEXT:  xlog
redo running xacts: nextXid 3269723 latestCompletedXid 3269721
oldestRunningXid 3269722; 1 xacts: 3269722

void
ProcArrayApplyRecoveryInfo(RunningTransactions running)
{
......
    standbyState = STANDBY_SNAPSHOT_READY;  /  //the standbyState is changed
to STANDBY_SNAPSHOT_READY/
......
}

static void
CheckRecoveryConsistency(void)
{
......
///but the reachedConsistency  is not set true because below condition is
not true./
    if (!reachedConsistency && !ControlFile->backupEndRequired &&
        minRecoveryPoint <= lastReplayedEndRecPtr &&
        XLogRecPtrIsInvalid(ControlFile->backupStartPoint))
    {
        /*
         * Check to see if the XLOG sequence contained any unresolved
         * references to uninitialized pages.
         */
        XLogCheckInvalidPages();

        reachedConsistency = true;
        ereport(LOG,
                (errmsg("consistent recovery state reached at %X/%X",
                        (uint32) (lastReplayedEndRecPtr >> 32),
                        (uint32) lastReplayedEndRecPtr)));
    }
......

}

//inconsistent detected in btree_xlog_delete_get_latestRemovedXid()
[26005-59251d35.6595-726087] 2017-05-24 05:42:22.513 GMT < > WARNING:
01000: btree_xlog_delete_get_latestRemovedXid: cannot operate with
inconsistent data
[26005-59251d35.6595-726088] 2017-05-24 05:42:22.513 GMT < > CONTEXT:  xlog
redo delete: index 1663/16385/11693; iblk 110, heap 1663/16385/11691;

static void
btree_xlog_delete(XLogRecPtr lsn, XLogRecord *record)
{
......
       / //InHotStandby is true/
    if (InHotStandby) / //#define InHotStandby (standbyState >=
STANDBY_SNAPSHOT_PENDING)/
    {
        TransactionId latestRemovedXid =
btree_xlog_delete_get_latestRemovedXid(xlrec);

        ResolveRecoveryConflictWithSnapshot(latestRemovedXid, xlrec->node);
    }
......
}

static TransactionId
btree_xlog_delete_get_latestRemovedXid(xl_btree_delete *xlrec)
{
......
        ///PANIC happened  *(I changed the PANIC to WARNING in the log to
see further steps.)*/
    if (!reachedConsistency)
          *elog(PANIC, "btree_xlog_delete_get_latestRemovedXid: cannot
operate with inconsistent data");*
......
}

//backup end
[26005-59251d35.6595-801986] 2017-05-24 05:42:28.564 GMT < > DEBUG:  00000:
end of backup reached
[26005-59251d35.6595-801987] 2017-05-24 05:42:28.564 GMT < > CONTEXT:  xlog
redo backup end: 191/AB1F50E8

static void
CheckRecoveryConsistency(void)
{
......
///This time the reachedConsistency  is set true because below condition
becomes to true./
    if (!reachedConsistency && !ControlFile->backupEndRequired &&
        minRecoveryPoint <= lastReplayedEndRecPtr &&
        XLogRecPtrIsInvalid(ControlFile->backupStartPoint))
    {
        /*
         * Check to see if the XLOG sequence contained any unresolved
         * references to uninitialized pages.
         */
        XLogCheckInvalidPages();

        reachedConsistency = true;
        ereport(LOG,
                (errmsg("consistent recovery state reached at %X/%X",
                        (uint32) (lastReplayedEndRecPtr >> 32),
                        (uint32) lastReplayedEndRecPtr)));
    }
......

}

I'm not sure if this scenario with original PostgreSQL code(9.3.14) would
happen while standby server start up in recovery mode(meanwhile huge data
updating in master server) in real world.
I'm not sure if the problem is because original PostgreSQL code or because
our patches.
So need to give comments from PostgreSQL original code point of view to
analyze the possibility.
Thanks!




--
View this message in context:
http://www.postgresql-archive.org/Is-there-possibility-btree-redo-with-XLOG-BTREE-DELETE-done-between-standby-redo-and-the-end-of-backp-tp5963011.html
Sent from the PostgreSQL - general mailing list archive at Nabble.com.


pgsql-general by date:

Previous
From: Ken Tanzer
Date:
Subject: Re: [GENERAL] Installing module for 9.6, not 9.2, on Centos?
Next
From: John R Pierce
Date:
Subject: Re: [GENERAL] Installing module for 9.6, not 9.2, on Centos?