async def get_throttle_params_by_room( self, pusher_id: str) -> Dict[str, ThrottleParams]: res = await self.db_pool.simple_select_list( "pusher_throttle", {"pusher": pusher_id}, ["room_id", "last_sent_ts", "throttle_ms"], desc="get_throttle_params_by_room", ) params_by_room = {} for row in res: params_by_room[row["room_id"]] = ThrottleParams( row["last_sent_ts"], row["throttle_ms"], ) return params_by_room
async def sent_notif_update_throttle( self, room_id: str, notified_push_action: EmailPushAction ) -> None: # We have sent a notification, so update the throttle accordingly. # If the event that triggered the notif happened more than # THROTTLE_RESET_AFTER_MS after the previous one that triggered a # notif, we release the throttle. Otherwise, the throttle is increased. time_of_previous_notifs = await self.store.get_time_of_last_push_action_before( notified_push_action.stream_ordering ) time_of_this_notifs = notified_push_action.received_ts if time_of_previous_notifs is not None and time_of_this_notifs is not None: gap = time_of_this_notifs - time_of_previous_notifs else: # if we don't know the arrival time of one of the notifs (it was not # stored prior to email notification code) then assume a gap of # zero which will just not reset the throttle gap = 0 current_throttle_ms = self.get_room_throttle_ms(room_id) if gap > THROTTLE_RESET_AFTER_MS: new_throttle_ms = THROTTLE_START_MS else: if current_throttle_ms == 0: new_throttle_ms = THROTTLE_START_MS else: new_throttle_ms = min( current_throttle_ms * THROTTLE_MULTIPLIER, THROTTLE_MAX_MS ) self.throttle_params[room_id] = ThrottleParams( self.clock.time_msec(), new_throttle_ms, ) assert self.pusher_id is not None await self.store.set_throttle_params( self.pusher_id, room_id, self.throttle_params[room_id] )