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