Skip to content

消除AcceptorState::Load不必要的拷贝 #292

Description

@dyx2025

消除AcceptorState::Load不必要的拷贝

AcceptorState::Load的m_sAcceptedValue可以通过移动oState的acceptednodeid,减少不必要的拷贝。#214 的测试数据支持这一做法。

原代码路径:
src/algorithm/acceptor.cpp

int AcceptorState :: Load(uint64_t & llInstanceID)
{
    int ret = m_oPaxosLog.GetMaxInstanceIDFromLog(m_poConfig->GetMyGroupIdx(), llInstanceID);
    if (ret != 0 && ret != 1)
    {   
        PLGErr("Load max instance id fail, ret %d", ret);
        return ret;
    }   

    if (ret == 1)
    {   
        PLGErr("empty database");
        llInstanceID = 0;
        return 0;
    }   

    AcceptorStateData oState;
    ret = m_oPaxosLog.ReadState(m_poConfig->GetMyGroupIdx(), llInstanceID, oState);
    if (ret != 0)
    {   
        return ret;
    }   
        
    m_oPromiseBallot.m_llProposalID = oState.promiseid();
    m_oPromiseBallot.m_llNodeID = oState.promisenodeid();
    m_oAcceptedBallot.m_llProposalID = oState.acceptedid();
    m_oAcceptedBallot.m_llNodeID = oState.acceptednodeid();
    m_sAcceptedValue = oState.acceptedvalue();  // 赋值,产生字符串拷贝
    m_iChecksum = oState.checksum();
        
    PLGImp("GroupIdx %d InstanceID %lu PromiseID %lu PromiseNodeID %lu"
           " AccectpedID %lu AcceptedNodeID %lu ValueLen %zu Checksum %u", 
            m_poConfig->GetMyGroupIdx(), llInstanceID, m_oPromiseBallot.m_llProposalID, 
            m_oPromiseBallot.m_llNodeID, m_oAcceptedBallot.m_llProposalID, 
            m_oAcceptedBallot.m_llNodeID, m_sAcceptedValue.size(), m_iChecksum);
        
    return 0;
} 

修改后的代码路径:
src/algorithm/acceptor.cpp

int AcceptorState :: Load(uint64_t & llInstanceID)
{
    int ret = m_oPaxosLog.GetMaxInstanceIDFromLog(m_poConfig->GetMyGroupIdx(), llInstanceID);
    if (ret != 0 && ret != 1)
    {   
        PLGErr("Load max instance id fail, ret %d", ret);
        return ret;
    }   

    if (ret == 1)
    {   
        PLGErr("empty database");
        llInstanceID = 0;
        return 0;
    }   

    AcceptorStateData oState;
    ret = m_oPaxosLog.ReadState(m_poConfig->GetMyGroupIdx(), llInstanceID, oState);
    if (ret != 0)
    {   
        return ret;
    }   
        
    m_oPromiseBallot.m_llProposalID = oState.promiseid();
    m_oPromiseBallot.m_llNodeID = oState.promisenodeid();
    m_oAcceptedBallot.m_llProposalID = oState.acceptedid();
    m_oAcceptedBallot.m_llNodeID = oState.acceptednodeid();
    // 修改代码
    // m_sAcceptedValue = oState.acceptedvalue();
    m_sAcceptedValue = std::move(*(oState.mutable_acceptedvalue()));
    m_iChecksum = oState.checksum();
        
    PLGImp("GroupIdx %d InstanceID %lu PromiseID %lu PromiseNodeID %lu"
           " AccectpedID %lu AcceptedNodeID %lu ValueLen %zu Checksum %u", 
            m_poConfig->GetMyGroupIdx(), llInstanceID, m_oPromiseBallot.m_llProposalID, 
            m_oPromiseBallot.m_llNodeID, m_oAcceptedBallot.m_llProposalID, 
            m_oAcceptedBallot.m_llNodeID, m_sAcceptedValue.size(), m_iChecksum);
        
    return 0;
} 

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions