1 files changed, 13 insertions, 7 deletions
diff --git a/synapse/http/site.py b/synapse/http/site.py
index e092193c9c..514f2f1402 100644
--- a/synapse/http/site.py
+++ b/synapse/http/site.py
@@ -15,6 +15,7 @@ import contextlib
import logging
import time
+from twisted.python.failure import Failure
from twisted.web.server import Request, Site
from synapse.http import redact_uri
@@ -190,9 +191,21 @@ class SynapseRequest(Request):
Overrides twisted.web.server.Request.connectionLost to record the finish time and
do logging.
"""
+ # There is a bug in Twisted where reason is not wrapped in a Failure object
+ # Detect this and wrap it manually as a workaround
+ # More information: https://github.com/matrix-org/synapse/issues/7441
+ if not isinstance(reason, Failure):
+ reason = Failure(reason)
+
self.finish_time = time.time()
Request.connectionLost(self, reason)
+ if self.logcontext is None:
+ logger.info(
+ "Connection from %s lost before request headers were read", self.client
+ )
+ return
+
# we only get here if the connection to the client drops before we send
# the response.
#
@@ -236,13 +249,6 @@ class SynapseRequest(Request):
def _finished_processing(self):
"""Log the completion of this request and update the metrics
"""
-
- if self.logcontext is None:
- # this can happen if the connection closed before we read the
- # headers (so render was never called). In that case we'll already
- # have logged a warning, so just bail out.
- return
-
usage = self.logcontext.get_resource_usage()
if self._processing_finished_time is None:
|