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)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy