Skip to content
This repository was archived by the owner on Apr 26, 2024. It is now read-only.

Commit 5bb26b7

Browse files
committed
Merge branch 'release-v1.13.0' into develop
2 parents 9e0384d + d9b8d27 commit 5bb26b7

File tree

10 files changed

+65
-18
lines changed

10 files changed

+65
-18
lines changed

changelog.d/7422.feature

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Add a configuration setting to tweak the threshold for dummy events.

changelog.d/7426.misc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Clean up some LoggingContext code.

changelog.d/7439.feature

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Add support for running replication over Redis when using workers.

changelog.d/7442.misc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Run group attestation renewal in series rather than parallel for performance.

docs/sample_config.yaml

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -253,6 +253,18 @@ listeners:
253253
# bind_addresses: ['::1', '127.0.0.1']
254254
# type: manhole
255255

256+
# Forward extremities can build up in a room due to networking delays between
257+
# homeservers. Once this happens in a large room, calculation of the state of
258+
# that room can become quite expensive. To mitigate this, once the number of
259+
# forward extremities reaches a given threshold, Synapse will send an
260+
# org.matrix.dummy_event event, which will reduce the forward extremities
261+
# in the room.
262+
#
263+
# This setting defines the threshold (i.e. number of forward extremities in the
264+
# room) at which dummy events are sent. The default value is 10.
265+
#
266+
#dummy_events_threshold: 5
267+
256268

257269
## Homeserver blocking ##
258270

synapse/config/server.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -505,6 +505,9 @@ class LimitRemoteRoomsConfig(object):
505505
"cleanup_extremities_with_dummy_events", True
506506
)
507507

508+
# The number of forward extremities in a room needed to send a dummy event.
509+
self.dummy_events_threshold = config.get("dummy_events_threshold", 10)
510+
508511
self.enable_ephemeral_messages = config.get("enable_ephemeral_messages", False)
509512

510513
# Inhibits the /requestToken endpoints from returning an error that might leak
@@ -823,6 +826,18 @@ def generate_config_section(
823826
# bind_addresses: ['::1', '127.0.0.1']
824827
# type: manhole
825828
829+
# Forward extremities can build up in a room due to networking delays between
830+
# homeservers. Once this happens in a large room, calculation of the state of
831+
# that room can become quite expensive. To mitigate this, once the number of
832+
# forward extremities reaches a given threshold, Synapse will send an
833+
# org.matrix.dummy_event event, which will reduce the forward extremities
834+
# in the room.
835+
#
836+
# This setting defines the threshold (i.e. number of forward extremities in the
837+
# room) at which dummy events are sent. The default value is 10.
838+
#
839+
#dummy_events_threshold: 5
840+
826841
827842
## Homeserver blocking ##
828843

synapse/groups/attestations.py

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,6 @@
4646
from synapse.api.errors import HttpResponseException, RequestSendFailed, SynapseError
4747
from synapse.metrics.background_process_metrics import run_as_background_process
4848
from synapse.types import get_domain_from_id
49-
from synapse.util.async_helpers import yieldable_gather_results
5049

5150
logger = logging.getLogger(__name__)
5251

@@ -208,6 +207,5 @@ def _renew_attestation(group_user: Tuple[str, str]):
208207
"Error renewing attestation of %r in %r", user_id, group_id
209208
)
210209

211-
await yieldable_gather_results(
212-
_renew_attestation, ((row["group_id"], row["user_id"]) for row in rows)
213-
)
210+
for row in rows:
211+
await _renew_attestation((row["group_id"], row["user_id"]))

synapse/handlers/message.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -419,6 +419,8 @@ def __init__(self, hs):
419419

420420
self._ephemeral_events_enabled = hs.config.enable_ephemeral_messages
421421

