summary refs log tree commit diff
diff options
context:
space:
mode:
authorErik Johnston <erik@matrix.org>2019-08-20 11:46:00 +0100
committerErik Johnston <erik@matrix.org>2019-08-20 11:46:00 +0100
commit1dec31560e5712306e368a0adc6d9f84f924bdc9 (patch)
tree6bb1a6633da9380a0a37775ab91f865a2c99274e
parentFixup changelog and remove debug logging (diff)
downloadsynapse-1dec31560e5712306e368a0adc6d9f84f924bdc9.tar.xz
Change jitter to be a factor rather than absolute value
-rw-r--r--synapse/http/federation/well_known_resolver.py23
-rw-r--r--tests/http/federation/test_matrix_federation_agent.py4
2 files changed, 14 insertions, 13 deletions
diff --git a/synapse/http/federation/well_known_resolver.py b/synapse/http/federation/well_known_resolver.py
index c846003886..5e9b0befb0 100644
--- a/synapse/http/federation/well_known_resolver.py
+++ b/synapse/http/federation/well_known_resolver.py
@@ -32,8 +32,8 @@ from synapse.util.metrics import Measure
 # period to cache .well-known results for by default
 WELL_KNOWN_DEFAULT_CACHE_PERIOD = 24 * 3600
 
-# jitter to add to the .well-known default cache ttl
-WELL_KNOWN_DEFAULT_CACHE_PERIOD_JITTER = 10 * 60
+# jitter factor to add to the .well-known default cache ttls
+WELL_KNOWN_DEFAULT_CACHE_PERIOD_JITTER = 0.1
 
 # period to cache failure to fetch .well-known for
 WELL_KNOWN_INVALID_CACHE_PERIOD = 1 * 3600
@@ -133,16 +133,14 @@ class WellKnownResolver(object):
                 # We have recently seen a valid well-known record for this
                 # server, so we cache the lack of well-known for a shorter time.
                 cache_period = WELL_KNOWN_DOWN_CACHE_PERIOD
-                cache_period += random.uniform(
-                    0, WELL_KNOWN_DEFAULT_CACHE_PERIOD_JITTER
-                )
             else:
-                # add some randomness to the TTL to avoid a stampeding herd every hour
-                # after startup
                 cache_period = WELL_KNOWN_INVALID_CACHE_PERIOD
-                cache_period += random.uniform(
-                    0, WELL_KNOWN_DEFAULT_CACHE_PERIOD_JITTER
-                )
+
+            # add some randomness to the TTL to avoid a stampeding herd
+            cache_period *= random.uniform(
+                1 - WELL_KNOWN_DEFAULT_CACHE_PERIOD_JITTER,
+                1 + WELL_KNOWN_DEFAULT_CACHE_PERIOD_JITTER,
+            )
 
         if cache_period > 0:
             self._well_known_cache.set(server_name, result, cache_period)
@@ -194,7 +192,10 @@ class WellKnownResolver(object):
             cache_period = WELL_KNOWN_DEFAULT_CACHE_PERIOD
             # add some randomness to the TTL to avoid a stampeding herd every 24 hours
             # after startup
-            cache_period += random.uniform(0, WELL_KNOWN_DEFAULT_CACHE_PERIOD_JITTER)
+            cache_period *= random.uniform(
+                1 - WELL_KNOWN_DEFAULT_CACHE_PERIOD_JITTER,
+                1 + WELL_KNOWN_DEFAULT_CACHE_PERIOD_JITTER,
+            )
         else:
             cache_period = min(cache_period, WELL_KNOWN_MAX_CACHE_PERIOD)
             cache_period = max(cache_period, WELL_KNOWN_MIN_CACHE_PERIOD)
diff --git a/tests/http/federation/test_matrix_federation_agent.py b/tests/http/federation/test_matrix_federation_agent.py
index 4d3f31d18c..c55aad8e11 100644
--- a/tests/http/federation/test_matrix_federation_agent.py
+++ b/tests/http/federation/test_matrix_federation_agent.py
@@ -551,7 +551,7 @@ class MatrixFederationAgentTests(TestCase):
         self.assertEqual(self.well_known_cache[b"testserv"], b"target-server")
 
         # check the cache expires
-        self.reactor.pump((25 * 3600,))
+        self.reactor.pump((48 * 3600,))
         self.well_known_cache.expire()
         self.assertNotIn(b"testserv", self.well_known_cache)
 
@@ -639,7 +639,7 @@ class MatrixFederationAgentTests(TestCase):
         self.assertEqual(self.well_known_cache[b"testserv"], b"target-server")
 
         # check the cache expires
-        self.reactor.pump((25 * 3600,))
+        self.reactor.pump((48 * 3600,))
         self.well_known_cache.expire()
         self.assertNotIn(b"testserv", self.well_known_cache)