From eea097961abe8576351e0e4a26a6091da14e28ed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adrien=20B=C3=A9raud?= <adrien.beraud@savoirfairelinux.com> Date: Tue, 6 Oct 2015 11:58:26 -0400 Subject: [PATCH] dht: add message counting --- include/opendht/dht.h | 14 ++++++++++++++ include/opendht/dhtrunner.h | 6 ++++++ python/opendht.pyx | 6 ++++++ python/opendht_cpp.pxd | 1 + src/dht.cpp | 10 ++++++++++ 5 files changed, 37 insertions(+) diff --git a/include/opendht/dht.h b/include/opendht/dht.h index 1cccff2e..7a1567bb 100644 --- a/include/opendht/dht.h +++ b/include/opendht/dht.h @@ -339,6 +339,9 @@ public: std::string getSearchesLog(sa_family_t) const; void dumpTables() const; + std::vector<unsigned> getNodeMessageStats(bool in = false) const { + return {out.ping, out.find, out.get, out.listen, out.put}; + } /* This must be provided by the user. */ static bool isBlacklisted(const sockaddr*, socklen_t) { return false; } @@ -895,6 +898,17 @@ private: bool rateLimit(); bool neighbourhoodMaintenance(RoutingTable&); + + struct MessageStats { + unsigned ping {0}; + unsigned find {0}; + unsigned get {0}; + unsigned put {0}; + unsigned listen {0}; + }; + + MessageStats in {}, out {}; + }; } diff --git a/include/opendht/dhtrunner.h b/include/opendht/dhtrunner.h index ce274cf1..97a940d6 100644 --- a/include/opendht/dhtrunner.h +++ b/include/opendht/dhtrunner.h @@ -256,6 +256,12 @@ public: return dht_->getNodesStats(af, good_return, dubious_return, cached_return, incoming_return); } + std::vector<unsigned> getNodeMessageStats(bool in = false) const + { + std::lock_guard<std::mutex> lck(dht_mtx); + return dht_->getNodeMessageStats(in); + } + std::string getStorageLog() const { std::lock_guard<std::mutex> lck(dht_mtx); diff --git a/python/opendht.pyx b/python/opendht.pyx index 158107e0..6824a2e2 100644 --- a/python/opendht.pyx +++ b/python/opendht.pyx @@ -269,6 +269,12 @@ cdef class DhtRunner(_WithID): return self.thisptr.getRoutingTablesLog(af).decode() def getSearchesLog(self, cpp.sa_family_t af): return self.thisptr.getSearchesLog(af).decode() + def getNodeMessageStats(self): + stats = [] + cdef cpp.vector[unsigned] res = self.thisptr.getNodeMessageStats(False) + for n in res: + stats.append(n) + return stats def get(self, InfoHash key, get_cb=None, done_cb=None): """Retreive values associated with a key on the DHT. diff --git a/python/opendht_cpp.pxd b/python/opendht_cpp.pxd index 5ee95045..36053cd4 100644 --- a/python/opendht_cpp.pxd +++ b/python/opendht_cpp.pxd @@ -127,5 +127,6 @@ cdef extern from "opendht/dhtrunner.h" namespace "dht": void put(InfoHash key, shared_ptr[Value] val, Dht.DoneCallback done_cb) ListenToken listen(InfoHash key, Dht.GetCallback get_cb) void cancelListen(InfoHash key, SharedListenToken token) + vector[unsigned] getNodeMessageStats(bool i) ctypedef DhtRunner.Config Config diff --git a/src/dht.cpp b/src/dht.cpp index 34164bfe..28f59f9d 100644 --- a/src/dht.cpp +++ b/src/dht.cpp @@ -2739,6 +2739,8 @@ Dht::sendPing(const sockaddr *sa, socklen_t salen, TransId tid) pk.pack(std::string("y")); pk.pack(std::string("q")); pk.pack(std::string("v")); pk.pack(my_v); + out.ping++; + return send(buffer.data(), buffer.size(), 0, sa, salen); } @@ -2785,6 +2787,8 @@ Dht::sendFindNode(const sockaddr *sa, socklen_t salen, TransId tid, pk.pack(std::string("y")); pk.pack(std::string("q")); pk.pack(std::string("v")); pk.pack(my_v); + out.find++; + return send(buffer.data(), buffer.size(), confirm ? 0 : MSG_CONFIRM, sa, salen); } @@ -2966,6 +2970,8 @@ Dht::sendGetValues(const sockaddr *sa, socklen_t salen, pk.pack(std::string("y")); pk.pack(std::string("q")); pk.pack(std::string("v")); pk.pack(my_v); + out.get++; + return send(buffer.data(), buffer.size(), confirm ? 0 : MSG_CONFIRM, sa, salen); } @@ -2988,6 +2994,8 @@ Dht::sendListen(const sockaddr* sa, socklen_t salen, TransId tid, pk.pack(std::string("y")); pk.pack(std::string("q")); pk.pack(std::string("v")); pk.pack(my_v); + out.listen++; + return send(buffer.data(), buffer.size(), confirm ? 0 : MSG_CONFIRM, sa, salen); } @@ -3031,6 +3039,8 @@ Dht::sendAnnounceValue(const sockaddr *sa, socklen_t salen, TransId tid, pk.pack(std::string("y")); pk.pack(std::string("q")); pk.pack(std::string("v")); pk.pack(my_v); + out.put++; + return send(buffer.data(), buffer.size(), confirm ? 0 : MSG_CONFIRM, sa, salen); } -- GitLab