summary refs log tree commit diff
path: root/synapse/util
diff options
context:
space:
mode:
authorDavid Robertson <davidr@element.io>2022-10-06 19:17:50 +0100
committerGitHub <noreply@github.com>2022-10-06 18:17:50 +0000
commitcb20b885cb4bd1648581dd043a184d86fc8c7a00 (patch)
tree20ffd08e96133128eb1c363fc00bc5379642ed3c /synapse/util
parentMerge tag 'v1.69.0rc2' into develop (diff)
downloadsynapse-cb20b885cb4bd1648581dd043a184d86fc8c7a00.tar.xz
Always close _all_ `ijson` coroutines, even if doing so raises Exceptions (#14065)
Diffstat (limited to 'synapse/util')
-rw-r--r--synapse/util/__init__.py14
1 files changed, 13 insertions, 1 deletions
diff --git a/synapse/util/__init__.py b/synapse/util/__init__.py
index a90f08dd4c..7be9d5f113 100644
--- a/synapse/util/__init__.py
+++ b/synapse/util/__init__.py
@@ -15,7 +15,7 @@
 import json
 import logging
 import typing
-from typing import Any, Callable, Dict, Generator, Optional
+from typing import Any, Callable, Dict, Generator, Optional, Sequence
 
 import attr
 from frozendict import frozendict
@@ -193,3 +193,15 @@ def log_failure(
 # Version string with git info. Computed here once so that we don't invoke git multiple
 # times.
 SYNAPSE_VERSION = get_distribution_version_string("matrix-synapse", __file__)
+
+
+class ExceptionBundle(Exception):
+    # A poor stand-in for something like Python 3.11's ExceptionGroup.
+    # (A backport called `exceptiongroup` exists but seems overkill: we just want a
+    # container type here.)
+    def __init__(self, message: str, exceptions: Sequence[Exception]):
+        parts = [message]
+        for e in exceptions:
+            parts.append(str(e))
+        super().__init__("\n  - ".join(parts))
+        self.exceptions = exceptions