Add cluster job distribution

This patch adds a new mechanism to distribute jobs to c-vol nodes with
the addition of the "cluster" configuration option.

DocImpact: New cluster configuration option
Specs: https://review.openstack.org/327283
Implements: blueprint cinder-volume-active-active-support
Change-Id: Id0a2e4c6a7b5f17e4ee3484ae1b53c03d472b586
This commit is contained in:
Gorka Eguileor
2016-05-23 14:24:08 +02:00
parent 625cab15b0
commit a5b4e34f94
11 changed files with 433 additions and 66 deletions

View File

@@ -191,49 +191,51 @@ class RPCAPI(object):
def __init__(self):
target = messaging.Target(topic=self.TOPIC,
version=self.RPC_API_VERSION)
obj_version_cap = self._determine_obj_version_cap()
obj_version_cap = self.determine_obj_version_cap()
serializer = base.CinderObjectSerializer(obj_version_cap)
rpc_version_cap = self._determine_rpc_version_cap()
rpc_version_cap = self.determine_rpc_version_cap()
self.client = get_client(target, version_cap=rpc_version_cap,
serializer=serializer)
def _determine_rpc_version_cap(self):
@classmethod
def determine_rpc_version_cap(cls):
global LAST_RPC_VERSIONS
if self.BINARY in LAST_RPC_VERSIONS:
return LAST_RPC_VERSIONS[self.BINARY]
if cls.BINARY in LAST_RPC_VERSIONS:
return LAST_RPC_VERSIONS[cls.BINARY]
version_cap = objects.Service.get_minimum_rpc_version(
cinder.context.get_admin_context(), self.BINARY)
cinder.context.get_admin_context(), cls.BINARY)
if version_cap == 'liberty':
# NOTE(dulek): This means that one of the services is Liberty,
# we should cap to it's RPC version.
version_cap = LIBERTY_RPC_VERSIONS[self.BINARY]
version_cap = LIBERTY_RPC_VERSIONS[cls.BINARY]
elif not version_cap:
# If there is no service we assume they will come up later and will
# have the same version as we do.
version_cap = self.RPC_API_VERSION
version_cap = cls.RPC_API_VERSION
LOG.info(_LI('Automatically selected %(binary)s RPC version '
'%(version)s as minimum service version.'),
{'binary': self.BINARY, 'version': version_cap})
LAST_RPC_VERSIONS[self.BINARY] = version_cap
{'binary': cls.BINARY, 'version': version_cap})
LAST_RPC_VERSIONS[cls.BINARY] = version_cap
return version_cap
def _determine_obj_version_cap(self):
@classmethod
def determine_obj_version_cap(cls):
global LAST_OBJ_VERSIONS
if self.BINARY in LAST_OBJ_VERSIONS:
return LAST_OBJ_VERSIONS[self.BINARY]
if cls.BINARY in LAST_OBJ_VERSIONS:
return LAST_OBJ_VERSIONS[cls.BINARY]
version_cap = objects.Service.get_minimum_obj_version(
cinder.context.get_admin_context(), self.BINARY)
cinder.context.get_admin_context(), cls.BINARY)
# If there is no service we assume they will come up later and will
# have the same version as we do.
if not version_cap:
version_cap = base.OBJ_VERSIONS.get_current()
LOG.info(_LI('Automatically selected %(binary)s objects version '
'%(version)s as minimum service version.'),
{'binary': self.BINARY, 'version': version_cap})
LAST_OBJ_VERSIONS[self.BINARY] = version_cap
{'binary': cls.BINARY, 'version': version_cap})
LAST_OBJ_VERSIONS[cls.BINARY] = version_cap
return version_cap