diff --git a/nova/compute/manager.py b/nova/compute/manager.py index adbf8d5135a9..b96d833e8717 100644 --- a/nova/compute/manager.py +++ b/nova/compute/manager.py @@ -720,6 +720,7 @@ class ComputeManager(manager.Manager): def reset(self): LOG.info(_LI('Reloading compute RPC API')) + compute_rpcapi.LAST_VERSION = None self.compute_rpcapi = compute_rpcapi.ComputeAPI() def _get_resource_tracker(self, nodename): diff --git a/nova/compute/rpcapi.py b/nova/compute/rpcapi.py index 433dfdae8224..f67cce6d4306 100644 --- a/nova/compute/rpcapi.py +++ b/nova/compute/rpcapi.py @@ -53,6 +53,7 @@ rpcapi_cap_opt = cfg.StrOpt('compute', CONF.register_opt(rpcapi_cap_opt, 'upgrade_levels') LOG = logging.getLogger(__name__) +LAST_VERSION = None def _compute_host(host, instance): @@ -339,6 +340,9 @@ class ComputeAPI(object): self.client = self.get_client(target, version_cap, serializer) def _determine_version_cap(self, target): + global LAST_VERSION + if LAST_VERSION: + return LAST_VERSION service_version = objects.Service.get_minimum_version( context.get_admin_context(), 'nova-compute') history = service_obj.SERVICE_VERSION_HISTORY @@ -356,6 +360,7 @@ class ComputeAPI(object): 'service history for version %(version)i'), {'version': service_version}) return target.version + LAST_VERSION = version_cap LOG.info(_LI('Automatically selected compute RPC version %(rpc)s ' 'from minimum service version %(service)i'), {'rpc': version_cap, diff --git a/nova/tests/unit/compute/test_rpcapi.py b/nova/tests/unit/compute/test_rpcapi.py index bd6c5278f6b3..0f2816afcaf4 100644 --- a/nova/tests/unit/compute/test_rpcapi.py +++ b/nova/tests/unit/compute/test_rpcapi.py @@ -55,6 +55,7 @@ class ComputeRpcAPITestCase(test.NoDBTestCase): def test_auto_pin(self, mock_get_min): mock_get_min.return_value = 1 self.flags(compute='auto', group='upgrade_levels') + compute_rpcapi.LAST_VERSION = None rpcapi = compute_rpcapi.ComputeAPI() self.assertEqual('4.4', rpcapi.client.version_cap) mock_get_min.assert_called_once_with(mock.ANY, 'nova-compute') @@ -63,6 +64,7 @@ class ComputeRpcAPITestCase(test.NoDBTestCase): def test_auto_pin_fails_if_too_old(self, mock_get_min): mock_get_min.return_value = 1955 self.flags(compute='auto', group='upgrade_levels') + compute_rpcapi.LAST_VERSION = None self.assertRaises(exception.ServiceTooOld, compute_rpcapi.ComputeAPI) @@ -70,10 +72,21 @@ class ComputeRpcAPITestCase(test.NoDBTestCase): def test_auto_pin_kilo(self, mock_get_min): mock_get_min.return_value = 0 self.flags(compute='auto', group='upgrade_levels') + compute_rpcapi.LAST_VERSION = None rpcapi = compute_rpcapi.ComputeAPI() self.assertEqual('4.0', rpcapi.client.version_cap) mock_get_min.assert_called_once_with(mock.ANY, 'nova-compute') + @mock.patch('nova.objects.Service.get_minimum_version') + def test_auto_pin_caches(self, mock_get_min): + mock_get_min.return_value = 1 + self.flags(compute='auto', group='upgrade_levels') + compute_rpcapi.LAST_VERSION = None + compute_rpcapi.ComputeAPI() + compute_rpcapi.ComputeAPI() + mock_get_min.assert_called_once_with(mock.ANY, 'nova-compute') + self.assertEqual('4.4', compute_rpcapi.LAST_VERSION) + def _test_compute_api(self, method, rpc_method, expected_args=None, **kwargs): ctxt = context.RequestContext('fake_user', 'fake_project')