refactor(sync): block when changing
This commit is contained in:
parent
e441bd266b
commit
3573ae1564
|
@ -199,7 +199,7 @@ char* syncNode2Str(const SSyncNode* pSyncNode);
|
|||
void syncNodeEventLog(const SSyncNode* pSyncNode, char* str);
|
||||
char* syncNode2SimpleStr(const SSyncNode* pSyncNode);
|
||||
bool syncNodeInConfig(SSyncNode* pSyncNode, const SSyncCfg* config);
|
||||
void syncNodeDoConfigChange(SSyncNode* pSyncNode, SSyncCfg* newConfig, SyncIndex lastConfigChangeIndex, bool* isDrop);
|
||||
void syncNodeDoConfigChange(SSyncNode* pSyncNode, SSyncCfg* newConfig, SyncIndex lastConfigChangeIndex);
|
||||
|
||||
SSyncNode* syncNodeAcquire(int64_t rid);
|
||||
void syncNodeRelease(SSyncNode* pNode);
|
||||
|
|
|
@ -1366,11 +1366,41 @@ bool syncNodeInConfig(SSyncNode* pSyncNode, const SSyncCfg* config) {
|
|||
return b1;
|
||||
}
|
||||
|
||||
void syncNodeDoConfigChange(SSyncNode* pSyncNode, SSyncCfg* pNewConfig, SyncIndex lastConfigChangeIndex, bool* isDrop) {
|
||||
void syncNodeDoConfigChange(SSyncNode* pSyncNode, SSyncCfg* pNewConfig, SyncIndex lastConfigChangeIndex) {
|
||||
SSyncCfg oldConfig = pSyncNode->pRaftCfg->cfg;
|
||||
pSyncNode->pRaftCfg->cfg = *pNewConfig;
|
||||
pSyncNode->pRaftCfg->lastConfigIndex = lastConfigChangeIndex;
|
||||
|
||||
bool IamInOld = syncNodeInConfig(pSyncNode, &oldConfig);
|
||||
bool IamInNew = syncNodeInConfig(pSyncNode, pNewConfig);
|
||||
|
||||
bool isDrop = false;
|
||||
bool isAdd = false;
|
||||
|
||||
if (IamInOld && !IamInNew) {
|
||||
isDrop = true;
|
||||
} else {
|
||||
isDrop = false;
|
||||
}
|
||||
|
||||
if (!IamInOld && IamInNew) {
|
||||
isAdd = true;
|
||||
} else {
|
||||
isAdd = false;
|
||||
}
|
||||
|
||||
if (IamInNew) {
|
||||
pSyncNode->pRaftCfg->isStandBy = 0; // change isStandBy to normal
|
||||
}
|
||||
if (isDrop) {
|
||||
pSyncNode->pRaftCfg->isStandBy = 1; // set standby
|
||||
}
|
||||
|
||||
// persist last config index
|
||||
raftCfgAddConfigIndex(pSyncNode->pRaftCfg, lastConfigChangeIndex);
|
||||
|
||||
if (IamInNew) {
|
||||
//-----------------------------------------
|
||||
int32_t ret = 0;
|
||||
|
||||
// save snapshot senders
|
||||
|
@ -1450,8 +1480,9 @@ void syncNodeDoConfigChange(SSyncNode* pSyncNode, SSyncCfg* pNewConfig, SyncInde
|
|||
|
||||
do {
|
||||
char eventLog[256];
|
||||
snprintf(eventLog, sizeof(eventLog), "snapshot sender udpate replicaIndex from %d to %d, %s:%d, %p, reset:%d",
|
||||
oldreplicaIndex, i, host, port, (pSyncNode->senders)[i], reset);
|
||||
snprintf(eventLog, sizeof(eventLog),
|
||||
"snapshot sender udpate replicaIndex from %d to %d, %s:%d, %p, reset:%d", oldreplicaIndex, i, host,
|
||||
port, (pSyncNode->senders)[i], reset);
|
||||
syncNodeEventLog(pSyncNode, eventLog);
|
||||
} while (0);
|
||||
}
|
||||
|
@ -1484,28 +1515,39 @@ void syncNodeDoConfigChange(SSyncNode* pSyncNode, SSyncCfg* pNewConfig, SyncInde
|
|||
}
|
||||
}
|
||||
|
||||
bool IamInOld = syncNodeInConfig(pSyncNode, &oldConfig);
|
||||
bool IamInNew = syncNodeInConfig(pSyncNode, pNewConfig);
|
||||
|
||||
*isDrop = true;
|
||||
if (IamInOld && !IamInNew) {
|
||||
*isDrop = true;
|
||||
} else {
|
||||
*isDrop = false;
|
||||
}
|
||||
|
||||
// may be add me to a new raft group
|
||||
if (IamInOld && IamInNew && oldConfig.replicaNum == 1) {
|
||||
}
|
||||
|
||||
if (IamInNew) {
|
||||
pSyncNode->pRaftCfg->isStandBy = 0; // change isStandBy to normal
|
||||
}
|
||||
// persist
|
||||
raftCfgPersist(pSyncNode->pRaftCfg);
|
||||
|
||||
if (gRaftDetailLog) {
|
||||
syncNodeLog2("==syncNodeDoConfigChange==", pSyncNode);
|
||||
char tmpbuf[512];
|
||||
char* oldStr = syncCfg2SimpleStr(&oldConfig);
|
||||
char* newStr = syncCfg2SimpleStr(pNewConfig);
|
||||
snprintf(tmpbuf, sizeof(tmpbuf), "config change from %d to %d, index:%ld, %s --> %s", oldConfig.replicaNum,
|
||||
pNewConfig->replicaNum, lastConfigChangeIndex, oldStr, newStr);
|
||||
taosMemoryFree(oldStr);
|
||||
taosMemoryFree(newStr);
|
||||
|
||||
// change isStandBy to normal (election timeout)
|
||||
if (pSyncNode->state == TAOS_SYNC_STATE_LEADER) {
|
||||
syncNodeBecomeLeader(pSyncNode, tmpbuf);
|
||||
} else {
|
||||
syncNodeBecomeFollower(pSyncNode, tmpbuf);
|
||||
}
|
||||
} else {
|
||||
// persist
|
||||
raftCfgPersist(pSyncNode->pRaftCfg);
|
||||
|
||||
char tmpbuf[512];
|
||||
char* oldStr = syncCfg2SimpleStr(&oldConfig);
|
||||
char* newStr = syncCfg2SimpleStr(pNewConfig);
|
||||
snprintf(tmpbuf, sizeof(tmpbuf), "do not config change from %d to %d, index:%ld, %s --> %s", oldConfig.replicaNum,
|
||||
pNewConfig->replicaNum, lastConfigChangeIndex, oldStr, newStr);
|
||||
taosMemoryFree(oldStr);
|
||||
taosMemoryFree(newStr);
|
||||
syncNodeEventLog(pSyncNode, tmpbuf);
|
||||
}
|
||||
|
||||
_END:
|
||||
return;
|
||||
}
|
||||
|
||||
SSyncNode* syncNodeAcquire(int64_t rid) {
|
||||
|
@ -2275,47 +2317,11 @@ static int32_t syncNodeConfigChange(SSyncNode* ths, SRpcMsg* pRpcMsg, SSyncRaftE
|
|||
int32_t ret = syncCfgFromStr(pRpcMsg->pCont, &newSyncCfg);
|
||||
ASSERT(ret == 0);
|
||||
|
||||
// persist last config index
|
||||
raftCfgAddConfigIndex(ths->pRaftCfg, pEntry->index);
|
||||
raftCfgPersist(ths->pRaftCfg);
|
||||
|
||||
// update new config myIndex
|
||||
syncNodeUpdateNewConfigIndex(ths, &newSyncCfg);
|
||||
|
||||
bool isDrop = false;
|
||||
bool IamInNew = syncNodeInConfig(ths, &newSyncCfg);
|
||||
if (IamInNew) {
|
||||
// do config change
|
||||
syncNodeDoConfigChange(ths, &newSyncCfg, pEntry->index, &isDrop);
|
||||
|
||||
// change isStandBy to normal
|
||||
if (!isDrop) {
|
||||
char tmpbuf[512];
|
||||
char* oldStr = syncCfg2SimpleStr(&oldSyncCfg);
|
||||
char* newStr = syncCfg2SimpleStr(&newSyncCfg);
|
||||
snprintf(tmpbuf, sizeof(tmpbuf), "config change from %d to %d, index:%ld, %s --> %s", oldSyncCfg.replicaNum,
|
||||
newSyncCfg.replicaNum, pEntry->index, oldStr, newStr);
|
||||
taosMemoryFree(oldStr);
|
||||
taosMemoryFree(newStr);
|
||||
|
||||
if (ths->state == TAOS_SYNC_STATE_LEADER) {
|
||||
syncNodeBecomeLeader(ths, tmpbuf);
|
||||
} else {
|
||||
syncNodeBecomeFollower(ths, tmpbuf);
|
||||
}
|
||||
}
|
||||
|
||||
} else {
|
||||
char tmpbuf[512];
|
||||
char* oldStr = syncCfg2SimpleStr(&oldSyncCfg);
|
||||
char* newStr = syncCfg2SimpleStr(&newSyncCfg);
|
||||
snprintf(tmpbuf, sizeof(tmpbuf), "config change2 from %d to %d, index:%ld, %s --> %s", oldSyncCfg.replicaNum,
|
||||
newSyncCfg.replicaNum, pEntry->index, oldStr, newStr);
|
||||
taosMemoryFree(oldStr);
|
||||
taosMemoryFree(newStr);
|
||||
|
||||
syncNodeBecomeFollower(ths, tmpbuf);
|
||||
}
|
||||
syncNodeDoConfigChange(ths, &newSyncCfg, pEntry->index);
|
||||
|
||||
// set pFinish
|
||||
pFinish->oldCfg = oldSyncCfg;
|
||||
|
|
|
@ -539,42 +539,9 @@ int32_t syncNodeOnSnapshotSendCb(SSyncNode *pSyncNode, SyncSnapshotSend *pMsg) {
|
|||
// update new config myIndex
|
||||
SSyncCfg newSyncCfg = pMsg->lastConfig;
|
||||
syncNodeUpdateNewConfigIndex(pSyncNode, &newSyncCfg);
|
||||
bool IamInNew = syncNodeInConfig(pSyncNode, &newSyncCfg);
|
||||
|
||||
bool isDrop = false;
|
||||
if (IamInNew) {
|
||||
char eventLog[128];
|
||||
snprintf(eventLog, sizeof(eventLog),
|
||||
"update config by snapshot, lastIndex:%ld, lastTerm:%lu, lastConfigIndex:%ld", pMsg->lastIndex,
|
||||
pMsg->lastTerm, pMsg->lastConfigIndex);
|
||||
syncNodeEventLog(pSyncNode, eventLog);
|
||||
|
||||
syncNodeDoConfigChange(pSyncNode, &newSyncCfg, pMsg->lastConfigIndex, &isDrop);
|
||||
|
||||
} else {
|
||||
char eventLog[128];
|
||||
snprintf(eventLog, sizeof(eventLog),
|
||||
"do not update config by snapshot, not in new, lastIndex:%ld, lastTerm:%lu, lastConfigIndex:%ld",
|
||||
pMsg->lastIndex, pMsg->lastTerm, pMsg->lastConfigIndex);
|
||||
syncNodeEventLog(pSyncNode, eventLog);
|
||||
}
|
||||
|
||||
// change isStandBy to normal
|
||||
if (!isDrop) {
|
||||
char tmpbuf[512];
|
||||
char *oldStr = syncCfg2SimpleStr(&oldSyncCfg);
|
||||
char *newStr = syncCfg2SimpleStr(&newSyncCfg);
|
||||
snprintf(tmpbuf, sizeof(tmpbuf), "config change3 from %d to %d, index:%ld, %s --> %s",
|
||||
oldSyncCfg.replicaNum, newSyncCfg.replicaNum, pMsg->lastConfigIndex, oldStr, newStr);
|
||||
taosMemoryFree(oldStr);
|
||||
taosMemoryFree(newStr);
|
||||
|
||||
if (pSyncNode->state == TAOS_SYNC_STATE_LEADER) {
|
||||
syncNodeBecomeLeader(pSyncNode, tmpbuf);
|
||||
} else {
|
||||
syncNodeBecomeFollower(pSyncNode, tmpbuf);
|
||||
}
|
||||
}
|
||||
// do config change
|
||||
syncNodeDoConfigChange(pSyncNode, &newSyncCfg, pMsg->lastConfigIndex);
|
||||
}
|
||||
|
||||
SSnapshot snapshot;
|
||||
|
|
Loading…
Reference in New Issue