EMC VMAX not threadsafe in waiting for SMI-S job completion
Affects | Status | Importance | Assigned to | Milestone | |
---|---|---|---|---|---|
Cinder |
Fix Released
|
Medium
|
Xing Yang |
Bug Description
For a variety of operations, the VMAX cinder driver invokes a CIM method, and then must periodically poll for completion of the backend submitted job. To accomplish this polling, the FixedIntervalLo
However, the logic uses global class variables in order to track a retry count to a configured maximum, rather than using thread local variables. Because of the way the EMCVMAXUtils class objects get constructed, there exists 4 of these objects hanging off of common, masking, provision, and masking.provision, so there is some isolation between driver areas, but not within an area (masking, for example).
Here is one of the problematic methods:
def wait_for_sync(self, conn, syncName):
"""Given the sync name wait for it to fully synchronize.
:param conn: connection to the ecom server
:param syncName: the syncName
"""
def _wait_for_sync():
if self._is_
if self.retries > JOB_RETRIES: <----- **************
try:
if not self.wait_
except Exception as e:
timer = loopingcall.
The intent may have been to wrapper the nested method in an outer class, but instead it is just a parent method. Concurrent operations can cause self.retries to be bumped up or zeroed out incorrectly, resulting in hard-to-debug failures or timeouts.
Changed in cinder: | |
assignee: | nobody → Xing Yang (xing-yang) |
tags: | added: drivers emc |
Changed in cinder: | |
status: | New → Confirmed |
importance: | Undecided → Medium |
Changed in cinder: | |
milestone: | none → kilo-1 |
Changed in cinder: | |
milestone: | kilo-1 → kilo-2 |
Changed in cinder: | |
status: | Fix Committed → Fix Released |
Changed in cinder: | |
milestone: | kilo-2 → 2015.1.0 |
Fix proposed to branch: master /review. openstack. org/138878
Review: https:/