void AggregatorActor::multicast(const ActorMessagePtr& msg, const string& actorId, const std::string& opName) { requestCount = 0; responseCount = 0; auto memberMgr = idgs_application()->getMemberManager(); auto& members = memberMgr->getMemberTable(); auto it = members.begin(); for (; it != members.end(); ++ it) { if (it->isLocalStore() && (it->getState() == idgs::pb::MS_ACTIVE || it->getState() == idgs::pb::MS_PREPARED)) { ActorMessagePtr multMsg = msg->createRouteMessage(it->getId(), actorId); multMsg->setOperationName(opName); multMsg->setSourceActorId(this->getActorId()); multMsg->setSourceMemberId(memberMgr->getLocalMemberId()); ::idgs::actor::postMessage(multMsg); ++ requestCount; } } }
idgs::ResultCode MembershipTableMgr::memberLeft(const std::vector<MemberWrapper*>& leftMembers) { function_footprint(); if (!getLocalMember()) { return RC_OK; } for(auto it = leftMembers.begin(); it != leftMembers.end(); ++it) { // local member exists in left member list, quit, do nothing if(getLocalMemberId() == (*it)->getId()) { ///left member itself, do nothing return RC_OK; } } MemberWrapper* leaveLeadingMember = NULL; for(auto it = leftMembers.begin(); it != leftMembers.end(); ++it) { // check if exists leading leave if ((*it)->isLeading()) { leaveLeadingMember = *it; break; } } if(leaveLeadingMember) { /// leading member leave MemberWrapper* newLeadingMember = selectLeading(leftMembers); if(!newLeadingMember) { // no member can be selected as leading,quit! return RC_OK; } DVLOG(0) << "Member " << *newLeadingMember << " is selected as leading"; newLeadingMember->setIsleading(true); leaveLeadingMember->setIsleading(false); for(auto it = leftMembers.begin(); it != leftMembers.end(); ++it) { setMemberStatus(*it, INACTIVE); } } /// end if else { /// normal member leave for(auto it = leftMembers.begin(); it != leftMembers.end(); ++it) { // local member exists in left member list, quit, do nothing setMemberStatus(*it, INACTIVE); } } LOG(INFO) << toSimpleString(); return RC_OK; }
idgs::ResultCode MembershipTableMgr::multicastLocalMemberStatus(idgs::pb::MemberStatus status) { return multicastMemberStatus(getLocalMemberId(), status); }