diff --git a/synapse/config/_base.py b/synapse/config/_base.py
index 1f6362aedd..2ce60610ca 100644
--- a/synapse/config/_base.py
+++ b/synapse/config/_base.py
@@ -174,15 +174,29 @@ class Config:
@staticmethod
def parse_size(value: Union[str, int]) -> int:
- if isinstance(value, int):
+ """Interpret `value` as a number of bytes.
+
+ If an integer is provided it is treated as bytes and is unchanged.
+
+ String byte sizes can have a suffix of 'K' or `M`, representing kibibytes and
+ mebibytes respectively. No suffix is understood as a plain byte count.
+
+ Raises:
+ TypeError, if given something other than an integer or a string
+ ValueError: if given a string not of the form described above.
+ """
+ if type(value) is int:
return value
- sizes = {"K": 1024, "M": 1024 * 1024}
- size = 1
- suffix = value[-1]
- if suffix in sizes:
- value = value[:-1]
- size = sizes[suffix]
- return int(value) * size
+ elif type(value) is str:
+ sizes = {"K": 1024, "M": 1024 * 1024}
+ size = 1
+ suffix = value[-1]
+ if suffix in sizes:
+ value = value[:-1]
+ size = sizes[suffix]
+ return int(value) * size
+ else:
+ raise TypeError(f"Bad byte size {value!r}")
@staticmethod
def parse_duration(value: Union[str, int]) -> int:
@@ -198,22 +212,36 @@ class Config:
Returns:
The number of milliseconds in the duration.
+
+ Raises:
+ TypeError, if given something other than an integer or a string
+ ValueError: if given a string not of the form described above.
"""
- if isinstance(value, int):
+ if type(value) is int:
return value
- second = 1000
- minute = 60 * second
- hour = 60 * minute
- day = 24 * hour
- week = 7 * day
- year = 365 * day
- sizes = {"s": second, "m": minute, "h": hour, "d": day, "w": week, "y": year}
- size = 1
- suffix = value[-1]
- if suffix in sizes:
- value = value[:-1]
- size = sizes[suffix]
- return int(value) * size
+ elif type(value) is str:
+ second = 1000
+ minute = 60 * second
+ hour = 60 * minute
+ day = 24 * hour
+ week = 7 * day
+ year = 365 * day
+ sizes = {
+ "s": second,
+ "m": minute,
+ "h": hour,
+ "d": day,
+ "w": week,
+ "y": year,
+ }
+ size = 1
+ suffix = value[-1]
+ if suffix in sizes:
+ value = value[:-1]
+ size = sizes[suffix]
+ return int(value) * size
+ else:
+ raise TypeError(f"Bad duration {value!r}")
@staticmethod
def abspath(file_path: str) -> str:
diff --git a/synapse/config/cache.py b/synapse/config/cache.py
index 015b2a138e..05f69cb1ba 100644
--- a/synapse/config/cache.py
+++ b/synapse/config/cache.py
@@ -126,7 +126,7 @@ class CacheConfig(Config):
cache_config = config.get("caches") or {}
self.global_factor = cache_config.get("global_factor", _DEFAULT_FACTOR_SIZE)
- if not isinstance(self.global_factor, (int, float)):
+ if type(self.global_factor) not in (int, float):
raise ConfigError("caches.global_factor must be a number.")
# Load cache factors from the config
@@ -151,7 +151,7 @@ class CacheConfig(Config):
)
for cache, factor in individual_factors.items():
- if not isinstance(factor, (int, float)):
+ if type(factor) not in (int, float):
raise ConfigError(
"caches.per_cache_factors.%s must be a number" % (cache,)
)
diff --git a/synapse/config/server.py b/synapse/config/server.py
index 80bcfa4080..ecdaa2d9dd 100644
--- a/synapse/config/server.py
+++ b/synapse/config/server.py
@@ -904,7 +904,7 @@ def parse_listener_def(num: int, listener: Any) -> ListenerConfig:
raise ConfigError(DIRECT_TCP_ERROR, ("listeners", str(num), "type"))
port = listener.get("port")
- if not isinstance(port, int):
+ if type(port) is not int:
raise ConfigError("Listener configuration is lacking a valid 'port' option")
tls = listener.get("tls", False)
|