diff --git a/source/libs/sync/inc/syncRaftCfg.h b/source/libs/sync/inc/syncRaftCfg.h index f0bfb883530287492f7bc44b22026f416ed4b6ed..ba0f9738154475395dd17411b4eb616b5d919b4a 100644 --- a/source/libs/sync/inc/syncRaftCfg.h +++ b/source/libs/sync/inc/syncRaftCfg.h @@ -29,7 +29,7 @@ extern "C" { #define CONFIG_FILE_LEN 2048 -#define MAX_CONFIG_INDEX_COUNT 512 +#define MAX_CONFIG_INDEX_COUNT 256 // SRaftCfgIndex ------------------------------------------ typedef struct SRaftCfgIndex { diff --git a/source/libs/sync/src/syncMain.c b/source/libs/sync/src/syncMain.c index 9f9fdf48443b021578600346488f1adb75efec1a..c7784cd62e29cc22271de137204f69be8023581b 100644 --- a/source/libs/sync/src/syncMain.c +++ b/source/libs/sync/src/syncMain.c @@ -1132,9 +1132,11 @@ void syncNodeStart(SSyncNode* pSyncNode) { syncNodeBecomeFollower(pSyncNode, "first start"); } - int32_t ret = 0; - // ret = syncNodeStartPingTimer(pSyncNode); - ASSERT(ret == 0); + if (pSyncNode->vgId == 1) { + int32_t ret = 0; + ret = syncNodeStartPingTimer(pSyncNode); + ASSERT(ret == 0); + } } void syncNodeStartStandBy(SSyncNode* pSyncNode) { @@ -1146,6 +1148,12 @@ void syncNodeStartStandBy(SSyncNode* pSyncNode) { int32_t electMS = TIMER_MAX_MS; int32_t ret = syncNodeRestartElectTimer(pSyncNode, electMS); ASSERT(ret == 0); + + if (pSyncNode->vgId == 1) { + int32_t ret = 0; + ret = syncNodeStartPingTimer(pSyncNode); + ASSERT(ret == 0); + } } void syncNodeClose(SSyncNode* pSyncNode) { diff --git a/source/libs/sync/src/syncTimeout.c b/source/libs/sync/src/syncTimeout.c index 65314b812a5b6453577ceb1fd2dd8918f6785974..af15c377fbc36ae523776824962f282462ff2bc9 100644 --- a/source/libs/sync/src/syncTimeout.c +++ b/source/libs/sync/src/syncTimeout.c @@ -15,12 +15,55 @@ #include "syncTimeout.h" #include "syncElection.h" +#include "syncRaftCfg.h" #include "syncReplication.h" #include "syncRespMgr.h" +static void syncNodeCleanConfigIndex(SSyncNode* ths) { + int32_t newArrIndex = 0; + SyncIndex newConfigIndexArr[MAX_CONFIG_INDEX_COUNT]; + memset(newConfigIndexArr, 0, sizeof(newConfigIndexArr)); + + SSnapshot snapshot = {0}; + if (ths->pFsm != NULL && ths->pFsm->FpGetSnapshotInfo != NULL) { + ths->pFsm->FpGetSnapshotInfo(ths->pFsm, &snapshot); + } + + if (snapshot.lastApplyIndex != SYNC_INDEX_INVALID) { + for (int i = 0; i < ths->pRaftCfg->configIndexCount; ++i) { + if (ths->pRaftCfg->configIndexArr[i] < snapshot.lastConfigIndex) { + // pass + ; + } else { + // save + newConfigIndexArr[newArrIndex] = ths->pRaftCfg->configIndexArr[i]; + ++newArrIndex; + } + } + + int32_t oldCnt = ths->pRaftCfg->configIndexCount; + ths->pRaftCfg->configIndexCount = newArrIndex; + memcpy(ths->pRaftCfg->configIndexArr, newConfigIndexArr, sizeof(newConfigIndexArr)); + + int32_t code = raftCfgPersist(ths->pRaftCfg); + ASSERT(code == 0); + + do { + char logBuf[128]; + snprintf(logBuf, sizeof(logBuf), "clean config index arr, old-cnt:%d, new-cnt:%d", oldCnt, + ths->pRaftCfg->configIndexCount); + syncNodeEventLog(ths, logBuf); + } while (0); + } +} + int32_t syncNodeTimerRoutine(SSyncNode* ths) { syncNodeEventLog(ths, "timer routines"); + if (ths->vgId == 1) { + syncNodeCleanConfigIndex(ths); + } + #if 0 if (ths->vgId != 1) { syncRespClean(ths->pSyncRespMgr); @@ -41,7 +84,7 @@ int32_t syncNodeOnTimeoutCb(SSyncNode* ths, SyncTimeout* pMsg) { // syncNodePingAll(ths); // syncNodePingPeers(ths); - sTrace("vgId:%d, sync timeout, type:ping count:%d", ths->vgId, ths->pingTimerCounter); + // sTrace("vgId:%d, sync timeout, type:ping count:%d", ths->vgId, ths->pingTimerCounter); syncNodeTimerRoutine(ths); }