diff --git a/paf/sd.py b/paf/sd.py index 9a7c77c..fd1f2c9 100644 --- a/paf/sd.py +++ b/paf/sd.py @@ -4,6 +4,7 @@ import contextlib import enum +import random import time @@ -289,6 +290,7 @@ def assure_not_connected(fun): WARNING_THRESHOLD = 0.5 +WARNING_JITTER = 0.1 MIN_IDLE_TIME = 4 @@ -298,6 +300,11 @@ class IdleState(enum.Enum): TIMED_OUT = enum.auto() +def jitter(base, max_jitter): + k = 1.0 + (random.random() - 0.5) * 2 * max_jitter + return k * base + + class Connection: def __init__(self, client, timer_manager, max_idle_time, idle_cb): self.client = client @@ -393,7 +400,9 @@ def idle_time(self): return t def install_idle_warning_timer(self): - self.install_idle_timer(WARNING_THRESHOLD * self.idle_time()) + warning_time = jitter(WARNING_THRESHOLD * self.idle_time(), + WARNING_JITTER) + self.install_idle_timer(warning_time) def install_idle_timeout_timer(self): self.install_idle_timer((1 - WARNING_THRESHOLD) * self.idle_time()) diff --git a/test/test_paf.py b/test/test_paf.py index c4a296d..d93b2ef 100644 --- a/test/test_paf.py +++ b/test/test_paf.py @@ -738,7 +738,7 @@ def test_server_tracking_client(impatient_server): wait(conn, criteria=lambda: track_recorder.count_notifications() > 0) latency = time.time() - start - assert latency > query_time + assert latency > (query_time - 0.5) assert latency < (query_time + 0.5) notifications = track_recorder.get_notifications()