fix graceful restart and add unit test
This commit is contained in:
@ -192,7 +192,7 @@ class EventLoop(object):
|
||||
def run(self):
|
||||
events = []
|
||||
while not self._stopping:
|
||||
now = time.time()
|
||||
asap = False
|
||||
try:
|
||||
events = self.poll(TIMEOUT_PRECISION)
|
||||
except (OSError, IOError) as e:
|
||||
@ -200,6 +200,7 @@ class EventLoop(object):
|
||||
# EPIPE: Happens when the client closes the connection
|
||||
# EINTR: Happens when received a signal
|
||||
# handles them as soon as possible
|
||||
asap = True
|
||||
logging.debug('poll:%s', e)
|
||||
else:
|
||||
logging.error('poll:%s', e)
|
||||
@ -214,7 +215,8 @@ class EventLoop(object):
|
||||
handler.handle_event(sock, fd, event)
|
||||
except (OSError, IOError) as e:
|
||||
shell.print_exception(e)
|
||||
if now - self._last_time >= TIMEOUT_PRECISION:
|
||||
now = time.time()
|
||||
if asap or now - self._last_time >= TIMEOUT_PRECISION:
|
||||
for callback in self._periodic_callbacks:
|
||||
callback()
|
||||
self._last_time = now
|
||||
|
@ -689,18 +689,19 @@ class TCPRelay(object):
|
||||
logging.warn('poll removed fd')
|
||||
|
||||
def handle_periodic(self):
|
||||
self._sweep_timeout()
|
||||
if self._closed:
|
||||
if self._server_socket:
|
||||
self._eventloop.remove(self._server_socket, self)
|
||||
self._eventloop.remove_periodic(self.handle_periodic)
|
||||
self._server_socket.close()
|
||||
self._server_socket = None
|
||||
logging.info('closed listen port %d', self._listen_port)
|
||||
logging.info('closed TCP port %d', self._listen_port)
|
||||
if not self._fd_to_handlers:
|
||||
logging.info('stopping')
|
||||
self._eventloop.stop()
|
||||
self._sweep_timeout()
|
||||
|
||||
def close(self, next_tick=False):
|
||||
logging.debug('TCP close')
|
||||
self._closed = True
|
||||
if not next_tick:
|
||||
if self._eventloop:
|
||||
|
@ -272,14 +272,18 @@ class UDPRelay(object):
|
||||
self._handle_client(sock)
|
||||
|
||||
def handle_periodic(self):
|
||||
if self._closed:
|
||||
if self._server_socket:
|
||||
logging.info('closed UDP port %d', self._listen_port)
|
||||
self._server_socket.close()
|
||||
self._server_socket = None
|
||||
for sock in self._sockets:
|
||||
sock.close()
|
||||
self._cache.sweep()
|
||||
self._client_fd_to_server_addr.sweep()
|
||||
if self._closed:
|
||||
self._server_socket.close()
|
||||
for sock in self._sockets:
|
||||
sock.close()
|
||||
|
||||
def close(self, next_tick=False):
|
||||
logging.debug('UDP close')
|
||||
self._closed = True
|
||||
if not next_tick:
|
||||
if self._eventloop:
|
||||
|
Reference in New Issue
Block a user