@@ -40,6 +40,7 @@ class InvocationRequest(object):
40
40
'id' ,
41
41
'registration' ,
42
42
'caller' ,
43
+ 'caller_session_id' ,
43
44
'call' ,
44
45
'callee' ,
45
46
'forward_for' ,
@@ -53,6 +54,7 @@ def __init__(self, id, registration, caller, call, callee, forward_for, authoriz
53
54
self .id = id
54
55
self .registration = registration
55
56
self .caller = caller
57
+ self .caller_session_id = caller ._session_id
56
58
self .call = call
57
59
self .callee = callee
58
60
self .forward_for = forward_for
@@ -185,6 +187,7 @@ def detach(self, session):
185
187
is_rlink_session = (session ._authrole == "rlink" )
186
188
if session in self ._caller_to_invocations :
187
189
190
+ # this needs to update all four places where we track invocations similar to _remove_invoke_request
188
191
outstanding = self ._caller_to_invocations .get (session , [])
189
192
for invoke in outstanding : # type: InvocationRequest
190
193
if invoke .canceled :
@@ -207,11 +210,26 @@ def detach(self, session):
207
210
request = invoke .id ,
208
211
session = session ._session_id ,
209
212
)
213
+
214
+ if invoke .timeout_call :
215
+ invoke .timeout_call .cancel ()
216
+ invoke .timeout_call = None
217
+
218
+ invokes = self ._callee_to_invocations [callee ]
219
+ invokes .remove (invoke )
220
+ if not invokes :
221
+ del self ._callee_to_invocations [callee ]
222
+
223
+ del self ._invocations [invoke .id ]
224
+ del self ._invocations_by_call [(invoke .caller_session_id , invoke .call .request )]
225
+
210
226
self ._router .send (invoke .callee , message .Interrupt (
211
227
request = invoke .id ,
212
228
mode = message .Cancel .KILLNOWAIT ,
213
229
))
214
230
231
+ del self ._caller_to_invocations [session ]
232
+
215
233
if session in self ._session_to_registrations :
216
234
217
235
# send out Errors for any in-flight calls we have
@@ -235,6 +253,21 @@ def detach(self, session):
235
253
if invoke .caller ._transport :
236
254
invoke .caller ._transport .send (reply )
237
255
256
+ if invoke .timeout_call :
257
+ invoke .timeout_call .cancel ()
258
+ invoke .timeout_call = None
259
+
260
+ invokes = self ._caller_to_invocations [invoke .caller ]
261
+ invokes .remove (invoke )
262
+ if not invokes :
263
+ del self ._caller_to_invocations [invoke .caller ]
264
+
265
+ del self ._invocations [invoke .id ]
266
+ del self ._invocations_by_call [(invoke .caller_session_id , invoke .call .request )]
267
+
268
+ if outstanding :
269
+ del self ._callee_to_invocations [session ]
270
+
238
271
for registration in self ._session_to_registrations [session ]:
239
272
was_registered , was_last_callee = self ._registration_map .drop_observer (session , registration )
240
273
@@ -1120,23 +1153,20 @@ def _remove_invoke_request(self, invocation_request):
1120
1153
invocation_request .timeout_call .cancel ()
1121
1154
invocation_request .timeout_call = None
1122
1155
1123
- invokes = self ._callee_to_invocations [invocation_request .callee ]
1124
- invokes .remove (invocation_request )
1125
- if not invokes :
1126
- del self ._callee_to_invocations [invocation_request .callee ]
1127
-
1128
- invokes = self ._caller_to_invocations [invocation_request .caller ]
1129
- invokes .remove (invocation_request )
1130
- if not invokes :
1131
- del self ._caller_to_invocations [invocation_request .caller ]
1156
+ # all four places should always be updated together
1157
+ if invocation_request .id in self ._invocations :
1158
+ del self ._invocations [invocation_request .id ]
1159
+ invokes = self ._callee_to_invocations [invocation_request .callee ]
1160
+ invokes .remove (invocation_request )
1161
+ if not invokes :
1162
+ del self ._callee_to_invocations [invocation_request .callee ]
1132
1163
1133
- del self ._invocations [invocation_request .id ]
1164
+ invokes = self ._caller_to_invocations [invocation_request .caller ]
1165
+ invokes .remove (invocation_request )
1166
+ if not invokes :
1167
+ del self ._caller_to_invocations [invocation_request .caller ]
1134
1168
1135
- # the session_id will be None if the caller session has
1136
- # already vanished
1137
- caller_id = invocation_request .caller ._session_id
1138
- if caller_id is not None :
1139
- del self ._invocations_by_call [caller_id , invocation_request .call .request ]
1169
+ del self ._invocations_by_call [invocation_request .caller_session_id , invocation_request .call .request ]
1140
1170
1141
1171
# noinspection PyUnusedLocal
1142
1172
def processCancel (self , session , cancel ):
0 commit comments