应该删除不必要且存在错误的PaxosLog::WriteLog
PaxosLog::WriteLog存在以下问题:
- 没有被调用,是一个不必要的函数。
- 没有设置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;
}
*/
应该删除不必要且存在错误的PaxosLog::WriteLog
PaxosLog::WriteLog存在以下问题:
原代码路径:
src/comm/paxos_msg.proto
src/logstorage/paxos_log.cpp
修改后的代码路径:
src/logstorage/paxos_log.h
src/logstorage/paxos_log.cpp