Merge "Dell PowerMax: multi detach req caused race conditions"

This commit is contained in:
Zuul 2025-01-16 21:56:36 +00:00 committed by Gerrit Code Review
commit 651bb41689
4 changed files with 28 additions and 0 deletions

View File

@ -18,6 +18,7 @@ import ast
from oslo_log import log as logging from oslo_log import log as logging
from cinder.common import constants from cinder.common import constants
from cinder import coordination
from cinder import exception from cinder import exception
from cinder import interface from cinder import interface
from cinder.volume import driver from cinder.volume import driver
@ -143,6 +144,8 @@ class PowerMaxFCDriver(san.SanDriver, driver.FibreChannelDriver):
# ThirdPartySystems wiki # ThirdPartySystems wiki
CI_WIKI_NAME = "DellEMC_PowerMAX_CI" CI_WIKI_NAME = "DellEMC_PowerMAX_CI"
driver_prefix = 'powermax'
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
super(PowerMaxFCDriver, self).__init__(*args, **kwargs) super(PowerMaxFCDriver, self).__init__(*args, **kwargs)
@ -255,6 +258,7 @@ class PowerMaxFCDriver(san.SanDriver, driver.FibreChannelDriver):
""" """
pass pass
@coordination.synchronized('{self.driver_prefix}-{volume.id}')
def initialize_connection(self, volume, connector): def initialize_connection(self, volume, connector):
"""Initializes the connection and returns connection info. """Initializes the connection and returns connection info.
@ -327,6 +331,7 @@ class PowerMaxFCDriver(san.SanDriver, driver.FibreChannelDriver):
return data return data
@coordination.synchronized('{self.driver_prefix}-{volume.id}')
def terminate_connection(self, volume, connector, **kwargs): def terminate_connection(self, volume, connector, **kwargs):
"""Disallow connection from connector. """Disallow connection from connector.
@ -790,3 +795,7 @@ class PowerMaxFCDriver(san.SanDriver, driver.FibreChannelDriver):
:param snapshot: the cinder snapshot object :param snapshot: the cinder snapshot object
""" """
self.common.revert_to_snapshot(volume, snapshot) self.common.revert_to_snapshot(volume, snapshot)
@classmethod
def clean_volume_file_locks(cls, volume_id):
coordination.synchronized_remove(f'{cls.driver_prefix}-{volume_id}')

View File

@ -22,6 +22,7 @@ from oslo_log import log as logging
from oslo_utils import strutils from oslo_utils import strutils
from cinder.common import constants from cinder.common import constants
from cinder import coordination
from cinder import exception from cinder import exception
from cinder.i18n import _ from cinder.i18n import _
from cinder import interface from cinder import interface
@ -148,6 +149,8 @@ class PowerMaxISCSIDriver(san.SanISCSIDriver):
# ThirdPartySystems wiki # ThirdPartySystems wiki
CI_WIKI_NAME = "DellEMC_PowerMAX_CI" CI_WIKI_NAME = "DellEMC_PowerMAX_CI"
driver_prefix = 'powermax'
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
super(PowerMaxISCSIDriver, self).__init__(*args, **kwargs) super(PowerMaxISCSIDriver, self).__init__(*args, **kwargs)
@ -260,6 +263,7 @@ class PowerMaxISCSIDriver(san.SanISCSIDriver):
:param volume_id: the volume id :param volume_id: the volume id
""" """
@coordination.synchronized('{self.driver_prefix}-{volume.id}')
def initialize_connection(self, volume, connector): def initialize_connection(self, volume, connector):
"""Initializes the connection and returns connection info. """Initializes the connection and returns connection info.
@ -440,6 +444,7 @@ class PowerMaxISCSIDriver(san.SanISCSIDriver):
return properties return properties
@coordination.synchronized('{self.driver_prefix}-{volume.id}')
def terminate_connection(self, volume, connector, **kwargs): def terminate_connection(self, volume, connector, **kwargs):
"""Disallow connection from connector. """Disallow connection from connector.
@ -699,3 +704,7 @@ class PowerMaxISCSIDriver(san.SanISCSIDriver):
:param snapshot: the cinder snapshot object :param snapshot: the cinder snapshot object
""" """
self.common.revert_to_snapshot(volume, snapshot) self.common.revert_to_snapshot(volume, snapshot)
@classmethod
def clean_volume_file_locks(cls, volume_id):
coordination.synchronized_remove(f'{cls.driver_prefix}-{volume_id}')

View File

@ -30,6 +30,7 @@ from cinder import exception
from cinder.i18n import _ from cinder.i18n import _
from cinder.utils import retry from cinder.utils import retry
from cinder.volume.drivers.dell_emc.powermax import utils from cinder.volume.drivers.dell_emc.powermax import utils
from cinder.volume import volume_utils
LOG = logging.getLogger(__name__) LOG = logging.getLogger(__name__)
SLOPROVISIONING = 'sloprovisioning' SLOPROVISIONING = 'sloprovisioning'
@ -219,6 +220,7 @@ class PowerMaxRest(object):
self.u4p_failover_lock = False self.u4p_failover_lock = False
raise exception.VolumeBackendAPIException(message=msg) raise exception.VolumeBackendAPIException(message=msg)
@volume_utils.trace()
def request(self, target_uri, method, params=None, request_object=None, def request(self, target_uri, method, params=None, request_object=None,
u4p_check=False, retry=False): u4p_check=False, retry=False):
"""Sends a request (GET, POST, PUT, DELETE) to the target api. """Sends a request (GET, POST, PUT, DELETE) to the target api.

View File

@ -0,0 +1,8 @@
---
fixes:
- |
Dell PowerMax Driver `Bug #2089656
<https://bugs.launchpad.net/cinder/+bug/2089656>`_: Fixed
the issue that multiple detach requests caused race conditions
in Dell PowerMax driver. Also, improved trace logs for
PowerMax RESTAPI requests.