Merge "BSN: Set inconsistency record on delete failure"

This commit is contained in:
Jenkins 2014-11-19 04:41:11 +00:00 committed by Gerrit Code Review
commit ee74e03db0
2 changed files with 20 additions and 0 deletions

View File

@ -473,6 +473,13 @@ class ServerPool(object):
'data': ret[3]}) 'data': ret[3]})
active_server.failed = True active_server.failed = True
# A failure on a delete means the object is gone from Neutron but not
# from the controller. Set the consistency hash to a bad value to
# trigger a sync on the next check.
# NOTE: The hash must have a comma in it otherwise it will be ignored
# by the backend.
if action == 'DELETE':
hash_handler.put_hash('INCONSISTENT,INCONSISTENT')
# All servers failed, reset server list and try again next time # All servers failed, reset server list and try again next time
LOG.error(_('ServerProxy: %(action)s failure for all servers: ' LOG.error(_('ServerProxy: %(action)s failure for all servers: '
'%(server)r'), '%(server)r'),

View File

@ -23,6 +23,7 @@ from oslo.serialization import jsonutils
from neutron import context from neutron import context
from neutron import manager from neutron import manager
from neutron.openstack.common import importutils from neutron.openstack.common import importutils
from neutron.plugins.bigswitch.db import consistency_db as cdb
from neutron.plugins.bigswitch import servermanager from neutron.plugins.bigswitch import servermanager
from neutron.tests.unit.bigswitch import test_restproxy_plugin as test_rp from neutron.tests.unit.bigswitch import test_restproxy_plugin as test_rp
@ -411,6 +412,18 @@ class ServerManagerTests(test_rp.BigSwitchProxyPluginV2TestCase):
sleep_call_count = rest_call_count - 1 sleep_call_count = rest_call_count - 1
tmock.assert_has_calls(sleep_call * sleep_call_count) tmock.assert_has_calls(sleep_call * sleep_call_count)
def test_delete_failure_sets_bad_hash(self):
pl = manager.NeutronManager.get_plugin()
hash_handler = cdb.HashHandler()
with mock.patch(
SERVERMANAGER + '.ServerProxy.rest_call',
return_value=(httplib.INTERNAL_SERVER_ERROR, 0, 0, 0)
):
# a failed delete call should put a bad hash in the DB
pl.servers.rest_call('DELETE', '/', '', None, [])
self.assertEqual('INCONSISTENT,INCONSISTENT',
hash_handler.read_for_update())
def test_conflict_triggers_sync(self): def test_conflict_triggers_sync(self):
pl = manager.NeutronManager.get_plugin() pl = manager.NeutronManager.get_plugin()
with mock.patch( with mock.patch(