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