int PNode :: AddMember(const int iGroupIdx, const NodeInfo & oNode) { if (!CheckGroupID(iGroupIdx)) { return Paxos_GroupIdxWrong; } SystemVSM * poSystemVSM = m_vecGroupList[iGroupIdx]->GetConfig()->GetSystemVSM(); if (poSystemVSM->GetGid() == 0) { return Paxos_MembershipOp_NoGid; } uint64_t llVersion = 0; NodeInfoList vecNodeInfoList; poSystemVSM->GetMembership(vecNodeInfoList, llVersion); for (auto & oNodeInfo : vecNodeInfoList) { if (oNodeInfo.GetNodeID() == oNode.GetNodeID()) { return Paxos_MembershipOp_Add_NodeExist; } } vecNodeInfoList.push_back(oNode); return ProposalMembership(poSystemVSM, iGroupIdx, vecNodeInfoList, llVersion); }
void MakeConfig(MockLogStorage * poMockLogStorage, Config *& poConfig) { string sIP = "127.0.0.1"; int iPort = 11111; NodeInfo oMyNode(sIP, iPort); NodeInfoList vecNodeInfoList; for (int i = 0; i < 3; i++) { vecNodeInfoList.push_back(NodeInfo(sIP, iPort)); iPort++; } FollowerNodeInfoList vecFollowerNodeInfoList; int iMyGroupIdx = 0; int iGroupCount = 1; poConfig = nullptr; poConfig = new Config(poMockLogStorage, true, 0, false, oMyNode, vecNodeInfoList, vecFollowerNodeInfoList, iMyGroupIdx, iGroupCount, nullptr); assert(poConfig != nullptr); EXPECT_CALL(*poMockLogStorage, GetSystemVariables(_,_)).Times(1).WillOnce(Return(1)); poConfig->Init(); }
int parse_ipport_list(const char * pcStr, NodeInfoList & vecNodeInfoList) { string sTmpStr; int iStrLen = strlen(pcStr); for (int i = 0; i < iStrLen; i++) { if (pcStr[i] == ',' || i == iStrLen - 1) { if (i == iStrLen - 1 && pcStr[i] != ',') { sTmpStr += pcStr[i]; } NodeInfo oNodeInfo; int ret = parse_ipport(sTmpStr.c_str(), oNodeInfo); if (ret != 0) { return ret; } vecNodeInfoList.push_back(oNodeInfo); sTmpStr = ""; } else { sTmpStr += pcStr[i]; } } return 0; }
int PNode :: ChangeMember(const int iGroupIdx, const NodeInfo & oFromNode, const NodeInfo & oToNode) { if (!CheckGroupID(iGroupIdx)) { return Paxos_GroupIdxWrong; } SystemVSM * poSystemVSM = m_vecGroupList[iGroupIdx]->GetConfig()->GetSystemVSM(); if (poSystemVSM->GetGid() == 0) { return Paxos_MembershipOp_NoGid; } uint64_t llVersion = 0; NodeInfoList vecNodeInfoList; poSystemVSM->GetMembership(vecNodeInfoList, llVersion); NodeInfoList vecAfterNodeInfoList; bool bFromNodeExist = false; bool bToNodeExist = false; for (auto & oNodeInfo : vecNodeInfoList) { if (oNodeInfo.GetNodeID() == oFromNode.GetNodeID()) { bFromNodeExist = true; continue; } else if (oNodeInfo.GetNodeID() == oToNode.GetNodeID()) { bToNodeExist = true; continue; } vecAfterNodeInfoList.push_back(oNodeInfo); } if ((!bFromNodeExist) && bToNodeExist) { return Paxos_MembershipOp_Change_NoChange; } vecAfterNodeInfoList.push_back(oToNode); return ProposalMembership(poSystemVSM, iGroupIdx, vecAfterNodeInfoList, llVersion); }
void SystemVSM :: GetMembership(NodeInfoList & vecNodeInfoList, uint64_t & llVersion) { //must must get version first! llVersion = m_oSystemVariables.version(); for (int i = 0; i < m_oSystemVariables.membership_size(); i++) { PaxosNodeInfo oNodeInfo = m_oSystemVariables.membership(i); NodeInfo tTmpNode(oNodeInfo.nodeid()); vecNodeInfoList.push_back(tTmpNode); } }
int PNode :: RemoveMember(const int iGroupIdx, const NodeInfo & oNode) { if (!CheckGroupID(iGroupIdx)) { return Paxos_GroupIdxWrong; } SystemVSM * poSystemVSM = m_vecGroupList[iGroupIdx]->GetConfig()->GetSystemVSM(); if (poSystemVSM->GetGid() == 0) { return Paxos_MembershipOp_NoGid; } uint64_t llVersion = 0; NodeInfoList vecNodeInfoList; poSystemVSM->GetMembership(vecNodeInfoList, llVersion); bool bNodeExist = false; NodeInfoList vecAfterNodeInfoList; for (auto & oNodeInfo : vecNodeInfoList) { if (oNodeInfo.GetNodeID() == oNode.GetNodeID()) { bNodeExist = true; } else { vecAfterNodeInfoList.push_back(oNodeInfo); } } if (!bNodeExist) { return Paxos_MembershipOp_Remove_NodeNotExist; } return ProposalMembership(poSystemVSM, iGroupIdx, vecAfterNodeInfoList, llVersion); }
void SystemVSM :: RefleshNodeID() { m_setNodeID.clear(); NodeInfoList vecNodeInfoList; for (int i = 0; i < m_oSystemVariables.membership_size(); i++) { PaxosNodeInfo oNodeInfo = m_oSystemVariables.membership(i); NodeInfo tTmpNode(oNodeInfo.nodeid()); PLG1Head("ip %s port %d nodeid %lu", tTmpNode.GetIP().c_str(), tTmpNode.GetPort(), tTmpNode.GetNodeID()); m_setNodeID.insert(tTmpNode.GetNodeID()); vecNodeInfoList.push_back(tTmpNode); } if (m_pMembershipChangeCallback != nullptr) { m_pMembershipChangeCallback(m_iMyGroupIdx, vecNodeInfoList); } }