From c301b41f508738152dc2a1b937fc3a7831015021 Mon Sep 17 00:00:00 2001
From: Brian Warner <warner@allmydata.com>
Date: Wed, 26 Sep 2007 12:21:15 -0700
Subject: [PATCH] control: add measure_peer_response_time(), to estimate RTT
 for the mesh

---
 src/allmydata/control.py          | 18 ++++++++++++++++++
 src/allmydata/interfaces.py       | 10 ++++++++++
 src/allmydata/test/test_system.py |  1 +
 3 files changed, 29 insertions(+)

diff --git a/src/allmydata/control.py b/src/allmydata/control.py
index 7aca472f..257da383 100644
--- a/src/allmydata/control.py
+++ b/src/allmydata/control.py
@@ -56,6 +56,24 @@ class ControlServer(Referenceable, service.Service, testutil.PollMixin):
     def remote_get_memory_usage(self):
         return get_memory_usage()
 
+    def remote_measure_peer_response_time(self):
+        results = {}
+        everyone = list(self.parent.introducer_client.get_all_peers())
+        d = self._do_one_ping(None, everyone, results)
+        return d
+    def _do_one_ping(self, res, everyone_left, results):
+        if not everyone_left:
+            return results
+        peerid, connection = everyone_left.pop(0)
+        start = time.time()
+        d = connection.callRemote("get_nodeid")
+        def _done(ignored):
+            stop = time.time()
+            results[peerid] = stop - start
+        d.addCallback(_done)
+        d.addCallback(self._do_one_ping, everyone_left, results)
+        return d
+
 class SpeedTest:
     def __init__(self, parent, count, size):
         self.parent = parent
diff --git a/src/allmydata/interfaces.py b/src/allmydata/interfaces.py
index efd6962f..e1ac9e95 100644
--- a/src/allmydata/interfaces.py
+++ b/src/allmydata/interfaces.py
@@ -1062,3 +1062,13 @@ class RIControlClient(RemoteInterface):
         Returns a tuple of (upload_time, download_time).
         """
         return (float, float)
+
+    def measure_peer_response_time():
+        """Send a short message to each connected peer, and measure the time
+        it takes for them to respond to it. This is a rough measure of the
+        application-level round trip time.
+
+        @return: a dictionary mapping peerid to a float (RTT time in seconds)
+        """
+
+        return DictOf(Nodeid, float)
diff --git a/src/allmydata/test/test_system.py b/src/allmydata/test/test_system.py
index 38784cca..7a3d3701 100644
--- a/src/allmydata/test/test_system.py
+++ b/src/allmydata/test/test_system.py
@@ -687,5 +687,6 @@ class SystemTest(testutil.SignalMixin, unittest.TestCase):
         d.addCallback(lambda res: rref.callRemote("speed_test", 1, 200))
         if sys.platform == "linux2":
             d.addCallback(lambda res: rref.callRemote("get_memory_usage"))
+        d.addCallback(lambda res: rref.callRemote("measure_peer_response_time"))
         return d
 
-- 
2.45.2