7777from synapse .http .proxyagent import ProxyAgent
7878from synapse .http .replicationagent import ReplicationAgent
7979from synapse .http .types import QueryParams
80- from synapse .logging .context import make_deferred_yieldable , run_in_background
80+ from synapse .logging .context import (
81+ PreserveLoggingContext ,
82+ make_deferred_yieldable ,
83+ run_in_background ,
84+ )
8185from synapse .logging .opentracing import set_tag , start_active_span , tags
8286from synapse .metrics import SERVER_NAME_LABEL
8387from synapse .types import ISynapseReactor , StrSequence
@@ -1036,7 +1040,8 @@ def _maybe_fail(self) -> None:
10361040 Report a max size exceed error and disconnect the first time this is called.
10371041 """
10381042 if not self .deferred .called :
1039- self .deferred .errback (BodyExceededMaxSize ())
1043+ with PreserveLoggingContext ():
1044+ self .deferred .errback (BodyExceededMaxSize ())
10401045 # Close the connection (forcefully) since all the data will get
10411046 # discarded anyway.
10421047 assert self .transport is not None
@@ -1135,7 +1140,8 @@ def on_part_data(data: bytes, start: int, end: int) -> None:
11351140 logger .warning (
11361141 "Exception encountered writing file data to stream: %s" , e
11371142 )
1138- self .deferred .errback ()
1143+ with PreserveLoggingContext ():
1144+ self .deferred .errback ()
11391145 self .file_length += end - start
11401146
11411147 callbacks : "multipart.MultipartCallbacks" = {
@@ -1147,7 +1153,8 @@ def on_part_data(data: bytes, start: int, end: int) -> None:
11471153
11481154 self .total_length += len (incoming_data )
11491155 if self .max_length is not None and self .total_length >= self .max_length :
1150- self .deferred .errback (BodyExceededMaxSize ())
1156+ with PreserveLoggingContext ():
1157+ self .deferred .errback (BodyExceededMaxSize ())
11511158 # Close the connection (forcefully) since all the data will get
11521159 # discarded anyway.
11531160 assert self .transport is not None
@@ -1157,7 +1164,8 @@ def on_part_data(data: bytes, start: int, end: int) -> None:
11571164 self .parser .write (incoming_data )
11581165 except Exception as e :
11591166 logger .warning ("Exception writing to multipart parser: %s" , e )
1160- self .deferred .errback ()
1167+ with PreserveLoggingContext ():
1168+ self .deferred .errback ()
11611169 return
11621170
11631171 def connectionLost (self , reason : Failure = connectionDone ) -> None :
@@ -1167,9 +1175,11 @@ def connectionLost(self, reason: Failure = connectionDone) -> None:
11671175
11681176 if reason .check (ResponseDone ):
11691177 self .multipart_response .length = self .file_length
1170- self .deferred .callback (self .multipart_response )
1178+ with PreserveLoggingContext ():
1179+ self .deferred .callback (self .multipart_response )
11711180 else :
1172- self .deferred .errback (reason )
1181+ with PreserveLoggingContext ():
1182+ self .deferred .errback (reason )
11731183
11741184
11751185class _ReadBodyWithMaxSizeProtocol (protocol .Protocol ):
@@ -1193,15 +1203,17 @@ def dataReceived(self, data: bytes) -> None:
11931203 try :
11941204 self .stream .write (data )
11951205 except Exception :
1196- self .deferred .errback ()
1206+ with PreserveLoggingContext ():
1207+ self .deferred .errback ()
11971208 return
11981209
11991210 self .length += len (data )
12001211 # The first time the maximum size is exceeded, error and cancel the
12011212 # connection. dataReceived might be called again if data was received
12021213 # in the meantime.
12031214 if self .max_size is not None and self .length >= self .max_size :
1204- self .deferred .errback (BodyExceededMaxSize ())
1215+ with PreserveLoggingContext ():
1216+ self .deferred .errback (BodyExceededMaxSize ())
12051217 # Close the connection (forcefully) since all the data will get
12061218 # discarded anyway.
12071219 assert self .transport is not None
@@ -1213,7 +1225,8 @@ def connectionLost(self, reason: Failure = connectionDone) -> None:
12131225 return
12141226
12151227 if reason .check (ResponseDone ):
1216- self .deferred .callback (self .length )
1228+ with PreserveLoggingContext ():
1229+ self .deferred .callback (self .length )
12171230 elif reason .check (PotentialDataLoss ):
12181231 # This applies to requests which don't set `Content-Length` or a
12191232 # `Transfer-Encoding` in the response because in this case the end of the
@@ -1222,9 +1235,11 @@ def connectionLost(self, reason: Failure = connectionDone) -> None:
12221235 # behavior is expected of some servers (like YouTube), let's ignore it.
12231236 # Stolen from https://github.com/twisted/treq/pull/49/files
12241237 # http://twistedmatrix.com/trac/ticket/4840
1225- self .deferred .callback (self .length )
1238+ with PreserveLoggingContext ():
1239+ self .deferred .callback (self .length )
12261240 else :
1227- self .deferred .errback (reason )
1241+ with PreserveLoggingContext ():
1242+ self .deferred .errback (reason )
12281243
12291244
12301245def read_body_with_max_size (
0 commit comments