Skip to content

应该删除不必要且存在错误的PaxosLog::WriteLog #285

Description

@dyx2025

应该删除不必要且存在错误的PaxosLog::WriteLog

PaxosLog::WriteLog存在以下问题:

  1. 没有被调用,是一个不必要的函数。
  2. 没有设置AcceptorStateData的必要字段Checksum。被调用的时候,在PaxosLog::WriteState对AcceptorStateData序列化的时候会触发程序abort。

原代码路径:
src/comm/paxos_msg.proto

message AcceptorStateData
{
    required uint64 InstanceID = 1;
    required uint64 PromiseID = 2;
    required uint64 PromiseNodeID = 3;
    required uint64 AcceptedID = 4;
    required uint64 AcceptedNodeID = 5;
    required bytes AcceptedValue = 6;
    required uint32 Checksum = 7;  // Checksum是必须设置的字段
};

src/logstorage/paxos_log.cpp

int PaxosLog :: WriteLog(const WriteOptions & oWriteOptions, const int iGroupIdx, const uint64_t llInstanceID, const std::string & sValue)
{
    const int m_iMyGroupIdx = iGroupIdx;

    // 没有设置AcceptorStateData的必要字段Checksum
    AcceptorStateData oState;
    oState.set_instanceid(llInstanceID);
    oState.set_acceptedvalue(sValue);
    oState.set_promiseid(0);
    oState.set_promisenodeid(nullnode);
    oState.set_acceptedid(0);
    oState.set_acceptednodeid(nullnode);

    int ret = WriteState(oWriteOptions, iGroupIdx, llInstanceID, oState);
    if (ret != 0)
    {   
        PLG1Err("WriteState to db fail, groupidx %d instanceid %lu ret %d", iGroupIdx, llInstanceID, ret);
        return ret;
    }   

    PLG1Imp("OK, groupidx %d InstanceID %lu valuelen %zu", 
            iGroupIdx, llInstanceID, sValue.size());

    return 0;
}

// ...

int PaxosLog :: WriteState(const WriteOptions & oWriteOptions, const int iGroupIdx, const uint64_t llInstanceID, const AcceptorStateData & oState)
{
    const int m_iMyGroupIdx = iGroupIdx;

    // PaxosLog::WriteLog调用PaxosLog::WriteState时,对AcceptorStateData序列化的时候会触发程序abort
    string sBuffer;
    bool sSucc = oState.SerializeToString(&sBuffer);
    if (!sSucc)
    {
        PLG1Err("State.Serialize fail");
        return -1;
    }
    
    int ret = m_poLogStorage->Put(oWriteOptions, iGroupIdx, llInstanceID, sBuffer);
    if (ret != 0)
    {
        PLG1Err("DB.Put fail, groupidx %d bufferlen %zu ret %d", 
                iGroupIdx, sBuffer.size(), ret);
        return ret;
    }

    return 0;
}

修改后的代码路径:
src/logstorage/paxos_log.h

class PaxosLog
{
    // ...
    // 删除PaxosLog::WriteLog
    // int WriteLog(const WriteOptions & oWriteOptions, const int iGroupIdx, const uint64_t llInstanceID, const std::string & sValue);
    // ...
};

src/logstorage/paxos_log.cpp

// 删除PaxosLog::WriteLog
/*
int PaxosLog :: WriteLog(const WriteOptions & oWriteOptions, const int iGroupIdx, const uint64_t llInstanceID, const std::string & sValue)
{
    const int m_iMyGroupIdx = iGroupIdx;

    AcceptorStateData oState;
    oState.set_instanceid(llInstanceID);
    oState.set_acceptedvalue(sValue);
    oState.set_promiseid(0);
    oState.set_promisenodeid(nullnode);
    oState.set_acceptedid(0);
    oState.set_acceptednodeid(nullnode);

    int ret = WriteState(oWriteOptions, iGroupIdx, llInstanceID, oState);
    if (ret != 0)
    {   
        PLG1Err("WriteState to db fail, groupidx %d instanceid %lu ret %d", iGroupIdx, llInstanceID, ret);
        return ret;
    }   

    PLG1Imp("OK, groupidx %d InstanceID %lu valuelen %zu", 
            iGroupIdx, llInstanceID, sValue.size());

    return 0;
}
*/

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