From ccf72bb0b8aa9c421bb2964acca2dcd868d10a94 Mon Sep 17 00:00:00 2001
From: lichao <lichao@aiotlink.com>
Date: 星期二, 18 五月 2021 11:41:46 +0800
Subject: [PATCH] use more rational node timeout, 60s.

---
 box/center.cpp   |    3 ++-
 src/defs.h       |    3 +++
 src/topic_node.h |   19 +++++++++++++------
 src/sendq.h      |    2 +-
 src/defs.cpp     |    4 +++-
 5 files changed, 22 insertions(+), 9 deletions(-)

diff --git a/box/center.cpp b/box/center.cpp
index c5644b3..9ecd04b 100644
--- a/box/center.cpp
+++ b/box/center.cpp
@@ -822,7 +822,8 @@
 		}
 	};
 
-	auto center_ptr = std::make_shared<Synced<NodeCenter>>("#bhome_center", gc, 6s, 6s * 2);
+	auto nsec = seconds(NodeTimeoutSec());
+	auto center_ptr = std::make_shared<Synced<NodeCenter>>("#bhome_center", gc, nsec, nsec * 3); // *3 to allow other clients to finish sending msgs.
 	AddCenter(center_ptr);
 
 	for (auto &kv : Centers()) {
diff --git a/src/defs.cpp b/src/defs.cpp
index 43e7b7f..cb85db7 100644
--- a/src/defs.cpp
+++ b/src/defs.cpp
@@ -187,4 +187,6 @@
 {
 	ec = LastErrorStore().ec_;
 	msg = LastErrorStore().msg_;
-}
\ No newline at end of file
+}
+
+int NodeTimeoutSec() { return 60; }
\ No newline at end of file
diff --git a/src/defs.h b/src/defs.h
index 6939352..51040e6 100644
--- a/src/defs.h
+++ b/src/defs.h
@@ -66,4 +66,7 @@
 bool BHNodeInit(const int64_t request, int64_t &reply);
 void BHCenterHandleInit(std::function<int64_t(const int64_t)> const &onReq);
 
+// node mq is avail with in timeout; after that may get killed.
+int NodeTimeoutSec();
+
 #endif // end of include guard: DEFS_KP8LKGD0
diff --git a/src/sendq.h b/src/sendq.h
index d1ba30a..759e12a 100644
--- a/src/sendq.h
+++ b/src/sendq.h
@@ -89,7 +89,7 @@
 
 private:
 	static TimePoint Now() { return TimedMsg::Clock::now(); }
-	static TimePoint DefaultExpire() { return Now() + std::chrono::seconds(60); }
+	static TimePoint DefaultExpire() { return Now() + std::chrono::seconds(NodeTimeoutSec()); }
 	void AppendData(const MQInfo &mq, const Data data, const TimePoint &expire, OnMsgEvent onExpire);
 
 	typedef std::deque<TimedMsg> Array;
diff --git a/src/topic_node.h b/src/topic_node.h
index be82cf6..430ddfe 100644
--- a/src/topic_node.h
+++ b/src/topic_node.h
@@ -86,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:
@@ -94,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;
 			}
 		};

--
Gitblit v1.8.0