From 370a46fc015115bfeccde4eb208d82049f792f9f Mon Sep 17 00:00:00 2001
From: Kevin Grittner <kgrittn@postgresql.org>
Date: Fri, 3 Jun 2016 11:13:28 -0500
Subject: [PATCH] Add new snapshot fields to serialize/deserialize functions.

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 | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/src/backend/utils/time/snapmgr.c b/src/backend/utils/time/snapmgr.c
index db85cf6f32c..3a3d9845f3b 100644
--- a/src/backend/utils/time/snapmgr.c
+++ b/src/backend/utils/time/snapmgr.c
@@ -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)
-- 
GitLab