]> granicus.if.org Git - postgresql/commitdiff
Avoid crashing in GetOldestSnapshot() if there are no known snapshots.
authorTom Lane <tgl@sss.pgh.pa.us>
Sun, 7 Aug 2016 18:36:02 +0000 (14:36 -0400)
committerTom Lane <tgl@sss.pgh.pa.us>
Sun, 7 Aug 2016 18:36:02 +0000 (14:36 -0400)
The sole caller expects NULL to be returned in such a case, so make
it so and document it.

Per reports from Andreas Seltenreich and Regina Obe.  This doesn't
really fix their problem, as now their RETURNING queries will say
"ERROR: no known snapshots", but in any case this function should
not dump core in a reasonably-foreseeable situation.

Report: <87vazemeda.fsf@credativ.de>
Report: <20160807051854.1427.32414@wrigleys.postgresql.org>

src/backend/utils/time/snapmgr.c

index 4bddaed33ba91653df87a471332c444fd0597fef..1ec9f70f0eeff3dfe47b4dea17faa32d271f5472 100644 (file)
@@ -399,14 +399,14 @@ GetLatestSnapshot(void)
 /*
  * GetOldestSnapshot
  *
- *             Get the oldest known snapshot, as judged by the LSN.
+ *             Get the transaction's oldest known snapshot, as judged by the LSN.
+ *             Will return NULL if there are no active or registered snapshots.
  */
 Snapshot
 GetOldestSnapshot(void)
 {
        Snapshot        OldestRegisteredSnapshot = NULL;
        XLogRecPtr      RegisteredLSN = InvalidXLogRecPtr;
-       XLogRecPtr      ActiveLSN = InvalidXLogRecPtr;
 
        if (!pairingheap_is_empty(&RegisteredSnapshots))
        {
@@ -416,10 +416,12 @@ GetOldestSnapshot(void)
        }
 
        if (OldestActiveSnapshot != NULL)
-               ActiveLSN = OldestActiveSnapshot->as_snap->lsn;
+       {
+               XLogRecPtr      ActiveLSN = OldestActiveSnapshot->as_snap->lsn;
 
-       if (XLogRecPtrIsInvalid(RegisteredLSN) || RegisteredLSN > ActiveLSN)
-               return OldestActiveSnapshot->as_snap;
+               if (XLogRecPtrIsInvalid(RegisteredLSN) || RegisteredLSN > ActiveLSN)
+                       return OldestActiveSnapshot->as_snap;
+       }
 
        return OldestRegisteredSnapshot;
 }