422+
self._dummy_events_threshold = hs.config.dummy_events_threshold
423+
422424
@defer.inlineCallbacks
423425
def create_event(
424426
self,
@@ -1085,7 +1087,7 @@ async def _send_dummy_events_to_fill_extremities(self):
10851087
"""
10861088
self._expire_rooms_to_exclude_from_dummy_event_insertion()
10871089
room_ids = await self.store.get_rooms_with_many_extremities(
1088-
min_count=10,
1090+
min_count=self._dummy_events_threshold,
10891091
limit=5,
10901092
room_id_filter=self._rooms_to_exclude_from_dummy_event_insertion.keys(),
10911093
)

synapse/logging/context.py

Lines changed: 26 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -431,15 +431,7 @@ def stop(self, rusage: "Optional[resource._RUsage]") -> None:
431431
return
432432

433433
utime_delta, stime_delta = self._get_cputime(rusage)
434-
self._resource_usage.ru_utime += utime_delta
435-
self._resource_usage.ru_stime += stime_delta
436-
437-
# if we have a parent, pass our CPU usage stats on
438-
if self.parent_context:
439-
self.parent_context._resource_usage += self._resource_usage
440-
441-
# reset them in case we get entered again
442-
self._resource_usage.reset()
434+
self.add_cputime(utime_delta, stime_delta)
443435
finally:
444436
self.usage_start = None
445437

@@ -497,30 +489,52 @@ def _get_cputime(self, current: "resource._RUsage") -> Tuple[float, float]:
497489

498490
return utime_delta, stime_delta
499491

492+
def add_cputime(self, utime_delta: float, stime_delta: float) -> None:
493+
"""Update the CPU time usage of this context (and any parents, recursively).
494+
495+
Args:
496+
utime_delta: additional user time, in seconds, spent in this context.
497+
stime_delta: additional system time, in seconds, spent in this context.
498+
"""
499+
self._resource_usage.ru_utime += utime_delta
500+
self._resource_usage.ru_stime += stime_delta
501+
if self.parent_context:
502+
self.parent_context.add_cputime(utime_delta, stime_delta)
503+
500504
def add_database_transaction(self, duration_sec: float) -> None:
505+
"""Record the use of a database transaction and the length of time it took.
506+
507+
Args:
508+
duration_sec: The number of seconds the database transaction took.
509+
"""
501510
if duration_sec < 0:
502511
raise ValueError("DB txn time can only be non-negative")
503512
self._resource_usage.db_txn_count += 1
504513
self._resource_usage.db_txn_duration_sec += duration_sec
514+
if self.parent_context:
515+
self.parent_context.add_database_transaction(duration_sec)
505516

506517
def add_database_scheduled(self, sched_sec: float) -> None:
507518
"""Record a use of the database pool
508519
509520
Args:
510-
sched_sec (float): number of seconds it took us to get a
511-
connection
521+
sched_sec: number of seconds it took us to get a connection
512522
"""
513523
if sched_sec < 0:
514524
raise ValueError("DB scheduling time can only be non-negative")
515525
self._resource_usage.db_sched_duration_sec += sched_sec
526+
if self.parent_context:
527+
self.parent_context.add_database_scheduled(sched_sec)
516528

517529
def record_event_fetch(self, event_count: int) -> None:
518530
"""Record a number of events being fetched from the db
519531
520532
Args:
521-
event_count (int): number of events being fetched
533+
event_count: number of events being fetched
522534
"""
523535
self._resource_usage.evt_db_fetch_count += event_count
536+
if self.parent_context:
537+
self.parent_context.record_event_fetch(event_count)
524538

525539

526540
class LoggingContextFilter(logging.Filter):

synapse/python_dependencies.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,9 @@
9898
"sentry": ["sentry-sdk>=0.7.2"],
9999
"opentracing": ["jaeger-client>=4.0.0", "opentracing>=2.2.0"],
100100
"jwt": ["pyjwt>=1.6.4"],
101-
"redis": ["txredisapi>=1.4.7"],
101+
# hiredis is not a *strict* dependency, but it makes things much faster.
102+
# (if it is not installed, we fall back to slow code.)
103+
"redis": ["txredisapi>=1.4.7", "hiredis"],
102104
}
103105

104106
ALL_OPTIONAL_REQUIREMENTS = set() # type: Set[str]

0 commit comments

Comments
 (0)