2 files changed, 12 insertions, 3 deletions
diff --git a/changelog.d/10932.feature b/changelog.d/10932.feature
new file mode 100644
index 0000000000..07e7b2c6a7
--- /dev/null
+++ b/changelog.d/10932.feature
@@ -0,0 +1 @@
+Speed up responding with large JSON objects to requests.
diff --git a/synapse/http/server.py b/synapse/http/server.py
index 1a50305dcf..0df1bfbeef 100644
--- a/synapse/http/server.py
+++ b/synapse/http/server.py
@@ -561,9 +561,17 @@ class _ByteProducer:
self._iterator = iterator
self._paused = False
- # Register the producer and start producing data.
- self._request.registerProducer(self, True)
- self.resumeProducing()
+ try:
+ self._request.registerProducer(self, True)
+ except RuntimeError as e:
+ logger.info("Connection disconnected before response was written: %r", e)
+
+ # We drop our references to data we'll not use.
+ self._request = None
+ self._iterator = iter(())
+ else:
+ # Start producing if `registerProducer` was successful
+ self.resumeProducing()
def _send_data(self, data: List[bytes]) -> None:
"""
|