Fix so timing out connections to actually work.

This commit is contained in:
Erik Johnston 2015-02-11 16:48:05 +00:00
parent 41a9a76a99
commit ef276e8770
2 changed files with 45 additions and 9 deletions

View File

@ -72,5 +72,7 @@ class ReplicationLayer(FederationClient, FederationServer):
self._order = 0 self._order = 0
self.hs = hs
def __str__(self): def __str__(self):
return "<ReplicationLayer(%s)>" % self.server_name return "<ReplicationLayer(%s)>" % self.server_name

View File

@ -18,6 +18,9 @@ from synapse.util.logcontext import LoggingContext
from twisted.internet import defer, reactor, task from twisted.internet import defer, reactor, task
import time import time
import logging
logger = logging.getLogger(__name__)
class Clock(object): class Clock(object):
@ -55,20 +58,51 @@ class Clock(object):
timer.cancel() timer.cancel()
def time_bound_deferred(self, given_deferred, time_out): def time_bound_deferred(self, given_deferred, time_out):
if given_deferred.called:
return given_deferred
ret_deferred = defer.Deferred() ret_deferred = defer.Deferred()
def timed_out(): def timed_out_fn():
if not given_deferred.called: try:
given_deferred.cancel()
ret_deferred.errback(RuntimeError("Timed out")) ret_deferred.errback(RuntimeError("Timed out"))
except:
pass
timer = self.call_later(time_out, timed_out) try:
given_deferred.cancel()
except:
pass
def succeed(result): timer = None
def cancel(res):
try:
self.cancel_call_later(timer) self.cancel_call_later(timer)
ret_deferred.callback(result) except:
pass
return res
given_deferred.addCallback(succeed) ret_deferred.addBoth(cancel)
given_deferred.addErrback(ret_deferred.errback)
def sucess(res):
try:
ret_deferred.callback(res)
except:
pass
return res
def err(res):
try:
ret_deferred.errback(res)
except:
pass
return res
given_deferred.addCallbacks(callback=sucess, errback=err)
timer = self.call_later(time_out, timed_out_fn)
return ret_deferred return ret_deferred