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;
    }
  }
}
Exemplo n.º 2
0
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;
}
Exemplo n.º 3
0
idgs::ResultCode MembershipTableMgr::multicastLocalMemberStatus(idgs::pb::MemberStatus status) {
  return multicastMemberStatus(getLocalMemberId(), status);
}