TypeError: 'OSError' object is not subscriptable raised when terminate senlin-api process unexpectedly

When terminate senlin-api process the `evenlet.wsgi.server` raised OSError exception that is not a list or a tuple which make TypeError raised and the senlin-api process may not be terminated properly

Closes-Bug: #2047914
Change-Id: Id02befe51e9118c8d8dafc3c926398fbf7e1258e
This commit is contained in:
Pham Le Gia Dai 2024-01-03 15:41:34 +07:00
parent ca5a3b2876
commit d03317743b
2 changed files with 23 additions and 3 deletions

View File

@ -52,7 +52,7 @@ VER_METHOD_ATTR = 'versioned_methods'
def get_bind_addr(conf, default_port=None):
return (conf.bind_host, conf.bind_port or default_port)
return conf.bind_host, conf.bind_port or default_port
def get_socket(conf, default_port):
@ -376,7 +376,7 @@ class Server(object):
keepalive=cfg.CONF.senlin_api.wsgi_keep_alive,
socket_timeout=socket_timeout)
except socket.error as err:
if err[0] != errno.EINVAL:
if err.errno != errno.EINVAL:
raise
self.pool.waitall()
@ -566,7 +566,7 @@ class Resource(object):
action, request)
action_args.update(deserialized_request)
LOG.debug(('Calling %(controller)s : %(action)s'),
LOG.debug('Calling %(controller)s : %(action)s',
{'controller': self.controller, 'action': action})
action_result = self.dispatch(self.controller, action,

View File

@ -330,6 +330,26 @@ class GetSocketTestCase(base.SenlinTestCase):
self.assertRaises(wsgi.socket.error, wsgi.get_socket,
wsgi.cfg.CONF.senlin_api, 1234)
def test_run_server_with_unexpected_socket_errno(self):
mock_server = mock.Mock(side_effect=wsgi.socket.error())
mock_server.side_effect.errno = socket.errno.ENOMEM
self.useFixture(fixtures.MonkeyPatch(
'senlin.api.common.wsgi.eventlet.wsgi.server', mock_server))
wsgi.cfg.CONF.senlin_api.workers = 1
wsgi.cfg.CONF.debug = False
server = wsgi.Server(name='senlin-api', conf=cfg.CONF.senlin_api)
server.sock = mock.Mock()
server.application = mock.Mock()
exc = self.assertRaises(wsgi.socket.error, server.run_server)
self.assertEqual(socket.errno.ENOMEM, exc.errno)
mock_server.side_effect = wsgi.socket.error()
mock_server.side_effect.errno = socket.errno.EINVAL
server.run_server()
class FakeController(wsgi.Controller):