1616import logging
1717from collections import Counter
1818
19- from twisted .internet import defer
20-
2119from synapse .api .constants import EventTypes , Membership
22- from synapse .handlers .state_deltas import StateDeltasHandler
2320from synapse .metrics import event_processing_positions
2421from synapse .metrics .background_process_metrics import run_as_background_process
2522
2623logger = logging .getLogger (__name__ )
2724
2825
29- class StatsHandler ( StateDeltasHandler ) :
26+ class StatsHandler :
3027 """Handles keeping the *_stats tables updated with a simple time-series of
3128 information about the users, rooms and media on the server, such that admins
3229 have some idea of who is consuming their resources.
@@ -35,7 +32,6 @@ class StatsHandler(StateDeltasHandler):
3532 """
3633
3734 def __init__ (self , hs ):
38- super (StatsHandler , self ).__init__ (hs )
3935 self .hs = hs
4036 self .store = hs .get_datastore ()
4137 self .state = hs .get_state_handler ()
@@ -68,20 +64,18 @@ def notify_new_event(self):
6864
6965 self ._is_processing = True
7066
71- @defer .inlineCallbacks
72- def process ():
67+ async def process ():
7368 try :
74- yield self ._unsafe_process ()
69+ await self ._unsafe_process ()
7570 finally :
7671 self ._is_processing = False
7772
7873 run_as_background_process ("stats.notify_new_event" , process )
7974
80- @defer .inlineCallbacks
81- def _unsafe_process (self ):
75+ async def _unsafe_process (self ):
8276 # If self.pos is None then means we haven't fetched it from DB
8377 if self .pos is None :
84- self .pos = yield self .store .get_stats_positions ()
78+ self .pos = await self .store .get_stats_positions ()
8579
8680 # Loop round handling deltas until we're up to date
8781
@@ -96,13 +90,13 @@ def _unsafe_process(self):
9690 logger .debug (
9791 "Processing room stats %s->%s" , self .pos , room_max_stream_ordering
9892 )
99- max_pos , deltas = yield self .store .get_current_state_deltas (
93+ max_pos , deltas = await self .store .get_current_state_deltas (
10094 self .pos , room_max_stream_ordering
10195 )
10296
10397 if deltas :
10498 logger .debug ("Handling %d state deltas" , len (deltas ))
105- room_deltas , user_deltas = yield self ._handle_deltas (deltas )
99+ room_deltas , user_deltas = await self ._handle_deltas (deltas )
106100 else :
107101 room_deltas = {}
108102 user_deltas = {}
@@ -111,7 +105,7 @@ def _unsafe_process(self):
111105 (
112106 room_count ,
113107 user_count ,
114- ) = yield self .store .get_changes_room_total_events_and_bytes (
108+ ) = await self .store .get_changes_room_total_events_and_bytes (
115109 self .pos , max_pos
116110 )
117111
@@ -125,7 +119,7 @@ def _unsafe_process(self):
125119 logger .debug ("user_deltas: %s" , user_deltas )
126120
127121 # Always call this so that we update the stats position.
128- yield self .store .bulk_update_stats_delta (
122+ await self .store .bulk_update_stats_delta (
129123 self .clock .time_msec (),
130124 updates = {"room" : room_deltas , "user" : user_deltas },
131125 stream_id = max_pos ,
@@ -137,13 +131,12 @@ def _unsafe_process(self):
137131
138132 self .pos = max_pos
139133
140- @defer .inlineCallbacks
141- def _handle_deltas (self , deltas ):
134+ async def _handle_deltas (self , deltas ):
142135 """Called with the state deltas to process
143136
144137 Returns:
145- Deferred[ tuple[dict[str, Counter], dict[str, counter] ]]
146- Resovles to two dicts, the room deltas and the user deltas,
138+ tuple[dict[str, Counter], dict[str, counter]]
139+ Two dicts: the room deltas and the user deltas,
147140 mapping from room/user ID to changes in the various fields.
148141 """
149142
@@ -162,7 +155,7 @@ def _handle_deltas(self, deltas):
162155
163156 logger .debug ("Handling: %r, %r %r, %s" , room_id , typ , state_key , event_id )
164157
165- token = yield self .store .get_earliest_token_for_stats ("room" , room_id )
158+ token = await self .store .get_earliest_token_for_stats ("room" , room_id )
166159
167160 # If the earliest token to begin from is larger than our current
168161 # stream ID, skip processing this delta.
@@ -184,7 +177,7 @@ def _handle_deltas(self, deltas):
184177
185178 sender = None
186179 if event_id is not None :
187- event = yield self .store .get_event (event_id , allow_none = True )
180+ event = await self .store .get_event (event_id , allow_none = True )
188181 if event :
189182 event_content = event .content or {}
190183 sender = event .sender
@@ -200,16 +193,16 @@ def _handle_deltas(self, deltas):
200193 room_stats_delta ["current_state_events" ] += 1
201194
202195 if typ == EventTypes .Member :
203- # we could use _get_key_change here but it's a bit inefficient
204- # given we're not testing for a specific result; might as well
205- # just grab the prev_membership and membership strings and
206- # compare them.
196+ # we could use StateDeltasHandler. _get_key_change here but it's
197+ # a bit inefficient given we're not testing for a specific
198+ # result; might as well just grab the prev_membership and
199+ # membership strings and compare them.
207200 # We take None rather than leave as a previous membership
208201 # in the absence of a previous event because we do not want to
209202 # reduce the leave count when a new-to-the-room user joins.
210203 prev_membership = None
211204 if prev_event_id is not None :
212- prev_event = yield self .store .get_event (
205+ prev_event = await self .store .get_event (
213206 prev_event_id , allow_none = True
214207 )
215208 if prev_event :
@@ -301,6 +294,6 @@ def _handle_deltas(self, deltas):
301294
302295 for room_id , state in room_to_state_updates .items ():
303296 logger .debug ("Updating room_stats_state for %s: %s" , room_id , state )
304- yield self .store .update_room_state (room_id , state )
297+ await self .store .update_room_state (room_id , state )
305298
306299 return room_to_stats_deltas , user_to_stats_deltas
0 commit comments