phxpaxos
phxpaxos copied to clipboard
请问在所有server都未初始化的情况下,首先初始化system variables,这样会不会直接跳过第一条propose请求?
void Instance :: CheckNewValue() { ...... m_oCommitCtx.StartCommit(m_oProposer.GetInstanceID());
if (m_oCommitCtx.GetTimeoutMs() != -1)
{
m_oIOLoop.AddTimer(m_oCommitCtx.GetTimeoutMs(), Timer_Instance_Commit_Timeout, m_iCommitTimerID);
}
m_oTimeStat.Point();
if (m_poConfig->GetIsUseMembership()
&& (m_oProposer.GetInstanceID() == 0 || m_poConfig->GetGid() == 0))
{
//Init system variables.
PLGHead("Need to init system variables, Now.InstanceID %lu Now.Gid %lu",
m_oProposer.GetInstanceID(), m_poConfig->GetGid());
uint64_t llGid = OtherUtils::GenGid(m_poConfig->GetMyNodeID());
string sInitSVOpValue;
int ret = m_poConfig->GetSystemVSM()->CreateGid_OPValue(llGid, sInitSVOpValue);
assert(ret == 0);
m_oSMFac.PackPaxosValue(sInitSVOpValue, m_poConfig->GetSystemVSM()->SMID());
m_oProposer.NewValue(sInitSVOpValue);
}
else
{
// 当前commit的数据是直接抛弃了吗?
if (m_oOptions.bOpenChangeValueBeforePropose) {
m_oSMFac.BeforePropose(m_poConfig->GetMyGroupIdx(), m_oCommitCtx.GetCommitValue());
}
m_oProposer.NewValue(m_oCommitCtx.GetCommitValue());
}
...... }
不会抛弃,会返回错误码然后重试
明白了,多谢~
Proposer::CheckNewValue()函数中有一句 m_oIOLoop.AddTimer(m_oCommitCtx.GetTimeoutMs(), Timer_Instance_Commit_Timeout, m_iCommitTimerID); 重试是通过这个定时器超时之后触发的吗?
看这个定时器超时之后会返回给用户错误码,意思是说需要用户自己拿到错误码之后自己重试?