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

Commit b82ebd0

Browse files
knizhnikkelvich
authored andcommitted
Abort voting backends on node disconnect
1 parent 671f689 commit b82ebd0

File tree

3 files changed

+36
-18
lines changed

3 files changed

+36
-18
lines changed

arbiter.c

Lines changed: 2 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -584,12 +584,6 @@ static void MtmTransSender(Datum arg)
584584
}
585585
}
586586

587-
static void MtmWakeUpBackend(MtmTransState* ts)
588-
{
589-
MTM_TRACE("Wakeup backed procno=%d, pid=%d\n", ts->procno, ProcGlobal->allProcs[ts->procno].pid);
590-
ts->votingCompleted = true;
591-
SetLatch(&ProcGlobal->allProcs[ts->procno].procLatch);
592-
}
593587

594588
#if !USE_EPOLL
595589
static bool MtmRecovery()
@@ -715,9 +709,7 @@ static void MtmTransReceiver(Datum arg)
715709
commit on smaller subset of nodes */
716710
elog(WARNING, "Coordinator of distributed transaction see less nodes than node %d: %lx instead of %lx",
717711
msg->node, Mtm->disabledNodeMask, msg->disabledNodeMask);
718-
ts->status = TRANSACTION_STATUS_ABORTED;
719-
MtmAdjustSubtransactions(ts);
720-
Mtm->nActiveTransactions -= 1;
712+
MtmAbortTransaction(ts);
721713
}
722714

723715
if (++ts->nVotes == Mtm->nNodes) {
@@ -735,9 +727,7 @@ static void MtmTransReceiver(Datum arg)
735727
Assert(ts->nVotes < Mtm->nNodes);
736728
if (ts->status != TRANSACTION_STATUS_ABORTED) {
737729
Assert(ts->status == TRANSACTION_STATUS_IN_PROGRESS);
738-
ts->status = TRANSACTION_STATUS_ABORTED;
739-
MtmAdjustSubtransactions(ts);
740-
Mtm->nActiveTransactions -= 1;
730+
MtmAbortTransaction(ts);
741731
}
742732
if (++ts->nVotes == Mtm->nNodes) {
743733
MtmWakeUpBackend(ts);

multimaster.c

Lines changed: 32 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -552,6 +552,7 @@ static void MtmAddSubtransactions(MtmTransState* ts, TransactionId* subxids, int
552552
Assert(!found);
553553
sts->status = ts->status;
554554
sts->csn = ts->csn;
555+
sts->votingCompleted = true;
555556
MtmTransactionListInsertAfter(ts, sts);
556557
}
557558
}
@@ -744,7 +745,8 @@ MtmPostPrepareTransaction(MtmCurrentTrans* x)
744745
if (!MtmIsCoordinator(ts) || Mtm->status == MTM_RECOVERY) {
745746
MtmTransMap* tm = (MtmTransMap*)hash_search(MtmGid2State, x->gid, HASH_ENTER, NULL);
746747
Assert(x->gid[0]);
747-
tm->state = ts;
748+
tm->state = ts;
749+
ts->votingCompleted = true;
748750
if (Mtm->status != MTM_RECOVERY) {
749751
MtmSendNotificationMessage(ts, MSG_READY); /* send notification to coordinator */
750752
} else {
@@ -776,9 +778,7 @@ MtmAbortPreparedTransaction(MtmCurrentTrans* x)
776778
MtmLock(LW_EXCLUSIVE);
777779
tm = (MtmTransMap*)hash_search(MtmGid2State, x->gid, HASH_REMOVE, NULL);
778780
Assert(tm != NULL);
779-
tm->state->status = TRANSACTION_STATUS_ABORTED;
780-
MtmAdjustSubtransactions(tm->state);
781-
Mtm->nActiveTransactions -= 1;
781+
MtmAbortTransaction(tm->state);
782782
MtmUnlock();
783783
x->status = TRANSACTION_STATUS_ABORTED;
784784
}
@@ -834,6 +834,7 @@ MtmEndTransaction(MtmCurrentTrans* x, bool commit)
834834
ts->gtid = x->gtid;
835835
ts->nSubxids = 0;
836836
ts->cmd = MSG_INVALID;
837+
ts->votingCompleted = true;
837838
MtmTransactionListAppend(ts);
838839
}
839840
MtmSendNotificationMessage(ts, MSG_ABORTED); /* send notification to coordinator */
@@ -936,6 +937,20 @@ csn_t MtmGetTransactionCSN(TransactionId xid)
936937
return csn;
937938
}
938939

940+
void MtmWakeUpBackend(MtmTransState* ts)
941+
{
942+
MTM_TRACE("Wakeup backed procno=%d, pid=%d\n", ts->procno, ProcGlobal->allProcs[ts->procno].pid);
943+
ts->votingCompleted = true;
944+
SetLatch(&ProcGlobal->allProcs[ts->procno].procLatch);
945+
}
946+
947+
void MtmAbortTransaction(MtmTransState* ts)
948+
{
949+
ts->status = TRANSACTION_STATUS_ABORTED;
950+
MtmAdjustSubtransactions(ts);
951+
Mtm->nActiveTransactions -= 1;
952+
}
953+
939954
/*
940955
* -------------------------------------------
941956
* HA functions
@@ -1212,9 +1227,10 @@ void MtmCheckQuorum(void)
12121227
}
12131228
}
12141229

1215-
12161230
void MtmOnNodeDisconnect(int nodeId)
1217-
{
1231+
{
1232+
MtmTransState *ts;
1233+
12181234
BIT_SET(Mtm->connectivityMask, nodeId-1);
12191235
BIT_SET(Mtm->reconnectMask, nodeId-1);
12201236
RaftableSet(psprintf("node-mask-%d", MtmNodeId), &Mtm->connectivityMask, sizeof Mtm->connectivityMask, false);
@@ -1228,6 +1244,16 @@ void MtmOnNodeDisconnect(int nodeId)
12281244
BIT_SET(Mtm->disabledNodeMask, nodeId-1);
12291245
Mtm->nNodes -= 1;
12301246
MtmCheckQuorum();
1247+
/* Interrupt voting for active transaction and abort them */
1248+
for (ts = Mtm->transListHead; ts != NULL; ts = ts->next) {
1249+
if (!ts->votingCompleted) {
1250+
if (ts->status != TRANSACTION_STATUS_ABORTED) {
1251+
elog(WARNING, "Rollback active transaction %d:%d", ts->gtid.node, ts->gtid.xid);
1252+
MtmAbortTransaction(ts);
1253+
}
1254+
MtmWakeUpBackend(ts);
1255+
}
1256+
}
12311257
}
12321258
MtmUnlock();
12331259
}

multimaster.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -199,8 +199,10 @@ extern void MtmDropNode(int nodeId, bool dropSlot);
199199
extern void MtmRecoverNode(int nodeId);
200200
extern void MtmOnNodeDisconnect(int nodeId);
201201
extern void MtmOnNodeConnect(int nodeId);
202+
extern void MtmWakeUpBackend(MtmTransState* ts);
202203
extern timestamp_t MtmGetCurrentTime(void);
203204
extern void MtmSleep(timestamp_t interval);
205+
extern void MtmAbortTransaction(MtmTransState* ts);
204206
extern void MtmSetCurrentTransactionGID(char const* gid);
205207
extern csn_t MtmGetTransactionCSN(TransactionId xid);
206208
extern void MtmSetCurrentTransactionCSN(csn_t csn);

0 commit comments

Comments
 (0)