fix bug when connection is interrupted on the hw connection
+ stop listening for 10 seconds after an error
This commit is contained in:
25
router.py
25
router.py
@ -168,6 +168,9 @@ class Router(IoHandler):
|
|||||||
except Exception as e:
|
except Exception as e:
|
||||||
msg = f'error in request: {e!r}'
|
msg = f'error in request: {e!r}'
|
||||||
self.service.failures[self.service.port] = msg
|
self.service.failures[self.service.port] = msg
|
||||||
|
Service.deadline = time.time() + 10
|
||||||
|
Service.reopen.append(self.service)
|
||||||
|
self.service.close()
|
||||||
log.error(msg)
|
log.error(msg)
|
||||||
self.close()
|
self.close()
|
||||||
|
|
||||||
@ -345,6 +348,8 @@ class Service:
|
|||||||
failures = {}
|
failures = {}
|
||||||
firewall_ports = set()
|
firewall_ports = set()
|
||||||
tmo = 5
|
tmo = 5
|
||||||
|
reopen = []
|
||||||
|
deadline = None
|
||||||
|
|
||||||
def __init__(self, port, addr, iocls, maxcount=None, handler_args=()):
|
def __init__(self, port, addr, iocls, maxcount=None, handler_args=()):
|
||||||
self.handlers = {}
|
self.handlers = {}
|
||||||
@ -399,6 +404,21 @@ class Service:
|
|||||||
self.failures.pop(self.port, None)
|
self.failures.pop(self.port, None)
|
||||||
self.handlers[handler.fno] = handler
|
self.handlers[handler.fno] = handler
|
||||||
|
|
||||||
|
def close(self):
|
||||||
|
s = self.socket
|
||||||
|
self.readers.pop(s.fileno(), None)
|
||||||
|
s.close()
|
||||||
|
|
||||||
|
def clone(self):
|
||||||
|
return type(self)(self.port, self.addr, self.iocls)
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def check_deadline(cls):
|
||||||
|
if cls.deadline and time.time() > cls.deadline:
|
||||||
|
cls.deadline = None
|
||||||
|
while cls.reopen:
|
||||||
|
cls.reopen.pop().clone()
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def run(cls, routes):
|
def run(cls, routes):
|
||||||
firewall = routes.pop('firewall', None)
|
firewall = routes.pop('firewall', None)
|
||||||
@ -433,7 +453,8 @@ class Service:
|
|||||||
if ready:
|
if ready:
|
||||||
break
|
break
|
||||||
else:
|
else:
|
||||||
ready, complete, _ = select(cls.readers, [], [])
|
ready, complete, _ = select(cls.readers, [], [], 1)
|
||||||
|
cls.check_deadline()
|
||||||
# log.debug('ready %r', ready)
|
# log.debug('ready %r', ready)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
for fno in cls.readers:
|
for fno in cls.readers:
|
||||||
@ -448,7 +469,7 @@ class Service:
|
|||||||
log.error('%r in select([],[%d])', e, fno)
|
log.error('%r in select([],[%d])', e, fno)
|
||||||
raise
|
raise
|
||||||
for fno in ready:
|
for fno in ready:
|
||||||
cls.readers[fno]()
|
cls.readers.get(fno, int)() # int() -> dummy function
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
|
Reference in New Issue
Block a user