1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169
|
.. 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.
|