lichao
2021-06-03 8967e7f2f8b94dc032135707e16c8a9f233d0db6
src/topic_node.cpp
@@ -50,8 +50,8 @@
} // namespace
TopicNode::TopicNode(SharedMemory &shm) :
    shm_(shm), state_(eStateUninited)
TopicNode::TopicNode(SharedMemory &shm, MQId ssn_id) :
    shm_(shm), state_(eStateUninited), ssn_id_(ssn_id)
{
}
@@ -497,9 +497,10 @@
   out_msg_id = msg_id;
   auto SendTo = [this, msg_id](const MQInfo &remote, const MsgRequestTopic &req, const RequestResultCB &cb) {
   auto SendTo = [this, remote_addr, msg_id](const MQInfo &remote, const MsgRequestTopic &req, const RequestResultCB &cb) {
      auto &sock = SockClient();
      BHMsgHead head(InitMsgHead(GetType(req), proc_id(), ssn(), msg_id));
      *head.mutable_dest() = remote_addr;
      AddRoute(head, sock);
      head.set_topic(req.topic());
@@ -519,8 +520,12 @@
   };
   try {
      BHAddress addr;
      return (ClientQueryRPCTopic(req.topic(), addr, 3000)) && SendTo(MQInfo{addr.mq_id(), addr.abs_addr()}, req, cb);
      if (remote_addr.ip().empty()) {
         BHAddress addr;
         return (ClientQueryRPCTopic(req.topic(), addr, 3000)) && SendTo(MQInfo{addr.mq_id(), addr.abs_addr()}, req, cb);
      } else {
         return SendTo(CenterAddr(), req, cb);
      }
   } catch (...) {
      SetLastError(eError, "internal error.");
      return false;
@@ -536,26 +541,36 @@
   try {
      auto &sock = SockClient();
      BHAddress addr;
      if (ClientQueryRPCTopic(request.topic(), addr, timeout_ms)) {
         LOG_TRACE() << "node: " << SockNode().id() << ", topic dest: " << addr.mq_id();
         BHMsgHead head(InitMsgHead(GetType(request), proc_id(), ssn()));
         AddRoute(head, sock);
         head.set_topic(request.topic());
         MsgI reply_msg(shm());
         DEFER1(reply_msg.Release(););
         BHMsgHead reply_head;
         if (sock.SendAndRecv({addr.mq_id(), addr.abs_addr()}, head, request, reply_msg, reply_head, timeout_ms) &&
             reply_head.type() == kMsgTypeRequestTopicReply &&
             reply_msg.ParseBody(out_reply)) {
            reply_head.mutable_proc_id()->swap(out_proc_id);
            return true;
      MQInfo dest;
      if (!remote_addr.ip().empty()) {
         dest = CenterAddr();
      } else {
         BHAddress addr;
         if (ClientQueryRPCTopic(request.topic(), addr, timeout_ms)) {
            dest.offset_ = addr.abs_addr();
            dest.id_ = addr.mq_id();
         } else {
            return false;
         }
      }
   } catch (...) {
      BHMsgHead head(InitMsgHead(GetType(request), proc_id(), ssn()));
      *head.mutable_dest() = remote_addr;
      AddRoute(head, sock);
      head.set_topic(request.topic());
      MsgI reply_msg(shm());
      DEFER1(reply_msg.Release(););
      BHMsgHead reply_head;
      if (sock.SendAndRecv(dest, head, request, reply_msg, reply_head, timeout_ms) &&
          reply_head.type() == kMsgTypeRequestTopicReply &&
          reply_msg.ParseBody(out_reply)) {
         reply_head.mutable_proc_id()->swap(out_proc_id);
         return true;
      }
   } catch (std::exception &e) {
      LOG_ERROR() << __func__ << " exception: " << e.what();
      SetLastError(eError, __func__ + std::string(" internal errer."));
   }
   return false;
@@ -658,7 +673,6 @@
                reply.ParseBody(reply_body) &&
                IsSuccess(reply_body.errmsg().errcode());
      }
      // TODO wait for result?
   } catch (...) {
      return false;
   }
@@ -704,12 +718,12 @@
         return false;
      }
   }
   //TODO error msg.
   if (head.type() == kMsgTypePublish) {
      if (pub.ParseFromString(body)) {
         head.mutable_proc_id()->swap(proc_id);
         return true;
      }
   }
   SetLastError(eError, "invalid subcribe msg received.");
   return false;
}