mirror of
https://github.com/postgres/postgres.git
synced 2025-06-25 01:02:05 +03: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:
@ -399,14 +399,14 @@ GetLatestSnapshot(void)
|
|||||||
/*
|
/*
|
||||||
* GetOldestSnapshot
|
* 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
|
Snapshot
|
||||||
GetOldestSnapshot(void)
|
GetOldestSnapshot(void)
|
||||||
{
|
{
|
||||||
Snapshot OldestRegisteredSnapshot = NULL;
|
Snapshot OldestRegisteredSnapshot = NULL;
|
||||||
XLogRecPtr RegisteredLSN = InvalidXLogRecPtr;
|
XLogRecPtr RegisteredLSN = InvalidXLogRecPtr;
|
||||||
XLogRecPtr ActiveLSN = InvalidXLogRecPtr;
|
|
||||||
|
|
||||||
if (!pairingheap_is_empty(&RegisteredSnapshots))
|
if (!pairingheap_is_empty(&RegisteredSnapshots))
|
||||||
{
|
{
|
||||||
@ -416,10 +416,12 @@ GetOldestSnapshot(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (OldestActiveSnapshot != NULL)
|
if (OldestActiveSnapshot != NULL)
|
||||||
ActiveLSN = OldestActiveSnapshot->as_snap->lsn;
|
{
|
||||||
|
XLogRecPtr ActiveLSN = OldestActiveSnapshot->as_snap->lsn;
|
||||||
|
|
||||||
if (XLogRecPtrIsInvalid(RegisteredLSN) || RegisteredLSN > ActiveLSN)
|
if (XLogRecPtrIsInvalid(RegisteredLSN) || RegisteredLSN > ActiveLSN)
|
||||||
return OldestActiveSnapshot->as_snap;
|
return OldestActiveSnapshot->as_snap;
|
||||||
|
}
|
||||||
|
|
||||||
return OldestRegisteredSnapshot;
|
return OldestRegisteredSnapshot;
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user