Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commitafa7ff6

Browse files
knizhnikkelvich
authored andcommitted
Add mtm.get_last_csn function
1 parent34d042e commitafa7ff6

File tree

4 files changed

+20
-5
lines changed

4 files changed

+20
-5
lines changed

‎multimaster--1.0.sql

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,10 @@ CREATE FUNCTION mtm.get_csn(tid xid) RETURNS bigint
3131
AS'MODULE_PATHNAME','mtm_get_csn'
3232
LANGUAGE C;
3333

34+
CREATEFUNCTIONmtm.get_last_csn() RETURNSbigint
35+
AS'MODULE_PATHNAME','mtm_get_last_csn'
36+
LANGUAGE C;
37+
3438

3539
CREATETYPEmtm.node_stateAS ("id"integer,"disabled" bool,"disconnected" bool,"catchUp" bool,"slotLag"bigint,"avgTransDelay"bigint,"lastStatusChange"timestamp,"oldestSnapshot"bigint,"connStr"text);
3640

‎multimaster.c

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,7 @@ PG_FUNCTION_INFO_V1(mtm_poll_node);
107107
PG_FUNCTION_INFO_V1(mtm_recover_node);
108108
PG_FUNCTION_INFO_V1(mtm_get_snapshot);
109109
PG_FUNCTION_INFO_V1(mtm_get_csn);
110+
PG_FUNCTION_INFO_V1(mtm_get_last_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);
@@ -822,11 +823,11 @@ MtmEndTransaction(MtmCurrentTrans* x, bool commit)
822823
if (ts!=NULL) {
823824
if (commit) {
824825
Assert(ts->status==TRANSACTION_STATUS_UNKNOWN);
825-
ts->status=TRANSACTION_STATUS_COMMITTED;
826826
if (x->csn>ts->csn) {
827827
ts->csn=x->csn;
828828
MtmSyncClock(ts->csn);
829829
}
830+
ts->status=TRANSACTION_STATUS_COMMITTED;
830831
}else {
831832
ts->status=TRANSACTION_STATUS_ABORTED;
832833
}
@@ -1461,6 +1462,7 @@ static void MtmInitialize()
14611462
Mtm->recoverySlot=0;
14621463
Mtm->locks=GetNamedLWLockTranche(MULTIMASTER_NAME);
14631464
Mtm->csn=MtmGetCurrentTime();
1465+
Mtm->lastCsn=INVALID_CSN;
14641466
Mtm->oldestXid=FirstNormalTransactionId;
14651467
Mtm->nLiveNodes=MtmNodes;
14661468
Mtm->nAllNodes=MtmNodes;
@@ -2294,6 +2296,12 @@ mtm_get_snapshot(PG_FUNCTION_ARGS)
22942296
PG_RETURN_INT64(MtmTx.snapshot);
22952297
}
22962298

2299+
Datum
2300+
mtm_get_last_csn(PG_FUNCTION_ARGS)
2301+
{
2302+
PG_RETURN_INT64(Mtm->lastCsn);
2303+
}
2304+
22972305
Datum
22982306
mtm_get_csn(PG_FUNCTION_ARGS)
22992307
{

‎multimaster.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -172,7 +172,8 @@ typedef struct
172172
intnActiveTransactions;/* Nunmber of active 2PC transactions */
173173
intnConfigChanges;/* Number of cluster configuration changes */
174174
int64timeShift;/* Local time correction */
175-
csn_tcsn;/* Last obtained CSN: used to provide unique acending CSNs based on system time */
175+
csn_tcsn;/* Last obtained timestamp: used to provide unique acending CSNs based on system time */
176+
csn_tlastCsn;/* CSN of last committed transaction */
176177
MtmTransState*votingTransactions;/* L1-list of replicated transactions sendings notifications to coordinator.
177178
This list is used to pass information to mtm-sender BGW */
178179
MtmTransState*transListHead;/* L1 list of all finished transactions present in xid2state hash.

‎tests/dtmacid.cpp

Lines changed: 5 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
worktxn1(*conns[c1]);
132132
worktxn2(*conns[c2]);
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");
133+
result r1 = txn1.exec("select v,xmin,xmax,mtm.get_csn(xmin),mtm.get_csn(xmax),mtm.get_snapshot(),mtm.get_last_csn() from t order by u");
134+
result r2 = txn2.exec("select v,xmin,xmax,mtm.get_csn(xmin),mtm.get_csn(xmax),mtm.get_snapshot(),mtm.get_last_csn() 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,9 @@ void* reader(void* arg)
140140
delta = diff;
141141
if (delta <0) lt++;else gt++;
142142
}elseif (delta != diff) {
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()));
143+
printf("Inconsistency found for record %d: [%d,%d]->[%ld,%ld] (snapshot %ld, last CSN %ld) vs. [%d,%d]->[%ld,%ld] (snapshot %ld, last CSN %ld)\n", i,
144+
r1[i][1].as(int()), r1[i][2].as(int()), r1[i][3].as(int64_t()), r1[i][4].as(int64_t()), r1[i][5].as(int64_t()), r1[i][6].as(int64_t()),
145+
r2[i][1].as(int()), r2[i][2].as(int()), r2[i][3].as(int64_t()), r2[i][4].as(int64_t()), r2[i][5].as(int64_t()), r2[i][6].as(int64_t()));
144146
}
145147
}
146148
}

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp