cinder/doc/source/contributor/drivers_locking_examples.rst
Alexander Malashenko 5cb4e21d93 Rename Dell EMC to Dell
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
2022-04-25 07:28:45 -07:00

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.