Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Skip to content

Commit 5b20bea

Browse files
knizhnikkelvich
authored andcommitted
Add mtm.inject_2pc_error function
1 parent be81ae1 commit 5b20bea

File tree

3 files changed

+31
-2
lines changed

3 files changed

+31
-2
lines changed

multimaster--1.0.sql

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,10 @@ CREATE FUNCTION mtm.poll_node(nodeId integer, noWait boolean default FALSE) RETU
6565
AS 'MODULE_PATHNAME','mtm_poll_node'
6666
LANGUAGE C;
6767

68+
CREATE FUNCTION mtm.inject_2pc_error(stage integer) RETURNS void
69+
AS 'MODULE_PATHNAME','mtm_inject_2pc_error'
70+
LANGUAGE C;
71+
6872
CREATE TABLE IF NOT EXISTS mtm.ddl_log (issued timestamp with time zone not null, query text);
6973

7074
CREATE TABLE IF NOT EXISTS mtm.local_tables(rel_schema text, rel_name text, primary key(rel_schema, rel_name));

multimaster.c

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,7 @@ PG_FUNCTION_INFO_V1(mtm_get_cluster_state);
113113
PG_FUNCTION_INFO_V1(mtm_get_cluster_info);
114114
PG_FUNCTION_INFO_V1(mtm_make_table_local);
115115
PG_FUNCTION_INFO_V1(mtm_dump_lock_graph);
116+
PG_FUNCTION_INFO_V1(mtm_inject_2pc_error);
116117

117118
static Snapshot MtmGetSnapshot(Snapshot snapshot);
118119
static void MtmInitialize(void);
@@ -687,6 +688,10 @@ MtmPrePrepareTransaction(MtmCurrentTrans* x)
687688
return;
688689
}
689690

691+
if (Mtm->inject2PCError == 1) {
692+
Mtm->inject2PCError = 0;
693+
elog(ERROR, "ERROR INJECTION for transaction %d (%s)", x->xid, x->gid);
694+
}
690695
x->xid = GetCurrentTransactionId();
691696
Assert(TransactionIdIsValid(x->xid));
692697

@@ -741,6 +746,10 @@ MtmPostPrepareTransaction(MtmCurrentTrans* x)
741746
{
742747
MtmTransState* ts;
743748

749+
if (Mtm->inject2PCError == 2) {
750+
Mtm->inject2PCError = 0;
751+
elog(ERROR, "ERROR INJECTION for transaction %d (%s)", x->xid, x->gid);
752+
}
744753
MtmLock(LW_EXCLUSIVE);
745754
ts = hash_search(MtmXid2State, &x->xid, HASH_FIND, NULL);
746755
Assert(ts != NULL);
@@ -782,6 +791,10 @@ MtmPostPrepareTransaction(MtmCurrentTrans* x)
782791
MTM_LOG3("%d: Result of vote: %d", MyProcPid, ts->status);
783792
MtmUnlock();
784793
}
794+
if (Mtm->inject2PCError == 3) {
795+
Mtm->inject2PCError = 0;
796+
elog(ERROR, "ERROR INJECTION for transaction %d (%s)", x->xid, x->gid);
797+
}
785798
}
786799

787800

@@ -1483,6 +1496,7 @@ static void MtmInitialize()
14831496
Mtm->gcCount = 0;
14841497
Mtm->nConfigChanges = 0;
14851498
Mtm->localTablesHashLoaded = false;
1499+
Mtm->inject2PCError = 0;
14861500
for (i = 0; i < MtmNodes; i++) {
14871501
Mtm->nodes[i].oldestSnapshot = 0;
14881502
Mtm->nodes[i].transDelay = 0;
@@ -2426,12 +2440,13 @@ mtm_get_cluster_info(PG_FUNCTION_ARGS)
24262440
usrfctx = (MtmGetClusterInfoCtx*)palloc(sizeof(MtmGetNodeStateCtx));
24272441
get_call_result_type(fcinfo, NULL, &desc);
24282442
funcctx->attinmeta = TupleDescGetAttInMetadata(desc);
2429-
usrfctx->nodeId = 1;
2443+
usrfctx->nodeId = 0;
24302444
funcctx->user_fctx = usrfctx;
24312445
MemoryContextSwitchTo(oldcontext);
24322446
}
24332447
funcctx = SRF_PERCALL_SETUP();
24342448
usrfctx = (MtmGetClusterInfoCtx*)funcctx->user_fctx;
2449+
while (++usrfctx->nodeId <= Mtm->nAllNodes && BIT_CHECK(Mtm->disabledNodeMask, usrfctx->nodeId-1));
24352450
if (usrfctx->nodeId > Mtm->nAllNodes) {
24362451
SRF_RETURN_DONE(funcctx);
24372452
}
@@ -2527,6 +2542,12 @@ Datum mtm_dump_lock_graph(PG_FUNCTION_ARGS)
25272542
return CStringGetTextDatum(s->data);
25282543
}
25292544

2545+
Datum mtm_inject_2pc_error(PG_FUNCTION_ARGS)
2546+
{
2547+
Mtm->inject2PCError = PG_GETARG_INT32(0);
2548+
PG_RETURN_VOID();
2549+
}
2550+
25302551
/*
25312552
* -------------------------------------------
25322553
* Broadcast utulity statements
@@ -2794,9 +2815,12 @@ static void MtmProcessUtility(Node *parsetree, const char *queryString,
27942815
}
27952816
break;
27962817
case TRANS_STMT_PREPARE:
2818+
elog(ERROR, "Two phase commit is not supported by multimaster");
2819+
break;
27972820
case TRANS_STMT_COMMIT_PREPARED:
27982821
case TRANS_STMT_ROLLBACK_PREPARED:
2799-
elog(ERROR, "Two phase commit is not supported by multimaster");
2822+
skipCommand = true;
2823+
break;
28002824
default:
28012825
break;
28022826
}

multimaster.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -165,6 +165,7 @@ typedef struct
165165
nodemask_t reconnectMask; /* Mask of nodes connection to which has to be reestablished by sender */
166166

167167
bool localTablesHashLoaded; /* Whether data from local_tables table is loaded in shared memory hash table */
168+
int inject2PCError; /* Simulate error during 2PC commit at this node */
168169
int nLiveNodes; /* Number of active nodes */
169170
int nAllNodes; /* Total numbber of nodes */
170171
int nReceivers; /* Number of initialized logical receivers (used to determine moment when Mtm intialization is completed */

0 commit comments

Comments
 (0)