#ifdef PGXC /* PGXC_DATANODE */
-static bool GetPGXCSnapshotData(Snapshot snapshot);
+static bool GetPGXCSnapshotData(Snapshot snapshot, bool latest);
typedef struct
{
* not statically allocated (see xip allocation below).
*/
Snapshot
-GetSnapshotData(Snapshot snapshot)
+GetSnapshotData(Snapshot snapshot, bool latest)
{
ProcArrayStruct *arrayP = procArray;
TransactionId xmin;
* Obtain a global snapshot for a Postgres-XC session
* if possible.
*/
- if (GetPGXCSnapshotData(snapshot))
+ if (GetPGXCSnapshotData(snapshot, latest))
return snapshot;
/*
* We only make one exception for using local snapshot and that's the
* Entry of snapshot obtention for Postgres-XC node
*/
static bool
-GetPGXCSnapshotData(Snapshot snapshot)
+GetPGXCSnapshotData(Snapshot snapshot, bool latest)
{
/*
* If this node is in recovery phase,
*/
if ((IsConnFromCoord() || IsConnFromDatanode())
- && !IsInitProcessingMode() && !GetForceXidFromGTM())
+ && !IsInitProcessingMode() && !GetForceXidFromGTM() &&
+ !latest)
{
if (globalSnapshot.snapshot_source == SNAPSHOT_COORDINATOR)
GetSnapshotFromGlobalSnapshot(snapshot);
if (IsolationIsSerializable())
CurrentSnapshot = GetSerializableTransactionSnapshot(&CurrentSnapshotData);
else
- CurrentSnapshot = GetSnapshotData(&CurrentSnapshotData);
+ CurrentSnapshot = GetSnapshotData(&CurrentSnapshotData, false);
/* Make a saved copy */
CurrentSnapshot = CopySnapshot(CurrentSnapshot);
FirstXactSnapshot = CurrentSnapshot;
pairingheap_add(&RegisteredSnapshots, &FirstXactSnapshot->ph_node);
}
else
- CurrentSnapshot = GetSnapshotData(&CurrentSnapshotData);
+ CurrentSnapshot = GetSnapshotData(&CurrentSnapshotData, false);
/* Don't allow catalog snapshot to be older than xact snapshot. */
CatalogSnapshotStale = true;
/* Don't allow catalog snapshot to be older than xact snapshot. */
CatalogSnapshotStale = true;
- CurrentSnapshot = GetSnapshotData(&CurrentSnapshotData);
+ CurrentSnapshot = GetSnapshotData(&CurrentSnapshotData, false);
return CurrentSnapshot;
}
if (!FirstSnapshotSet)
return GetTransactionSnapshot();
- SecondarySnapshot = GetSnapshotData(&SecondarySnapshotData);
+ SecondarySnapshot = GetSnapshotData(&SecondarySnapshotData, true);
return SecondarySnapshot;
}
if (CatalogSnapshotStale)
{
/* Get new snapshot. */
- CatalogSnapshot = GetSnapshotData(&CatalogSnapshotData);
+ CatalogSnapshot = GetSnapshotData(&CatalogSnapshotData, true);
/*
* Mark new snapshost as valid. We must do this last, in case an
* two variables in exported snapshot files, but it seems better to have
* snapshot importers compute reasonably up-to-date values for them.)
*/
- CurrentSnapshot = GetSnapshotData(&CurrentSnapshotData);
+ CurrentSnapshot = GetSnapshotData(&CurrentSnapshotData, false);
/*
* Now copy appropriate fields from the source snapshot.
extern int GetMaxSnapshotXidCount(void);
extern int GetMaxSnapshotSubxidCount(void);
-extern Snapshot GetSnapshotData(Snapshot snapshot);
+extern Snapshot GetSnapshotData(Snapshot snapshot, bool latest);
extern bool ProcArrayInstallImportedXmin(TransactionId xmin,
TransactionId sourcexid);