diff --git a/src/cm_server/cms_arbitrate_datanode_pms.cpp b/src/cm_server/cms_arbitrate_datanode_pms.cpp index 490d1ee..104b5b6 100644 --- a/src/cm_server/cms_arbitrate_datanode_pms.cpp +++ b/src/cm_server/cms_arbitrate_datanode_pms.cpp @@ -405,6 +405,14 @@ static void GetDnStaticRoleFromDdb(const DnArbCtx *ctx) } else { GetDatanodeDynamicConfigChangeFromDdb(ctx->groupIdx); } + if (g_needIncTermToDdbAgain) { + (void)pthread_rwlock_wrlock(&term_update_rwlock); + /* Prevent multiple worker threads from increasing term at the same time. */ + if (g_needIncTermToDdbAgain) { + (void)IncrementTermToDdb(); + } + (void)pthread_rwlock_unlock(&term_update_rwlock); + } } static void ResetHeartbeat(const DnArbCtx *ctx) @@ -1463,7 +1471,9 @@ static bool MoreDyPrimary(DnArbCtx *ctx, const char *typeName) if (ctx->cond.igPrimaryCount >= 1 && ctx->instId != ctx->repGroup->lastFailoverDn) { SendRestartMsg(ctx, typeName); write_runlog(LOG, "Dynamic primary %u is not last failover dn, restart to cascade_standby.\n", ctx->instId); + return true; } + return false; } /* restart dn instance */