mirror of
https://git.postgresql.org/git/postgresql.git
synced 2025-01-12 18:34:36 +08:00
Avoid crashing in GetOldestSnapshot() if there are no known snapshots.
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>
This commit is contained in:
parent
bcbecbce2f
commit
07a601eeda
@ -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;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user