Change in vdsm[ovirt-3.2]: udev: Race fix- load and trigger dev rule
vvolansk at redhat.com
vvolansk at redhat.com
Sun Jan 27 07:51:00 UTC 2013
Hello Lee Yarwood, Federico Simoncelli,
I'd like you to do a code review. Please visit
http://gerrit.ovirt.org/11410
to review the following change.
Change subject: udev: Race fix- load and trigger dev rule
......................................................................
udev: Race fix- load and trigger dev rule
The rule file is generated, yet not synch-loaded in memory, so a VM with
a direct lun fails to start.
This patch reloads the rules before triggering using the new private
udev functions - udevReloadRules() in supervdsmServer.py .
Also added a check in appropriateDevice() (hsm.py) to make sure the
mapping is indeed there.
Bug-Url: https://bugzilla.redhat.com/show_bug.cgi?id=891300
Change-Id: If3b2008a3d9df2dcaf54190721c2dd9764338627
Signed-off-by: Lee Yarwood <lyarwood at redhat.com>
Signed-off-by: Vered Volansky <vvolansk at redhat.com>
Signed-off-by: Federico Simoncelli <fsimonce at redhat.com>
---
M vdsm/storage/hsm.py
M vdsm/supervdsmServer.py
2 files changed, 38 insertions(+), 0 deletions(-)
git pull ssh://gerrit.ovirt.org:29418/vdsm refs/changes/10/11410/1
diff --git a/vdsm/storage/hsm.py b/vdsm/storage/hsm.py
index efb2749..62e9f74 100644
--- a/vdsm/storage/hsm.py
+++ b/vdsm/storage/hsm.py
@@ -67,6 +67,7 @@
import dispatcher
import supervdsm
import storageServer
+from vdsm import utils
GUID = "guid"
NAME = "name"
@@ -86,6 +87,8 @@
SECTOR_SIZE = 512
STORAGE_CONNECTION_DIR = os.path.join(constants.P_VDSM_RUN, "connections/")
+
+QEMU_READABLE_TIMEOUT = 30
def public(f=None, **kwargs):
@@ -2925,6 +2928,10 @@
"""
supervdsm.getProxy().appropriateDevice(guid, thiefId)
supervdsm.getProxy().udevTrigger(guid)
+ devPath = devicemapper.DMPATH_FORMAT % guid
+ utils.retry(partial(fileUtils.validateQemuReadable, devPath),
+ expectedException=OSError,
+ timeout=QEMU_READABLE_TIMEOUT)
@public
def inappropriateDevices(self, thiefId):
diff --git a/vdsm/supervdsmServer.py b/vdsm/supervdsmServer.py
index dc89218..833e91f 100755
--- a/vdsm/supervdsmServer.py
+++ b/vdsm/supervdsmServer.py
@@ -89,6 +89,10 @@
class _SuperVdsm(object):
+ UDEV_WITH_RELOAD_VERSION = 181
+
+ log = logging.getLogger("SuperVdsm.ServerCallback")
+
@logDecorator
def ping(self, *args, **kwargs):
# This method exists for testing purposes
@@ -226,6 +230,7 @@
@logDecorator
def udevTrigger(self, guid):
+ self.__udevReloadRules(guid)
cmd = [EXT_UDEVADM, 'trigger', '--verbose', '--action', 'change',
'--property-match=DM_NAME=%s' % guid]
rc, out, err = misc.execCmd(cmd, sudo=False)
@@ -304,6 +309,32 @@
def removeFs(self, path):
return mkimage.removeFs(path)
+ def __udevReloadRules(self, guid):
+ if self.__udevOperationReload():
+ reload = "--reload"
+ else:
+ reload = "--reload-rules"
+ cmd = [EXT_UDEVADM, 'control', reload]
+ rc, out, err = misc.execCmd(cmd, sudo=False)
+ if rc:
+ self.log.error("Udevadm reload-rules command failed rc=%s, "
+ "out=\"%s\", err=\"%s\"", rc, out, err)
+ raise OSError(errno.EINVAL, "Could not reload-rules for device "
+ "%s" % guid)
+
+ @utils.memoized
+ def __udevVersion(self):
+ cmd = [EXT_UDEVADM, '--version']
+ rc, out, err = misc.execCmd(cmd, sudo=False)
+ if rc:
+ self.log.error("Udevadm version command failed rc=%s, "
+ " out=\"%s\", err=\"%s\"", rc, out, err)
+ raise RuntimeError("Could not get udev version number")
+ return int(out[0])
+
+ def __udevOperationReload(self):
+ return self.__udevVersion() > self.UDEV_WITH_RELOAD_VERSION
+
def __pokeParent(parentPid, address, log):
try:
--
To view, visit http://gerrit.ovirt.org/11410
To unsubscribe, visit http://gerrit.ovirt.org/settings
Gerrit-MessageType: newchange
Gerrit-Change-Id: If3b2008a3d9df2dcaf54190721c2dd9764338627
Gerrit-PatchSet: 1
Gerrit-Project: vdsm
Gerrit-Branch: ovirt-3.2
Gerrit-Owner: Vered Volansky <vvolansk at redhat.com>
Gerrit-Reviewer: Federico Simoncelli <fsimonce at redhat.com>
Gerrit-Reviewer: Lee Yarwood <lyarwood at redhat.com>
More information about the vdsm-patches
mailing list