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:
parent
ca5a3b2876
commit
d03317743b
|
@ -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,
|
||||
|
|
|
@ -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):
|
||||
|
||||
|
|
Loading…
Reference in New Issue