phxpaxos icon indicating copy to clipboard operation
phxpaxos copied to clipboard

请问在所有server都未初始化的情况下,首先初始化system variables,这样会不会直接跳过第一条propose请求?

Open liuliuwd opened this issue 6 years ago • 3 comments

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());
}

...... }

liuliuwd avatar Apr 28 '18 07:04 liuliuwd

不会抛弃,会返回错误码然后重试

lynncui00 avatar May 04 '18 08:05 lynncui00

明白了,多谢~

liuliuwd avatar May 07 '18 12:05 liuliuwd

Proposer::CheckNewValue()函数中有一句 m_oIOLoop.AddTimer(m_oCommitCtx.GetTimeoutMs(), Timer_Instance_Commit_Timeout, m_iCommitTimerID); 重试是通过这个定时器超时之后触发的吗?

看这个定时器超时之后会返回给用户错误码,意思是说需要用户自己拿到错误码之后自己重试?

jerry2102 avatar Jul 03 '18 12:07 jerry2102