File: drivers_locking_examples.rst

package info (click to toggle)
cinder 2%3A27.0.0-5
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 44,800 kB
  • sloc: python: 496,299; pascal: 2,230; sh: 394; makefile: 104; xml: 26
file content (169 lines) | stat: -rw-r--r-- 6,607 bytes parent folder | download | duplicates (3)
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.