Skip to content

Commit 50a3cd1

Browse files
committed
Lint new Clock creation
1 parent 28fdf12 commit 50a3cd1

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

43 files changed

+285
-151
lines changed

scripts-dev/mypy_synapse_plugin.py

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,12 @@
9292
category="synapse-reactor-clock",
9393
)
9494

95+
MULTIPLE_INTERNAL_CLOCKS_CREATED = ErrorCode(
96+
"multiple-internal-clocks",
97+
"Only one instance of `clock.Clock` should be created",
98+
category="synapse-reactor-clock",
99+
)
100+
95101

96102
class Sentinel(enum.Enum):
97103
# defining a sentinel in this way allows mypy to correctly handle the
@@ -237,6 +243,9 @@ def get_function_signature_hook(
237243
if fullname == "twisted.internet.task.LoopingCall":
238244
return check_looping_call
239245

246+
if fullname == "synapse.util.clock.Clock":
247+
return check_clock_creation
248+
240249
return None
241250

242251
def get_method_signature_hook(
@@ -331,6 +340,25 @@ def check_looping_call(ctx: FunctionSigContext) -> CallableType:
331340
return signature
332341

333342

343+
def check_clock_creation(ctx: FunctionSigContext) -> CallableType:
344+
"""
345+
Ensure that the only `clock.Clock` is the one used by the `HomeServer`.
346+
347+
Args:
348+
ctx: The `FunctionSigContext` from mypy.
349+
"""
350+
signature: CallableType = ctx.default_signature
351+
ctx.api.fail(
352+
"Expected the only `clock.Clock` instance to be the one used by the `HomeServer`. "
353+
"This is so that the `HomeServer` can cancel any tracked delayed or looping calls "
354+
"during server shutdown",
355+
ctx.context,
356+
code=MULTIPLE_INTERNAL_CLOCKS_CREATED,
357+
)
358+
359+
return signature
360+
361+
334362
def check_call_when_running(ctx: MethodSigContext) -> CallableType:
335363
"""
336364
Ensure that the `reactor.callWhenRunning` callsites aren't used.

synapse/appservice/__init__.py

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,15 +23,33 @@
2323
import logging
2424
import re
2525
from enum import Enum
26-
from typing import TYPE_CHECKING, Dict, Iterable, List, Optional, Pattern, Sequence
26+
from typing import (
27+
TYPE_CHECKING,
28+
Dict,
29+
Iterable,
30+
List,
31+
Optional,
32+
Pattern,
33+
Sequence,
34+
cast,
35+
)
2736

2837
import attr
2938
from netaddr import IPSet
3039

40+
from twisted.internet import reactor
41+
3142
from synapse.api.constants import EventTypes
3243
from synapse.events import EventBase
33-
from synapse.types import DeviceListUpdates, JsonDict, JsonMapping, UserID
44+
from synapse.types import (
45+
DeviceListUpdates,
46+
ISynapseThreadlessReactor,
47+
JsonDict,
48+
JsonMapping,
49+
UserID,
50+
)
3451
from synapse.util.caches.descriptors import _CacheContext, cached
52+
from synapse.util.clock import Clock
3553

3654
if TYPE_CHECKING:
3755
from synapse.appservice.api import ApplicationServiceApi
@@ -98,6 +116,13 @@ def __init__(
98116
self.sender = sender
99117
# The application service user should be part of the server's domain.
100118
self.server_name = sender.domain # nb must be called this for @cached
119+
120+
# Ideally we would require passing in the `HomeServer` `Clock` instance.
121+
# However this is not currently possible as there are places which use
122+
# `@cached` that aren't aware of the `HomeServer` instance.
123+
# nb must be called this for @cached
124+
self.clock = Clock(cast(ISynapseThreadlessReactor, reactor)) # type: ignore[multiple-internal-clocks]
125+
101126
self.namespaces = self._check_namespaces(namespaces)
102127
self.id = id
103128
self.ip_range_whitelist = ip_range_whitelist

synapse/handlers/profile.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,8 +56,8 @@ class ProfileHandler:
5656

5757
def __init__(self, hs: "HomeServer"):
5858
self.server_name = hs.hostname # nb must be called this for @cached
59+
self.clock = hs.get_clock() # nb must be called this for @cached
5960
self.store = hs.get_datastores().main
60-
self.clock = hs.get_clock()
6161
self.hs = hs
6262

6363
self.federation = hs.get_federation_client()

synapse/handlers/sync.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -982,6 +982,7 @@ def get_lazy_loaded_members_cache(
982982
logger.debug("creating LruCache for %r", cache_key)
983983
cache = LruCache(
984984
max_size=LAZY_LOADED_MEMBERS_CACHE_MAX_SIZE,
985+
clock=self.clock,
985986
)
986987
self.lazy_loaded_members_cache[cache_key] = cache
987988
else:

synapse/rest/client/sync.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,7 @@ def __init__(self, hs: "HomeServer"):
126126

127127
self._json_filter_cache: LruCache[str, bool] = LruCache(
128128
max_size=1000,
129+
clock=self.clock,
129130
cache_name="sync_valid_filter",
130131
server_name=self.server_name,
131132
)

synapse/server_notices/server_notices_manager.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636
class ServerNoticesManager:
3737
def __init__(self, hs: "HomeServer"):
3838
self.server_name = hs.hostname # nb must be called this for @cached
39+
self.clock = hs.get_clock() # nb must be called this for @cached
3940
self._store = hs.get_datastores().main
4041
self._config = hs.config
4142
self._account_data_handler = hs.get_account_data_handler()

synapse/storage/_base.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ def __init__(
5656
):
5757
self.hs = hs
5858
self.server_name = hs.hostname # nb must be called this for @cached
59-
self._clock = hs.get_clock()
59+
self.clock = hs.get_clock() # nb must be called this for @cached
6060
self.database_engine = database.engine
6161
self.db_pool = database
6262

synapse/storage/controllers/state.py

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -69,8 +69,8 @@ class StateStorageController:
6969

7070
def __init__(self, hs: "HomeServer", stores: "Databases"):
7171
self.server_name = hs.hostname # nb must be called this for @cached
72+
self.clock = hs.get_clock()
7273
self._is_mine_id = hs.is_mine_id
73-
self._clock = hs.get_clock()
7474
self.stores = stores
7575
self._partial_state_events_tracker = PartialStateEventsTracker(stores.main)
7676
self._partial_state_room_tracker = PartialCurrentStateTracker(stores.main)
@@ -818,9 +818,7 @@ async def get_joined_hosts(
818818
state_group = object()
819819

820820
assert state_group is not None
821-
with Measure(
822-
self._clock, name="get_joined_hosts", server_name=self.server_name
823-
):
821+
with Measure(self.clock, name="get_joined_hosts", server_name=self.server_name):
824822
return await self._get_joined_hosts(
825823
room_id, state_group, state_entry=state_entry
826824
)

synapse/storage/databases/main/cache.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -751,7 +751,7 @@ def _send_invalidation_to_replication(
751751
"instance_name": self._instance_name,
752752
"cache_func": cache_name,
753753
"keys": keys,
754-
"invalidation_ts": self._clock.time_msec(),
754+
"invalidation_ts": self.clock.time_msec(),
755755
},
756756
)
757757

@@ -778,7 +778,7 @@ def _send_invalidation_to_replication_bulk(
778778
assert self._cache_id_gen is not None
779779

780780
stream_ids = self._cache_id_gen.get_next_mult_txn(txn, len(key_tuples))
781-
ts = self._clock.time_msec()
781+
ts = self.clock.time_msec()
782782
txn.call_after(self.hs.get_notifier().on_new_replication_data)
783783
self.db_pool.simple_insert_many_txn(
784784
txn,

synapse/storage/databases/main/censor_events.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ async def _censor_redactions(self) -> None:
7777
return
7878

7979
before_ts = (
80-
self._clock.time_msec() - self.hs.config.server.redaction_retention_period
80+
self.clock.time_msec() - self.hs.config.server.redaction_retention_period
8181
)
8282

8383
# We fetch all redactions that:

0 commit comments

Comments
 (0)