Skip to content

Commit 41cdcf7

Browse files
authored
fix: increase server heartbeat TTL to 20 seconds (#109)
1 parent 3dcaecb commit 41cdcf7

File tree

5 files changed

+17
-22
lines changed

5 files changed

+17
-22
lines changed

src/baby_serverlist/models.py

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,10 @@
66
from django.db import models
77

88
from accounts.models import Account
9-
from commons.cache import BABY_SERVER_HEARTBEAT_TTL_SECONDS, get_baby_server_heartbeat
9+
from central_command.settings import BABY_SERVER_STATUS_TTL_SECONDS
10+
from commons.cache import get_baby_server_heartbeat
1011

1112
SERVERLIST_TOKEN_SALT = "baby_serverlist.serverlist_token"
12-
LIVE_HEARTBEAT_GRACE_SECONDS = 2
1313

1414

1515
class BabyServer(models.Model):
@@ -52,6 +52,4 @@ def is_live(self) -> bool:
5252
if heartbeat_time.tzinfo is None:
5353
heartbeat_time = heartbeat_time.replace(tzinfo=UTC)
5454

55-
# live if last heartbeat within the cache TTL plus a small grace buffer
56-
ttl_with_grace = BABY_SERVER_HEARTBEAT_TTL_SECONDS + LIVE_HEARTBEAT_GRACE_SECONDS
57-
return datetime.now(tz=UTC) - heartbeat_time <= timedelta(seconds=ttl_with_grace)
55+
return datetime.now(tz=UTC) - heartbeat_time <= timedelta(seconds=BABY_SERVER_STATUS_TTL_SECONDS)

src/central_command/settings.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@
4040

4141
_csrf_origins = os.environ.get("CSRF_TRUSTED_ORIGINS", "")
4242
CSRF_TRUSTED_ORIGINS = [origin.strip() for origin in _csrf_origins.split(",") if origin.strip()]
43+
BABY_SERVER_STATUS_TTL_SECONDS = 20
4344

4445
INSTALLED_APPS = [
4546
"django.contrib.admin",

src/commons/cache.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,7 @@
33

44
from django.core.cache import cache
55

6-
BABY_SERVER_STATUS_TTL_SECONDS = 10
7-
BABY_SERVER_HEARTBEAT_TTL_SECONDS = 10
6+
from central_command.settings import BABY_SERVER_STATUS_TTL_SECONDS
87

98
SERVER_STATUS_KEY_PREFIX = "baby_server_status:"
109
SERVER_HEARTBEAT_KEY_PREFIX = "baby_server_heartbeat:"
@@ -42,7 +41,7 @@ def get_many_baby_server_statuses(server_ids: Iterable[str]) -> dict[str, dict[s
4241

4342
def set_baby_server_heartbeat(server_id: str, timestamp: str) -> None:
4443
"""Persist the last-reported timestamp for a server."""
45-
cache.set(_heartbeat_key(server_id), timestamp, timeout=BABY_SERVER_HEARTBEAT_TTL_SECONDS)
44+
cache.set(_heartbeat_key(server_id), timestamp, timeout=BABY_SERVER_STATUS_TTL_SECONDS)
4645

4746

4847
def get_baby_server_heartbeat(server_id: str) -> str | None:

src/tests/baby_serverlist/test_api.py

Lines changed: 5 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,9 @@
77
from rest_framework.test import APITestCase
88

99
from accounts.models import Account
10-
from baby_serverlist.models import LIVE_HEARTBEAT_GRACE_SECONDS, BabyServer
10+
from baby_serverlist.models import BabyServer
11+
from central_command.settings import BABY_SERVER_STATUS_TTL_SECONDS
1112
from commons.cache import (
12-
BABY_SERVER_HEARTBEAT_TTL_SECONDS,
1313
get_baby_server_heartbeat,
1414
get_baby_server_status,
1515
set_baby_server_heartbeat,
@@ -155,9 +155,7 @@ def test_list_owned_baby_servers_live_flag(self) -> None:
155155
response = self.client.get(reverse("baby_serverlist:list-owned"))
156156
self.assertTrue(response.json()[0]["live"])
157157

158-
stale_time = datetime.now(tz=UTC) - timedelta(
159-
seconds=BABY_SERVER_HEARTBEAT_TTL_SECONDS + LIVE_HEARTBEAT_GRACE_SECONDS + 1
160-
)
158+
stale_time = datetime.now(tz=UTC) - timedelta(seconds=BABY_SERVER_STATUS_TTL_SECONDS + 1)
161159
set_baby_server_heartbeat(str(baby_server.id), stale_time.isoformat())
162160

163161
response = self.client.get(reverse("baby_serverlist:list-owned"))
@@ -191,15 +189,11 @@ def test_list_baby_servers_ignores_non_whitelisted(self) -> None:
191189
def test_baby_server_is_live_respects_heartbeat_ttl(self) -> None:
192190
baby_server = BabyServer.objects.create(owner=self.user)
193191

194-
fresh_time = datetime.now(tz=UTC) - timedelta(
195-
seconds=BABY_SERVER_HEARTBEAT_TTL_SECONDS + LIVE_HEARTBEAT_GRACE_SECONDS - 1
196-
)
192+
fresh_time = datetime.now(tz=UTC) - timedelta(seconds=BABY_SERVER_STATUS_TTL_SECONDS - 1)
197193
set_baby_server_heartbeat(str(baby_server.id), fresh_time.isoformat())
198194
self.assertTrue(baby_server.is_live())
199195

200-
stale_time = datetime.now(tz=UTC) - timedelta(
201-
seconds=BABY_SERVER_HEARTBEAT_TTL_SECONDS + LIVE_HEARTBEAT_GRACE_SECONDS + 1
202-
)
196+
stale_time = datetime.now(tz=UTC) - timedelta(seconds=BABY_SERVER_STATUS_TTL_SECONDS + 1)
203197
set_baby_server_heartbeat(str(baby_server.id), stale_time.isoformat())
204198
stored = get_baby_server_heartbeat(str(baby_server.id))
205199
self.assertEqual(stored, stale_time.isoformat())

src/tests/commons/test_cache.py

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,13 @@
22

33
from django.test import SimpleTestCase
44

5+
from central_command.settings import BABY_SERVER_STATUS_TTL_SECONDS
56
from commons import cache as cache_module
67

78

89
class CommonsCacheTests(SimpleTestCase):
9-
def test_set_baby_server_status_uses_ephemeral_timeout(self) -> None:
10+
@staticmethod
11+
def test_set_baby_server_status_uses_ephemeral_timeout() -> None:
1012
payload = {"ServerName": "test"}
1113
server_id = "server-123"
1214

@@ -19,7 +21,8 @@ def test_set_baby_server_status_uses_ephemeral_timeout(self) -> None:
1921
timeout=cache_module.BABY_SERVER_STATUS_TTL_SECONDS,
2022
)
2123

22-
def test_set_baby_server_heartbeat_uses_ephemeral_timeout(self) -> None:
24+
@staticmethod
25+
def test_set_baby_server_heartbeat_uses_ephemeral_timeout() -> None:
2326
timestamp = "2024-01-01T00:00:00+00:00"
2427
server_id = "server-456"
2528

@@ -29,5 +32,5 @@ def test_set_baby_server_heartbeat_uses_ephemeral_timeout(self) -> None:
2932
fake_cache.set.assert_called_once_with(
3033
f"{cache_module.SERVER_HEARTBEAT_KEY_PREFIX}{server_id}",
3134
timestamp,
32-
timeout=cache_module.BABY_SERVER_HEARTBEAT_TTL_SECONDS,
35+
timeout=BABY_SERVER_STATUS_TTL_SECONDS,
3336
)

0 commit comments

Comments
 (0)