From 33c83e99ae8b10f461ab993048b209ff606018d0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mattias=20R=C3=B6nnblom?= Date: Mon, 1 Apr 2024 09:26:36 +0200 Subject: [PATCH] Add random component to track query interval MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add per-query jitter to the track query interval, to avoid repeatedly sending queries to all clients connected at the same time, which in turn is to avoid load spikes. Signed-off-by: Mattias Rönnblom --- paf/sd.py | 11 ++++++++++- test/test_paf.py | 2 +- 2 files changed, 11 insertions(+), 2 deletions(-) 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()