
cinder/docs directory has a references to the Dell EMC company name. Rename all Dell EMC references to Dell, except for those references where there are paths. When the user will read the documentation he will see the new company name. These changes are due to the company’s rebranding. Closes-Bug: #1970208 Change-Id: I60e06b1b42974ce7ef4d790f050d706dc1a8a7a3
170 lines
6.5 KiB
ReStructuredText
170 lines
6.5 KiB
ReStructuredText
.. Using orphan, as document is explicitly imported and not part of the toctree
|
|
|
|
:orphan:
|
|
|
|
Drivers Locking Examples
|
|
========================
|
|
|
|
This document presents an incomplete list of locks being currently used in
|
|
driver related code (main driver code, helper classes and method, etc.), to
|
|
serve as a reference to other driver developers.
|
|
|
|
.. note:: Please keep in mind that Cinder drivers may support different
|
|
deployment options. Some may only support running one backend on each node.
|
|
Others may support running multiple backends in a single node. And some may
|
|
even support Active-Active deployments. Therefore these references are not
|
|
necessarily examples of how drivers achieve Active-Active.
|
|
|
|
LIO target
|
|
- Lock scope: Node.
|
|
- Critical section: Calls to `cinder-rtstool` CLI.
|
|
- Lock name: `'lioadm'`.
|
|
- Where: `_execute` method.
|
|
- File: `cinder/volume/targets/lio.py`
|
|
|
|
NVMET target
|
|
- Lock scope: Node.
|
|
- Critical section: Creating or deleting NVMeOF targets operations.
|
|
- Lock name: `'nvmetcli'`.
|
|
- Where: `delete_nvmeof_target` and `create_nvmeof_target` methods.
|
|
- File: `cinder/volume/targets/nvmet.py`.
|
|
|
|
HGST driver:
|
|
- Lock scope: Process.
|
|
- Critical section: Create volume operation.
|
|
- Lock name: `'hgst'devices'`.
|
|
- Where: `create_volume` method.
|
|
- File: `cinder/volume/drivers/hgst.py`.
|
|
|
|
Solidfire driver:
|
|
- Lock scope: Process
|
|
- Critical section: Creating volume from an image, cloning volume, creating
|
|
volume from a snapshot.
|
|
- Lock name: `solidfire-{resource_id}`.
|
|
- Where: `locked_image_id_operation` and `locked_source_id_operation`
|
|
decorators.
|
|
- File: `cinder/volume/drivers/solidfire.py`.
|
|
|
|
Infinidat driver:
|
|
- Lock scope: Global.
|
|
- Critical section: Initialize and terminate connections operations.
|
|
- Lock name: `infinidat-{management_address}-lock`.
|
|
- Where: `initialize_connection` and `terminate_connection` methods.
|
|
- File: `cinder/volume/drivers/infinidat.py`.
|
|
|
|
Kaminario FC driver:
|
|
- Lock scope: Global.
|
|
- Critical section: Initialize and terminate connections operations.
|
|
- Lock name: `kaminario-{san_ip}`.
|
|
- Where: `initialize_connection` and `terminate_connection` methods.
|
|
- File: `cinder/volume/drivers/kaminario/kaminario_fc.py`
|
|
|
|
Kaminario iSCSI driver:
|
|
- Lock scope: Global.
|
|
- Critical section: Initialize and terminate connections operations.
|
|
- Lock name: `kaminario-{san_ip}`.
|
|
- Where: `initialize_connection` and `terminate_connection` methods.
|
|
- File: `cinder/volume/drivers/kaminario/kaminario_iscsi.py`
|
|
|
|
Dell Unity:
|
|
- Lock scope: Global.
|
|
- Critical section: Create or get a host on the backend.
|
|
- Lock name: `{self.host}-{name}`
|
|
- Where: `create_host` method.
|
|
- File: `cinder/volume/drivers/dell_emc/unity/client.py`
|
|
|
|
Dell Unity:
|
|
- Lock scope: Global.
|
|
- Critical section: Create host and attach.
|
|
- Lock name: `{client.host}-{host_name}`
|
|
- Where: `_create_host_and_attach` method.
|
|
- File: `cinder/volume/drivers/dell_emc/unity/adapter.py`
|
|
|
|
Dell Unity:
|
|
- Lock scope: Global.
|
|
- Critical section: Create host and attach as part of the
|
|
`initialize_connection` process, and also detach and delete host as part of
|
|
the `terminate_connection` process.
|
|
- Lock name: `{client.host}-{host_name}`
|
|
- Where: `_create_host_and_attach` and `_detach_and_delete_host` methods.
|
|
- File: `cinder/volume/drivers/dell_emc/unity/adapter.py`
|
|
|
|
Dothill:
|
|
- Lock scope: Global
|
|
- Critical section: Retrieving a session key from the array. Perform HTTP
|
|
requests on the device.
|
|
- Lock name: `{driver_name}-{array_name}`
|
|
- Where: `_get_session_key` and `_api_request` methods.
|
|
- File: `cinder/volume/drivers/dothill/dothill_client.py`.
|
|
|
|
Dothill:
|
|
- Lock scope: Global
|
|
- Critical section: Mapping a volume as part of the `initialize_connection`
|
|
process.
|
|
- Lock name: `{driver_name}-{array_name}-map`
|
|
- Where: `map_volume` method.
|
|
- File: `cinder/volume/drivers/dothill/dothill_client.py`.
|
|
|
|
|
|
Other files
|
|
-----------
|
|
|
|
Other files that also make use of the locking mechanisms, and can be useful as
|
|
reference, are:
|
|
|
|
- `cinder/volume/drivers/dell_emc/vmax/common.py`
|
|
- `cinder/volume/drivers/dell_emc/vmax/masking.py`
|
|
- `cinder/volume/drivers/dell_emc/vmax/provision.py`
|
|
- `cinder/volume/drivers/dell_emc/vmax/rest.py`
|
|
- `cinder/volume/drivers/dell_emc/vmax/utils.py`
|
|
- `cinder/volume/drivers/fujitsu/eternus_dx_common.py`
|
|
- `cinder/volume/drivers/hpe/hpe_3par_common.py`
|
|
- `cinder/volume/drivers/hpe/hpe_lefthand_iscsi.py`
|
|
- `cinder/volume/drivers/huawei/huawei_driver.py`
|
|
- `cinder/volume/drivers/huawei/rest_client.py`
|
|
- `cinder/volume/drivers/huawei/smartx.py`
|
|
- `cinder/volume/drivers/ibm/flashsystem_common.py`
|
|
- `cinder/volume/drivers/ibm/flashsystem_fc.py`
|
|
- `cinder/volume/drivers/ibm/flashsystem_iscsi.py`
|
|
- `cinder/volume/drivers/ibm/ibm_storage/ds8k_helper.py`
|
|
- `cinder/volume/drivers/ibm/ibm_storage/ds8k_proxy.py`
|
|
- `cinder/volume/drivers/ibm/ibm_storage/ds8k_replication.py`
|
|
- `cinder/volume/drivers/ibm/ibm_storage/xiv_proxy.py`
|
|
- `cinder/volume/drivers/ibm/storwize_svc/storwize_const.py`
|
|
- `cinder/volume/drivers/ibm/storwize_svc/storwize_svc_fc.py`
|
|
- `cinder/volume/drivers/ibm/storwize_svc/storwize_svc_iscsi.py`
|
|
- `cinder/volume/drivers/inspur/instorage/instorage_const.py`
|
|
- `cinder/volume/drivers/inspur/instorage/instorage_fc.py`
|
|
- `cinder/volume/drivers/inspur/instorage/instorage_iscsi.py`
|
|
- `cinder/volume/drivers/nec/cli.py`
|
|
- `cinder/volume/drivers/nec/volume_helper.py`
|
|
- `cinder/volume/drivers/netapp/dataontap/nfs_base.py`
|
|
|
|
|
|
Notes on Driver Locking
|
|
-----------------------
|
|
|
|
From the volume manager flow, create_cloned_volume() happens to be called
|
|
with a lock that prevents concurrent calls to clone from the same volume
|
|
at the same time.
|
|
|
|
This is done by the cinder/volume/manager.py create_volume() code::
|
|
|
|
elif source_volid is not None:
|
|
locked_action = "%s-%s" % (source_volid, 'delete_volume')
|
|
|
|
and subsequent COORDINATOR.get_lock() call.
|
|
|
|
This seems to have been intended to prevent a volume from being deleted
|
|
while being used as the source of a volume clone, the fact that it
|
|
prevents concurrent clone operations is a side effect.
|
|
|
|
This means that a driver that cannot correctly handle concurrent clone
|
|
operations from the same volume will work for normal clone operations,
|
|
but then fail when a clone operation is performed as part of cloning
|
|
from the image-volume cache, or cloning from a Cinder backend of Glance.
|
|
(See https://bugs.launchpad.net/cinder/+bug/1851512 for an example.)
|
|
|
|
It should be assumed that, at some point, this locking behavior will be
|
|
changed to allow concurrent clone calls.
|