8000 Add mtm.get_csn function · postgrespro/postgres_cluster@75b574f · GitHub
[go: up one dir, main page]

Skip to content

Commit 75b574f

Browse files
committed
Add mtm.get_csn function
1 parent 0f8d55c commit 75b574f

File tree

3 files changed

+28
-4
lines changed

3 files changed

+28
-4
lines changed

contrib/mmts/multimaster--1.0.sql

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,10 @@ CREATE FUNCTION mtm.get_snapshot() RETURNS bigint
2727
AS 'MODULE_PATHNAME','mtm_get_snapshot'
2828
LANGUAGE C;
2929

30+
CREATE FUNCTION mtm.get_csn(tid xid) RETURNS bigint
31+
AS 'MODULE_PATHNAME','mtm_get_csn'
32+
LANGUAGE C;
33+
3034

3135
CREATE TYPE mtm.node_state AS ("id" integer, "disabled" bool, "disconnected" bool, "catchUp" bool, "slotLag" bigint, "avgTransDelay" bigint, "lastStatusChange" timestamp, "oldestSnapshot" bigint, "connStr" text);
3236

contrib/mmts/multimaster.c

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,7 @@ PG_FUNCTION_INFO_V1(mtm_add_node);
107107
PG_FUNCTION_INFO_V1(mtm_poll_node);
108108
PG_FUNCTION_INFO_V1(mtm_recover_node);
109109
PG_FUNCTION_INFO_V1(mtm_get_snapshot);
110+
PG_FUNCTION_INFO_V1(mtm_get_csn);
110111
PG_FUNCTION_INFO_V1(mtm_get_nodes_state);
111112
PG_FUNCTION_INFO_V1(mtm_get_cluster_state);
112113
PG_FUNCTION_INFO_V1(mtm_get_cluster_info);
@@ -452,12 +453,13 @@ static TransactionId
452453
MtmAdjustOldestXid(TransactionId xid)
453454
{
454455
int i;
456+
csn_t oldestSnapshot = INVALID_CSN;
455457
MtmTransState *prev = NULL;
456458
MtmTransState *ts = (MtmTransState*)hash_search(MtmXid2State, &xid, HASH_FIND, NULL);
457459
MTM_LOG1("%d: MtmAdjustOldestXid(%d): snapshot=%ld, csn=%ld, status=%d", MyProcPid, xid, ts != NULL ? ts->snapshot : 0, ts != NULL ? ts->csn : 0, ts != NULL ? ts->status : -1);
458460
Mtm->gcCount = 0;
459461
if (ts != NULL) {
460-
csn_t oldestSnapshot = ts->snapshot;
462+
oldestSnapshot = ts->snapshot;
461463
Mtm->nodes[MtmNodeId-1].oldestSnapshot = oldestSnapshot;
462464
for (i = 0; i < Mtm->nAllNodes; i++) {
463465
if (!BIT_CHECK(Mtm->disabledNodeMask, i)
@@ -487,6 +489,7 @@ MtmAdjustOldestXid(TransactionId xid)
487489
if (prev != NULL) {
488490
Mtm->transListHead = prev;
489491
Mtm->oldestXid = xid = prev->xid;
492+
MTM_LOG1("%d: MtmAdjustOldestXid: oldestXid=%d, olderstSnapshot=%ld", MyProcPid, xid, oldestSnapshot);
490493
} else if (TransactionIdPrecedes(Mtm->oldestXid, xid)) {
491494
xid = Mtm->oldestXid;
492495
}
@@ -2292,6 +2295,23 @@ mtm_get_snapshot(PG_FUNCTION_ARGS)
22922295
PG_RETURN_INT64(MtmTx.snapshot);
22932296
}
22942297

2298+
Datum
2299+
mtm_get_csn(PG_FUNCTION_ARGS)
2300+
{
2301+
TransactionId xid = PG_GETARG_INT32(0);
2302+
MtmTransState* ts;
2303+
csn_t csn = INVALID_CSN;
2304+
2305+
MtmLock(LW_SHARED);
2306+
ts = hash_search(MtmXid2State, &xid, HASH_FIND, NULL);
2307+
if (ts != NULL) {
2308+
csn = ts->csn;
2309+
}
2310+
MtmUnlock();
2311+
2312+
return csn;
2313+
}
2314+
22952315
typedef struct
22962316
{
22972317
int nodeId;

contrib/mmts/tests/dtmacid.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -130,8 +130,8 @@ void* reader(void* arg)
130130
while ((c2 = random() % conns.size()) == c1);
131131
work txn1(*conns[c1]);
132132
work txn2(*conns[c2]);
133-
result r1 = txn1.exec("select v from t order by u");
134-
result r2 = txn2.exec("select v from t order by u");
133+
result r1 = txn1.exec("select v,xmin,xmax,mtm.get_csn(xmin) from t order by u");
134+
result r2 = txn2.exec("select v,xmin,xmax,mtm.get_csn(xmin) from t order by u");
135135
int delta = 0;
136136
for (int i=0; i < cfg.nAccounts; i++) {
137137
int diff = r1[i][0].as(int()) - r2[i][0].as(int());
@@ -140,7 +140,7 @@ void* reader(void* arg)
140140
delta = diff;
141141
if (delta < 0) lt++; else gt++;
142142
} else if (delta != diff) {
143-
printf("Inconsistency found for record %d\n", i);
143+
printf("Inconsistency found for record %d: [%d,%d]->%ld vs [%d,%d]->%ld\n", i, r1[i][1].as(int()), r1[i][2].as(int()), r1[i][3].as(int64_t()), r2[i][1].as(int()), r2[i][2].as(int()), r2[i][3].as(int64_t()));
144144
}
145145
}
146146
}

0 commit comments

Comments
 (0)
0