|
@@ -19,7 +19,7 @@ import logging
|
|
|
import os.path
|
|
|
import re
|
|
|
from textwrap import indent
|
|
|
-from typing import Any, Dict, Iterable, List, Optional, Set
|
|
|
+from typing import Any, Dict, Iterable, List, Optional, Set, Tuple
|
|
|
|
|
|
import attr
|
|
|
import yaml
|
|
@@ -572,6 +572,7 @@ class ServerConfig(Config):
|
|
|
_warn_if_webclient_configured(self.listeners)
|
|
|
|
|
|
self.gc_thresholds = read_gc_thresholds(config.get("gc_thresholds", None))
|
|
|
+ self.gc_seconds = self.read_gc_intervals(config.get("gc_min_interval", None))
|
|
|
|
|
|
@attr.s
|
|
|
class LimitRemoteRoomsConfig:
|
|
@@ -917,6 +918,16 @@ class ServerConfig(Config):
|
|
|
#
|
|
|
#gc_thresholds: [700, 10, 10]
|
|
|
|
|
|
+ # The minimum time in seconds between each GC for a generation, regardless of
|
|
|
+ # the GC thresholds. This ensures that we don't do GC too frequently.
|
|
|
+ #
|
|
|
+ # A value of `[1s, 10s, 30s]` indicates that a second must pass between consecutive
|
|
|
+ # generation 0 GCs, etc.
|
|
|
+ #
|
|
|
+ # Defaults to `[1s, 10s, 30s]`.
|
|
|
+ #
|
|
|
+ #gc_min_interval: [0.5s, 30s, 1m]
|
|
|
+
|
|
|
# Set the limit on the returned events in the timeline in the get
|
|
|
# and sync operations. The default value is 100. -1 means no upper limit.
|
|
|
#
|
|
@@ -1305,6 +1316,24 @@ class ServerConfig(Config):
|
|
|
help="Turn on the twisted telnet manhole service on the given port.",
|
|
|
)
|
|
|
|
|
|
+ def read_gc_intervals(self, durations) -> Optional[Tuple[float, float, float]]:
|
|
|
+ """Reads the three durations for the GC min interval option, returning seconds."""
|
|
|
+ if durations is None:
|
|
|
+ return None
|
|
|
+
|
|
|
+ try:
|
|
|
+ if len(durations) != 3:
|
|
|
+ raise ValueError()
|
|
|
+ return (
|
|
|
+ self.parse_duration(durations[0]) / 1000,
|
|
|
+ self.parse_duration(durations[1]) / 1000,
|
|
|
+ self.parse_duration(durations[2]) / 1000,
|
|
|
+ )
|
|
|
+ except Exception:
|
|
|
+ raise ConfigError(
|
|
|
+ "Value of `gc_min_interval` must be a list of three durations if set"
|
|
|
+ )
|
|
|
+
|
|
|
|
|
|
def is_threepid_reserved(reserved_threepids, threepid):
|
|
|
"""Check the threepid against the reserved threepid config
|