From dcc223fa53238a2d0bcbb210cdc19dd61a9f16e9 Mon Sep 17 00:00:00 2001 From: Kevin Benton Date: Thu, 2 Oct 2014 11:26:50 -0700 Subject: [PATCH] BSN: Set inconsistency record on delete failure Set a bad value in the consistency DB on a delete failure so a sync is triggered the next time the backend servers become available. This fixes the issue where the backend servers are unavailable when an object is deleted from ML2 but not deleted from the backend. Closes-Bug: #1377350 Change-Id: I24713a03af4d3499645241f900de1f572689c235 --- neutron/plugins/bigswitch/servermanager.py | 7 +++++++ neutron/tests/unit/bigswitch/test_servermanager.py | 13 +++++++++++++ 2 files changed, 20 insertions(+) diff --git a/neutron/plugins/bigswitch/servermanager.py b/neutron/plugins/bigswitch/servermanager.py index 96c5b09379..2a032d39f0 100644 --- a/neutron/plugins/bigswitch/servermanager.py +++ b/neutron/plugins/bigswitch/servermanager.py @@ -473,6 +473,13 @@ class ServerPool(object): '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'), diff --git a/neutron/tests/unit/bigswitch/test_servermanager.py b/neutron/tests/unit/bigswitch/test_servermanager.py index 31b1bbd3b4..0b8ba46fdc 100644 --- a/neutron/tests/unit/bigswitch/test_servermanager.py +++ b/neutron/tests/unit/bigswitch/test_servermanager.py @@ -23,6 +23,7 @@ from oslo.serialization import jsonutils from neutron import context from neutron import manager from neutron.openstack.common import importutils +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 @@ -411,6 +412,18 @@ class ServerManagerTests(test_rp.BigSwitchProxyPluginV2TestCase): 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(