From cf05ea3d9f43e4e84d621e1f9d54cbef552b6e2b Mon Sep 17 00:00:00 2001
From: lichao <lichao@aiotlink.com>
Date: 星期二, 18 五月 2021 16:53:28 +0800
Subject: [PATCH] fix center init mutex.

---
 src/topic_node.h |   47 +++++++++++++++++++++++++++++++++++++----------
 1 files changed, 37 insertions(+), 10 deletions(-)

diff --git a/src/topic_node.h b/src/topic_node.h
index b2fae5b..1dfbf43 100644
--- a/src/topic_node.h
+++ b/src/topic_node.h
@@ -22,6 +22,7 @@
 #include "socket.h"
 #include <atomic>
 #include <memory>
+#include <mutex>
 #include <vector>
 
 using namespace bhome_shm;
@@ -41,8 +42,10 @@
 
 	// topic node
 	bool Register(ProcInfo &proc, MsgCommonReply &reply_body, const int timeout_ms);
+	bool Unregister(ProcInfo &proc, MsgCommonReply &reply_body, const int timeout_ms);
 	bool Heartbeat(ProcInfo &proc, MsgCommonReply &reply_body, const int timeout_ms);
 	bool Heartbeat(const int timeout_ms);
+	bool QueryTopicAddress(BHAddress &dest, MsgQueryTopic &query, MsgQueryTopicReply &reply_body, const int timeout_ms);
 
 	// topic rpc server
 	typedef std::function<bool(const std::string &client_proc_id, const MsgRequestTopic &request, MsgRequestTopicReply &reply)> ServerSyncCB;
@@ -56,8 +59,8 @@
 	// topic client
 	typedef std::function<void(const BHMsgHead &head, const MsgRequestTopicReply &reply)> RequestResultCB;
 	bool ClientStartWorker(RequestResultCB const &cb, const int nworker = 2);
-	bool ClientAsyncRequest(const MsgRequestTopic &request, std::string &msg_id, const RequestResultCB &rrcb = RequestResultCB());
-	bool ClientSyncRequest(const MsgRequestTopic &request, std::string &proc_id, MsgRequestTopicReply &reply, const int timeout_ms);
+	bool ClientAsyncRequest(const BHAddress &remote_addr, const MsgRequestTopic &request, std::string &msg_id, const RequestResultCB &rrcb = RequestResultCB());
+	bool ClientSyncRequest(const BHAddress &remote_addr, const MsgRequestTopic &request, std::string &proc_id, MsgRequestTopicReply &reply, const int timeout_ms);
 
 	// publish
 	bool Publish(const MsgPublish &pub, const int timeout_ms);
@@ -72,7 +75,10 @@
 	void Stop();
 
 private:
+	MQId ssn() { return SockNode().id(); }
 	bool ClientQueryRPCTopic(const Topic &topic, BHAddress &addr, const int timeout_ms);
+	typedef MsgQueryTopicReply::BHNodeAddress NodeAddress;
+	int QueryTopicServers(const Topic &topic, std::vector<NodeAddress> &addr, const int timeout_ms);
 	const std::string &proc_id() { return info_.proc_id(); }
 
 	typedef BHAddress Address;
@@ -80,7 +86,11 @@
 	{
 		class Impl
 		{
-			typedef std::unordered_map<Topic, Address> Records;
+			struct TimedRec {
+				Address addr_;
+				int64_t timestamp_;
+			};
+			typedef std::unordered_map<Topic, TimedRec> Records;
 			Records records_;
 
 		public:
@@ -88,15 +98,18 @@
 			{
 				auto pos = records_.find(topic);
 				if (pos != records_.end()) {
-					addr = pos->second;
-					return true;
-				} else {
-					return false;
+					if (NowSec() - pos->second.timestamp_ < NodeTimeoutSec() / 2) {
+						addr = pos->second.addr_;
+						return true;
+					} else {
+						LOG_TRACE() << "topic dest cache timeout.";
+					}
 				}
+				return false;
 			}
 			bool Store(const Topic &topic, const Address &addr)
 			{
-				records_[topic] = addr;
+				records_[topic] = {addr, NowSec()};
 				return true;
 			}
 		};
@@ -116,7 +129,7 @@
 		   eSockSub,
 		   eSockEnd,
 	};
-	std::vector<std::unique_ptr<ShmSocket>> sockets_;
+	std::vector<std::shared_ptr<ShmSocket>> sockets_;
 
 	ShmSocket &SockNode() { return *sockets_[eSockNode]; }
 	ShmSocket &SockPub() { return *sockets_[eSockPub]; }
@@ -124,7 +137,16 @@
 	ShmSocket &SockClient() { return *sockets_[eSockClient]; }
 	ShmSocket &SockServer() { return *sockets_[eSockServer]; }
 
+	void SetProcIndex(int index)
+	{
+		proc_index_ = index;
+		for (int i = eSockStart; i < eSockEnd; ++i) {
+			sockets_[i]->SetNodeProc(index, i);
+		}
+	}
+
 	enum State {
+		eStateUninited,
 		eStateUnregistered,
 		eStateOnline,
 		eStateOffline // heartbeat fail.
@@ -132,8 +154,13 @@
 	void state(const State st) { state_.store(st); }
 	void state_cas(State expected, const State val) { state_.compare_exchange_strong(expected, val); }
 	State state() const { return state_.load(); }
-	bool IsOnline() const { return state() == eStateOnline; }
+	bool IsOnline() { return state() == eStateOnline; }
+	bool Init();
+	bool Valid() const { return state() != eStateUninited; }
+	std::mutex mutex_;
+	MQId ssn_id_ = 0;
 	std::atomic<State> state_;
+	int proc_index_ = -1;
 
 	TopicQueryCache topic_query_cache_;
 };

--
Gitblit v1.8.0