Skip to content

Commit af5213a

Browse files
committed
Detect too late snapshot
1 parent f35faf8 commit af5213a

File tree

3 files changed

+23
-5
lines changed

3 files changed

+23
-5
lines changed

contrib/multimaster/multimaster.c

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,7 @@ static XidStatus DtmGetTransactionStatus(TransactionId xid, XLogRecPtr *lsn);
8888
static void DtmSetTransactionStatus(TransactionId xid, int nsubxids, TransactionId *subxids, XidStatus status, XLogRecPtr lsn);
8989
static void DtmUpdateRecentXmin(Snapshot snapshot);
9090
static void DtmInitialize(void);
91+
static void DtmSubXactCallback(XactEvent event, void *arg);
9192
static void DtmXactCallback(XactEvent event, void *arg);
9293
static TransactionId DtmGetNextXid(void);
9394
static TransactionId DtmGetNewTransactionId(bool isSubXact);
@@ -733,6 +734,7 @@ static void DtmInitialize()
733734
dtm->initialized = false;
734735
BgwPoolInit(&dtm->pool, MMExecutor, MMDatabaseName, MMQueueSize);
735736
RegisterXactCallback(DtmXactCallback, NULL);
737+
RegisterSubXactCallback(DtmSubXactCallback, NULL);
736738
}
737739
LWLockRelease(AddinShmemInitLock);
738740

@@ -762,6 +764,12 @@ static void DtmInitialize()
762764
TM = &DtmTM;
763765
}
764766

767+
static void
768+
DtmSubXactCallback(XactEvent event, void *arg)
769+
{
770+
elog(ERROR, "Subtransactions are not currently supported");
771+
}
772+
765773
static void
766774
DtmXactCallback(XactEvent event, void *arg)
767775
{

contrib/pg_dtm/pg_dtm.c

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,7 @@ static XidStatus DtmGetTransactionStatus(TransactionId xid, XLogRecPtr *lsn);
7474
static void DtmSetTransactionStatus(TransactionId xid, int nsubxids, TransactionId *subxids, XidStatus status, XLogRecPtr lsn);
7575
static void DtmUpdateRecentXmin(Snapshot snapshot);
7676
static void DtmInitialize(void);
77+
static void DtmSubXactCallback(XactEvent event, void *arg);
7778
static void DtmXactCallback(XactEvent event, void *arg);
7879
static TransactionId DtmGetNextXid(void);
7980
static TransactionId DtmGetNewTransactionId(bool isSubXact);
@@ -105,7 +106,6 @@ static SnapshotData DtmSnapshot = { HeapTupleSatisfiesMVCC };
105106
static bool DtmHasGlobalSnapshot;
106107
static bool DtmGlobalXidAssigned;
107108
static int DtmLocalXidReserve;
108-
static int DtmCurcid;
109109
static Snapshot DtmLastSnapshot;
110110
static TransactionManager DtmTM = {
111111
DtmGetTransactionStatus,
@@ -605,9 +605,9 @@ static Snapshot DtmGetSnapshot(Snapshot snapshot)
605605
}
606606
if (TransactionIdIsValid(DtmNextXid) && snapshot != &CatalogSnapshotData)
607607
{
608-
if (!DtmHasGlobalSnapshot && (snapshot != DtmLastSnapshot || DtmCurcid != snapshot->curcid))
608+
if (!DtmHasGlobalSnapshot) {
609609
DtmGlobalGetSnapshot(DtmNextXid, &DtmSnapshot, &dtm->minXid);
610-
DtmCurcid = snapshot->curcid;
610+
}
611611
DtmLastSnapshot = snapshot;
612612
DtmMergeWithGlobalSnapshot(snapshot);
613613
if (!IsolationUsesXactSnapshot())
@@ -717,6 +717,7 @@ static void DtmInitialize()
717717
dtm->nReservedXids = 0;
718718
dtm->minXid = InvalidTransactionId;
719719
RegisterXactCallback(DtmXactCallback, NULL);
720+
RegisterSubXactCallback(DtmSubXactCallback, NULL);
720721
}
721722
LWLockRelease(AddinShmemInitLock);
722723

@@ -735,6 +736,12 @@ static void DtmInitialize()
735736
TM = &DtmTM;
736737
}
737738

739+
static void
740+
DtmSubXactCallback(XactEvent event, void *arg)
741+
{
742+
elog(ERROR, "Subtransactions are not currently supported");
743+
}
744+
738745
static void
739746
DtmXactCallback(XactEvent event, void *arg)
740747
{

contrib/pg_tsdtm/pg_dtm.c

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -176,7 +176,7 @@ static cid_t dtm_sync(cid_t global_cid)
176176
SpinLockAcquire(&local->lock);
177177
}
178178
#endif
179-
return global_cid;
179+
return local_cid;
180180
}
181181

182182
void
@@ -641,7 +641,10 @@ cid_t DtmLocalAccess(DtmCurrentTrans* x, GlobalTransactionId gtid, cid_t global_
641641
x->is_global = true;
642642
}
643643
SpinLockRelease(&local->lock);
644-
return local_cid;
644+
if (global_cid < local_cid - DtmVacuumDelay*USEC) {
645+
elog(ERROR, "Too old snapshot");
646+
}
647+
return global_cid;
645648
}
646649

647650
void DtmLocalBeginPrepare(GlobalTransactionId gtid)

0 commit comments

Comments
 (0)