'data': ret[3]})
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
LOG.error(_('ServerProxy: %(action)s failure for all servers: '
'%(server)r'),
from neutron import manager
from neutron.openstack.common import importutils
from neutron.openstack.common import jsonutils
+from neutron.plugins.bigswitch.db import consistency_db as cdb
from neutron.plugins.bigswitch import servermanager
from neutron.tests.unit.bigswitch import test_restproxy_plugin as test_rp
sleep_call_count = rest_call_count - 1
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):
pl = manager.NeutronManager.get_plugin()
with mock.patch(