Skip to content
Snippets Groups Projects
Unverified Commit 66537e10 authored by Richard van der Hoff's avatar Richard van der Hoff Committed by GitHub
Browse files

add some metrics on the federation sender (#6160)

parent 6018bec9
No related branches found
No related tags found
No related merge requests found
Add some metrics on the federation sender.
...@@ -38,7 +38,7 @@ from synapse.metrics import ( ...@@ -38,7 +38,7 @@ from synapse.metrics import (
events_processed_counter, events_processed_counter,
) )
from synapse.metrics.background_process_metrics import run_as_background_process from synapse.metrics.background_process_metrics import run_as_background_process
from synapse.util.metrics import measure_func from synapse.util.metrics import Measure, measure_func
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
...@@ -183,8 +183,8 @@ class FederationSender(object): ...@@ -183,8 +183,8 @@ class FederationSender(object):
# Otherwise if the last member on a server in a room is # Otherwise if the last member on a server in a room is
# banned then it won't receive the event because it won't # banned then it won't receive the event because it won't
# be in the room after the ban. # be in the room after the ban.
destinations = yield self.state.get_current_hosts_in_room( destinations = yield self.state.get_hosts_in_room_at_events(
event.room_id, latest_event_ids=event.prev_event_ids() event.room_id, event_ids=event.prev_event_ids()
) )
except Exception: except Exception:
logger.exception( logger.exception(
...@@ -207,8 +207,9 @@ class FederationSender(object): ...@@ -207,8 +207,9 @@ class FederationSender(object):
@defer.inlineCallbacks @defer.inlineCallbacks
def handle_room_events(events): def handle_room_events(events):
for event in events: with Measure(self.clock, "handle_room_events"):
yield handle_event(event) for event in events:
yield handle_event(event)
events_by_room = {} events_by_room = {}
for event in events: for event in events:
......
...@@ -33,7 +33,7 @@ from synapse.state import v1, v2 ...@@ -33,7 +33,7 @@ from synapse.state import v1, v2
from synapse.util.async_helpers import Linearizer from synapse.util.async_helpers import Linearizer
from synapse.util.caches import get_cache_factor_for from synapse.util.caches import get_cache_factor_for
from synapse.util.caches.expiringcache import ExpiringCache from synapse.util.caches.expiringcache import ExpiringCache
from synapse.util.metrics import Measure from synapse.util.metrics import Measure, measure_func
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
...@@ -191,11 +191,22 @@ class StateHandler(object): ...@@ -191,11 +191,22 @@ class StateHandler(object):
return joined_users return joined_users
@defer.inlineCallbacks @defer.inlineCallbacks
def get_current_hosts_in_room(self, room_id, latest_event_ids=None): def get_current_hosts_in_room(self, room_id):
if not latest_event_ids: event_ids = yield self.store.get_latest_event_ids_in_room(room_id)
latest_event_ids = yield self.store.get_latest_event_ids_in_room(room_id) return (yield self.get_hosts_in_room_at_events(room_id, event_ids))
logger.debug("calling resolve_state_groups from get_current_hosts_in_room")
entry = yield self.resolve_state_groups_for_events(room_id, latest_event_ids) @defer.inlineCallbacks
def get_hosts_in_room_at_events(self, room_id, event_ids):
"""Get the hosts that were in a room at the given event ids
Args:
room_id (str):
event_ids (list[str]):
Returns:
Deferred[list[str]]: the hosts in the room at the given events
"""
entry = yield self.resolve_state_groups_for_events(room_id, event_ids)
joined_hosts = yield self.store.get_joined_hosts(room_id, entry) joined_hosts = yield self.store.get_joined_hosts(room_id, entry)
return joined_hosts return joined_hosts
...@@ -344,6 +355,7 @@ class StateHandler(object): ...@@ -344,6 +355,7 @@ class StateHandler(object):
return context return context
@measure_func()
@defer.inlineCallbacks @defer.inlineCallbacks
def resolve_state_groups_for_events(self, room_id, event_ids): def resolve_state_groups_for_events(self, room_id, event_ids):
""" Given a list of event_ids this method fetches the state at each """ Given a list of event_ids this method fetches the state at each
......
...@@ -33,6 +33,7 @@ from synapse.types import get_domain_from_id ...@@ -33,6 +33,7 @@ from synapse.types import get_domain_from_id
from synapse.util.async_helpers import Linearizer from synapse.util.async_helpers import Linearizer
from synapse.util.caches import intern_string from synapse.util.caches import intern_string
from synapse.util.caches.descriptors import cached, cachedInlineCallbacks from synapse.util.caches.descriptors import cached, cachedInlineCallbacks
from synapse.util.metrics import Measure
from synapse.util.stringutils import to_ascii from synapse.util.stringutils import to_ascii
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
...@@ -483,6 +484,7 @@ class RoomMemberWorkerStore(EventsWorkerStore): ...@@ -483,6 +484,7 @@ class RoomMemberWorkerStore(EventsWorkerStore):
) )
return result return result
@defer.inlineCallbacks
def get_joined_users_from_state(self, room_id, state_entry): def get_joined_users_from_state(self, room_id, state_entry):
state_group = state_entry.state_group state_group = state_entry.state_group
if not state_group: if not state_group:
...@@ -492,9 +494,12 @@ class RoomMemberWorkerStore(EventsWorkerStore): ...@@ -492,9 +494,12 @@ class RoomMemberWorkerStore(EventsWorkerStore):
# To do this we set the state_group to a new object as object() != object() # To do this we set the state_group to a new object as object() != object()
state_group = object() state_group = object()
return self._get_joined_users_from_context( with Measure(self._clock, "get_joined_users_from_state"):
room_id, state_group, state_entry.state, context=state_entry return (
) yield self._get_joined_users_from_context(
room_id, state_group, state_entry.state, context=state_entry
)
)
@cachedInlineCallbacks( @cachedInlineCallbacks(
num_args=2, cache_context=True, iterable=True, max_entries=100000 num_args=2, cache_context=True, iterable=True, max_entries=100000
...@@ -669,6 +674,7 @@ class RoomMemberWorkerStore(EventsWorkerStore): ...@@ -669,6 +674,7 @@ class RoomMemberWorkerStore(EventsWorkerStore):
return True return True
@defer.inlineCallbacks
def get_joined_hosts(self, room_id, state_entry): def get_joined_hosts(self, room_id, state_entry):
state_group = state_entry.state_group state_group = state_entry.state_group
if not state_group: if not state_group:
...@@ -678,9 +684,12 @@ class RoomMemberWorkerStore(EventsWorkerStore): ...@@ -678,9 +684,12 @@ class RoomMemberWorkerStore(EventsWorkerStore):
# To do this we set the state_group to a new object as object() != object() # To do this we set the state_group to a new object as object() != object()
state_group = object() state_group = object()
return self._get_joined_hosts( with Measure(self._clock, "get_joined_hosts"):
room_id, state_group, state_entry.state, state_entry=state_entry return (
) yield self._get_joined_hosts(
room_id, state_group, state_entry.state, state_entry=state_entry
)
)
@cachedInlineCallbacks(num_args=2, max_entries=10000, iterable=True) @cachedInlineCallbacks(num_args=2, max_entries=10000, iterable=True)
# @defer.inlineCallbacks # @defer.inlineCallbacks
......
...@@ -60,12 +60,14 @@ in_flight = InFlightGauge( ...@@ -60,12 +60,14 @@ in_flight = InFlightGauge(
) )
def measure_func(name): def measure_func(name=None):
def wrapper(func): def wrapper(func):
block_name = func.__name__ if name is None else name
@wraps(func) @wraps(func)
@defer.inlineCallbacks @defer.inlineCallbacks
def measured_func(self, *args, **kwargs): def measured_func(self, *args, **kwargs):
with Measure(self.clock, name): with Measure(self.clock, block_name):
r = yield func(self, *args, **kwargs) r = yield func(self, *args, **kwargs)
return r return r
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment