From 315cf15190c59abe7febc804e506ea3aec4c20db Mon Sep 17 00:00:00 2001 From: George3d6 Date: Fri, 24 Apr 2026 12:34:07 +0200 Subject: [PATCH 1/3] cap worker-lock retry interval at 10 minutes to avoid unbounded int growth that trips python 3.11+s 4300-digit str() limit (fixes#19315, #18221) --- synapse/handlers/worker_lock.py | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/synapse/handlers/worker_lock.py b/synapse/handlers/worker_lock.py index 1537a18cc05..5152c12d19c 100644 --- a/synapse/handlers/worker_lock.py +++ b/synapse/handlers/worker_lock.py @@ -47,6 +47,7 @@ logger = logging.getLogger(__name__) +_LOCK_RETRY_CAP_SECS = Duration(minutes=10).as_secs() # This lock is used to avoid creating an event while we are purging the room. # We take a read lock when creating an event, and a write one when purging a room. @@ -274,11 +275,11 @@ async def __aexit__( return r def _get_next_retry_interval(self) -> float: - next = self._retry_interval - self._retry_interval = max(5, next * 2) - if self._retry_interval > Duration(minutes=10).as_secs(): # >7 iterations + prev = self._retry_interval + self._retry_interval = min(_LOCK_RETRY_CAP_SECS, max(5, prev * 2)) + if self._retry_interval == _LOCK_RETRY_CAP_SECS and prev < _LOCK_RETRY_CAP_SECS: logger.warning( - "Lock timeout is getting excessive: %ss. There may be a deadlock.", + "Lock timeout hit cap of %ss. There may be a deadlock.", self._retry_interval, ) return next * random.uniform(0.9, 1.1) @@ -361,11 +362,11 @@ async def __aexit__( return r def _get_next_retry_interval(self) -> float: - next = self._retry_interval - self._retry_interval = max(5, next * 2) - if self._retry_interval > Duration(minutes=10).as_secs(): # >7 iterations + prev = self._retry_interval + self._retry_interval = min(_LOCK_RETRY_CAP_SECS, max(5, prev * 2)) + if self._retry_interval == _LOCK_RETRY_CAP_SECS and prev < _LOCK_RETRY_CAP_SECS: logger.warning( - "Lock timeout is getting excessive: %ss. There may be a deadlock.", + "Lock timeout hit cap of %ss. There may be a deadlock.", self._retry_interval, ) return next * random.uniform(0.9, 1.1) From 835dc78f9cf4d9e58520e81c1ae6eed8dad9def3 Mon Sep 17 00:00:00 2001 From: George3d6 Date: Fri, 24 Apr 2026 12:41:43 +0200 Subject: [PATCH 2/3] added changelog --- changelog.d/19777.bugfix | 1 + 1 file changed, 1 insertion(+) create mode 100644 changelog.d/19777.bugfix diff --git a/changelog.d/19777.bugfix b/changelog.d/19777.bugfix new file mode 100644 index 00000000000..7392ae7439a --- /dev/null +++ b/changelog.d/19777.bugfix @@ -0,0 +1 @@ +Fix a crash in the worker-lock retry loop that could be triggered by a client repeatedly uploading one-time keys, causing Synapse to spew `ValueError: Exceeds the limit (4300 digits)` tracebacks until restarted. Contributed by @George3d6. From a9b504b8ab52b62429fed74666cdcb38cfaea20b Mon Sep 17 00:00:00 2001 From: George3d6 Date: Fri, 24 Apr 2026 12:42:34 +0200 Subject: [PATCH 3/3] proper changelog name --- changelog.d/19777.bugfix | 1 - 1 file changed, 1 deletion(-) delete mode 100644 changelog.d/19777.bugfix diff --git a/changelog.d/19777.bugfix b/changelog.d/19777.bugfix deleted file mode 100644 index 7392ae7439a..00000000000 --- a/changelog.d/19777.bugfix +++ /dev/null @@ -1 +0,0 @@ -Fix a crash in the worker-lock retry loop that could be triggered by a client repeatedly uploading one-time keys, causing Synapse to spew `ValueError: Exceeds the limit (4300 digits)` tracebacks until restarted. Contributed by @George3d6.