]> granicus.if.org Git - postgresql/blobdiff - src/backend/access/transam/xlog.c
Better fix for "unarchived WAL files get deleted on crash recovery" bug.
[postgresql] / src / backend / access / transam / xlog.c
index 6c9935c5f58a1da4b2fac33174fab239e1b65c39..abc525a266ffafd3320dff1ca0a8481bbff3954d 100644 (file)
@@ -433,7 +433,6 @@ typedef struct XLogCtlData
         * recovery.  Protected by info_lck.
         */
        bool            SharedRecoveryInProgress;
-       bool            SharedInArchiveRecovery;
 
        /*
         * SharedHotStandbyActive indicates if we're still in crash or archive
@@ -620,7 +619,6 @@ static bool bgwriterLaunched = false;
 
 static void readRecoveryCommandFile(void);
 static void exitArchiveRecovery(TimeLineID endTLI, XLogSegNo endLogSegNo);
-static bool ArchiveRecoveryInProgress(void);
 static bool recoveryStopsHere(XLogRecord *record, bool *includeThis);
 static void recoveryPausesHere(void);
 static void SetLatestXTime(TimestampTz xtime);
@@ -2925,7 +2923,7 @@ RemoveOldXlogFiles(XLogSegNo segno, XLogRecPtr endptr)
                        strspn(xlde->d_name, "0123456789ABCDEF") == 24 &&
                        strcmp(xlde->d_name + 8, lastoff + 8) <= 0)
                {
-                       if (ArchiveRecoveryInProgress() || XLogArchiveCheckDone(xlde->d_name))
+                       if (XLogArchiveCheckDone(xlde->d_name))
                        {
                                snprintf(path, MAXPGPATH, XLOGDIR "/%s", xlde->d_name);
 
@@ -3871,7 +3869,6 @@ XLOGShmemInit(void)
         */
        XLogCtl->XLogCacheBlck = XLOGbuffers - 1;
        XLogCtl->SharedRecoveryInProgress = true;
-       XLogCtl->SharedInArchiveRecovery = false;
        XLogCtl->SharedHotStandbyActive = false;
        XLogCtl->WalWriterSleeping = false;
        XLogCtl->Insert.currpage = (XLogPageHeader) (XLogCtl->pages);
@@ -4265,7 +4262,6 @@ readRecoveryCommandFile(void)
 
        /* Enable fetching from archive recovery area */
        InArchiveRecovery = true;
-       XLogCtl->SharedInArchiveRecovery = true;
 
        /*
         * If user specified recovery_target_timeline, validate it or compute the
@@ -4304,16 +4300,11 @@ exitArchiveRecovery(TimeLineID endTLI, XLogSegNo endLogSegNo)
 {
        char            recoveryPath[MAXPGPATH];
        char            xlogpath[MAXPGPATH];
-       /* use volatile pointer to prevent code rearrangement */
-       volatile XLogCtlData *xlogctl = XLogCtl;
 
        /*
         * We are no longer in archive recovery state.
         */
        InArchiveRecovery = false;
-       SpinLockAcquire(&xlogctl->info_lck);
-       xlogctl->SharedInArchiveRecovery = false;
-       SpinLockRelease(&xlogctl->info_lck);
 
        /*
         * Update min recovery point one last time.
@@ -6110,25 +6101,6 @@ RecoveryInProgress(void)
        }
 }
 
-/*
- * Are we currently in archive recovery? In the startup process, you can just
- * check InArchiveRecovery variable instead.
- */
-static bool
-ArchiveRecoveryInProgress()
-{
-       bool            result;
-       /* use volatile pointer to prevent code rearrangement */
-       volatile XLogCtlData *xlogctl = XLogCtl;
-
-       /* spinlock is essential on machines with weak memory ordering! */
-       SpinLockAcquire(&xlogctl->info_lck);
-       result = xlogctl->SharedInArchiveRecovery;
-       SpinLockRelease(&xlogctl->info_lck);
-
-       return result;
-}
-
 /*
  * Is HotStandby active yet? This is only important in special backends
  * since normal backends won't ever be able to connect until this returns