Merge "Enable graceful shutdown of mdns"

This commit is contained in:
Zuul
2019-10-19 05:28:27 +00:00
committed by Gerrit Code Review
5 changed files with 17 additions and 17 deletions

View File

@@ -60,7 +60,7 @@ class Service(service.Service):
self.dns_service.start()
self.backend.start()
def stop(self, graceful=False):
def stop(self, graceful=True):
self.dns_service.stop()
self.backend.stop()
super(Service, self).stop(graceful)

View File

@@ -54,7 +54,7 @@ class Service(service.RPCService):
super(Service, self).start()
self.dns_service.start()
def stop(self, graceful=False):
def stop(self, graceful=True):
self.dns_service.stop()
super(Service, self).stop(graceful)

View File

@@ -20,6 +20,7 @@
import errno
import socket
import struct
import threading
import eventlet.debug
from oslo_log import log as logging
@@ -167,6 +168,7 @@ class DNSService(object):
_TCP_RECV_MAX_SIZE = 65535
def __init__(self, app, tg, listen, tcp_backlog, tcp_recv_timeout):
self._running = threading.Event()
self.app = app
self.tg = tg
self.tcp_backlog = tcp_backlog
@@ -182,6 +184,8 @@ class DNSService(object):
self._dns_socks_udp = []
def start(self):
self._running.set()
addresses = map(
netutils.parse_host_port,
set(self.listen)
@@ -204,6 +208,8 @@ class DNSService(object):
self.tg.add_thread(self._dns_handle_udp, sock_udp)
def stop(self):
self._running.clear()
for sock_tcp in self._dns_socks_tcp:
sock_tcp.close()
@@ -214,7 +220,7 @@ class DNSService(object):
LOG.info('_handle_tcp thread started')
client = None
while True:
while self._running.is_set():
try:
# handle a new TCP connection
client, addr = sock_tcp.accept()
@@ -235,18 +241,13 @@ class DNSService(object):
# ending unexpectedly. Ensure proper ordering of blocks, and
# ensure no exceptions are generated from within.
except socket.timeout:
if client:
client.close()
LOG.warning('TCP Timeout from: %(host)s:%(port)d',
{'host': addr[0], 'port': addr[1]})
pass
except socket.error as e:
if client:
client.close()
errname = errno.errorcode[e.args[0]]
LOG.warning('Socket error %(err)s from: %(host)s:%(port)d',
{'host': addr[0], 'port': addr[1], 'err': errname})
except Exception:
if client:
client.close()
@@ -310,7 +311,6 @@ class DNSService(object):
except socket.timeout:
LOG.info('TCP Timeout from: %(host)s:%(port)d',
{'host': host, 'port': port})
except socket.error as e:
errname = errno.errorcode[e.args[0]]
LOG.warning('Socket error %(err)s from: %(host)s:%(port)d',
@@ -336,7 +336,7 @@ class DNSService(object):
"""
LOG.info('_handle_udp thread started')
while True:
while self._running.is_set():
try:
# TODO(kiall): Determine the appropriate default value for
# UDP recvfrom.
@@ -348,12 +348,12 @@ class DNSService(object):
# Dispatch a thread to handle the query
self.tg.add_thread(self._dns_handle_udp_query, sock_udp, addr,
payload)
except socket.timeout:
pass
except socket.error as e:
errname = errno.errorcode[e.args[0]]
LOG.warning('Socket error %(err)s from: %(host)s:%(port)d',
{'host': addr[0], 'port': addr[1], 'err': errname})
except Exception:
LOG.exception('Unknown exception handling UDP request from: '
'%(host)s:%(port)d',

View File

@@ -419,7 +419,7 @@ class TestUtils(oslotest.base.BaseTestCase):
utils.bind_tcp('127.0.0.1', 53, 100, 1)
mock_sock.setblocking.assert_called_once_with(True)
mock_sock.settimeout.assert_called_once_with(1)
mock_sock.bind.assert_called_once_with(('127.0.0.1', 53))
@@ -465,7 +465,7 @@ class TestUtils(oslotest.base.BaseTestCase):
utils.bind_udp('127.0.0.1', 53)
mock_sock.setblocking.assert_called_once_with(True)
mock_sock.settimeout.assert_called_once_with(1)
mock_sock.bind.assert_called_once_with(('127.0.0.1', 53))

View File

@@ -352,7 +352,7 @@ def bind_tcp(host, port, tcp_backlog, tcp_keepidle=None):
socket.TCP_KEEPIDLE,
tcp_keepidle)
sock_tcp.setblocking(True)
sock_tcp.settimeout(1)
sock_tcp.bind((host, port))
if port == 0:
newport = sock_tcp.getsockname()[1]
@@ -385,7 +385,7 @@ def bind_udp(host, port):
except Exception:
LOG.info('SO_REUSEPORT not available, ignoring.')
sock_udp.setblocking(True)
sock_udp.settimeout(1)
sock_udp.bind((host, port))
if port == 0:
newport = sock_udp.getsockname()[1]