Add new snapshot fields to serialize/deserialize functions.
authorKevin Grittner <kgrittn@postgresql.org>
Fri, 3 Jun 2016 16:13:28 +0000 (11:13 -0500)
committerKevin Grittner <kgrittn@postgresql.org>
Fri, 3 Jun 2016 16:13:28 +0000 (11:13 -0500)
The "snapshot too old" condition was not being recognized when
using a copied snapshot, since the original timestamp and lsn were
not being passed along.  Noticed when testing the combination of
"snapshot too old" with parallel query execution.

src/backend/utils/time/snapmgr.c

index db85cf6f32c1a5fc8b71fda39b3fbf020d7952ef..3a3d9845f3b35f5396639248957ff66aa7d111d2 100644 (file)
@@ -239,6 +239,8 @@ typedef struct SerializedSnapshotData
    bool        suboverflowed;
    bool        takenDuringRecovery;
    CommandId   curcid;
+   int64       whenTaken;
+   XLogRecPtr  lsn;
 } SerializedSnapshotData;
 
 Size
@@ -1936,6 +1938,8 @@ SerializeSnapshot(Snapshot snapshot, char *start_address)
    serialized_snapshot->suboverflowed = snapshot->suboverflowed;
    serialized_snapshot->takenDuringRecovery = snapshot->takenDuringRecovery;
    serialized_snapshot->curcid = snapshot->curcid;
+   serialized_snapshot->whenTaken = snapshot->whenTaken;
+   serialized_snapshot->lsn = snapshot->lsn;
 
    /*
     * Ignore the SubXID array if it has overflowed, unless the snapshot was
@@ -2002,6 +2006,8 @@ RestoreSnapshot(char *start_address)
    snapshot->suboverflowed = serialized_snapshot->suboverflowed;
    snapshot->takenDuringRecovery = serialized_snapshot->takenDuringRecovery;
    snapshot->curcid = serialized_snapshot->curcid;
+   snapshot->whenTaken = serialized_snapshot->whenTaken;
+   snapshot->lsn = serialized_snapshot->lsn;
 
    /* Copy XIDs, if present. */
    if (serialized_snapshot->xcnt > 0)