idgs::store::ListenerResultCode RddStoreListener::insert(idgs::store::ListenerContext* context) {
  if (!rddLocal) {
    LOG(ERROR) << "RDD is not found.";
    return idgs::store::LRC_CONTINUE;
  }

  auto& key = * context->getKey();
  auto& value = * context->getValue();

  if (rddLocal->isReplicatedRdd()) {
    auto partitions = rddLocal->getLocalPartitions();
    auto it = partitions.begin();
    for (; it != partitions.end(); ++ it) {
      auto partitionActor = rddLocal->getPartitionActor(* it);

      idgs::actor::ActorMessagePtr message = std::make_shared<idgs::actor::ActorMessage>();
      message->setOperationName(RDD_STORE_LISTENER);
      message->setSourceActorId(partitionActor.actor_id());
      message->setSourceMemberId(partitionActor.member_id());
      message->setDestActorId(partitionActor.actor_id());
      message->setDestMemberId(partitionActor.member_id());
      message->setPayload(std::make_shared<pb::RddRequest>());
      message->setAttachment(RE_PARTITION_KEY, key);
      message->setAttachment(RE_PARTITION_VALUE, value);
      idgs::actor::postMessage(message);
    }
  } else {
    auto partitionId = context->getPartitionId();
    auto partitionActor = rddLocal->getPartitionActor(partitionId);

    idgs::actor::ActorMessagePtr message = std::make_shared<idgs::actor::ActorMessage>();
    message->setOperationName(RDD_STORE_LISTENER);
    message->setSourceActorId(partitionActor.actor_id());
    message->setSourceMemberId(partitionActor.member_id());
    message->setDestActorId(partitionActor.actor_id());
    message->setDestMemberId(partitionActor.member_id());
    message->setPayload(std::make_shared<pb::RddRequest>());
    message->setAttachment(RE_PARTITION_KEY, key);
    message->setAttachment(RE_PARTITION_VALUE, value);
    idgs::actor::sendMessage(message);
  }

  return idgs::store::LRC_CONTINUE;
}
void MembershipTableMgr::handleMemberStatusEvent(const std::shared_ptr<ActorMessage>& actor_msg_ptr) {
  function_footprint();
  if (members.empty() || !getLocalMember()) {
    return;
  }
  auto payload = dynamic_cast<MemberStatusEvent*>(actor_msg_ptr->getPayload().get());
  uint32_t pos = payload->member_id();
  auto status = payload->status();
  auto member = getMember(pos);
  if (!member) {
    return;
  }
  setMemberStatus(member, status);
  if(member->isPrepared()) {
    DVLOG(0) << toSimpleString();
    joining.store(false);
  }
}