Hello Lee Yarwood,
I'd like you to do a code review. Please visit
to review the following change.
Change subject: udev: Race fix- load and trigger dev rule(#891300) ......................................................................
udev: Race fix- load and trigger dev rule(#891300)
The rule file is generated, yet not synch-loaded in memory, so a VM with a with a direct lun fails to start. This patch inroduces two additional udev functions: 1. udevReloadRules() in supervdsmServer.py . This should be called before uderTrigger(). 2. udevSettle() in supervdsmServer.py . This should be called after usedTrigger(). is written but not sync loaded in memory. These functions are now called before and after (in correspondance) udevTrigger() in appropriateDevice() (hsm.py). Also added a check in appropriateDevice() 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@redhat.com Signed-off-by: Vered Volansky vvolansk@redhat.com --- M vdsm/storage/hsm.py M vdsm/supervdsmServer.py 2 files changed, 24 insertions(+), 0 deletions(-)
git pull ssh://gerrit.ovirt.org:29418/vdsm refs/changes/58/10758/1
diff --git a/vdsm/storage/hsm.py b/vdsm/storage/hsm.py index 5584315..d7d44eb 100644 --- a/vdsm/storage/hsm.py +++ b/vdsm/storage/hsm.py @@ -2924,7 +2924,15 @@ Warning: Internal use only. """ supervdsm.getProxy().appropriateDevice(guid, thiefId) + supervdsm.getProxy().udevReloadRules(guid) supervdsm.getProxy().udevTrigger(guid) + supervdsm.getProxy().udevSettle(guid) + try: + devPath = '/dev/mapper/%s' % guid + fileUtils.validateQemuReadable(devPath) + except OSError: + self.log.error("Failed to appropriate device permission") + raise
@public def inappropriateDevices(self, thiefId): diff --git a/vdsm/supervdsmServer.py b/vdsm/supervdsmServer.py index 486471c..ad73fa4 100755 --- a/vdsm/supervdsmServer.py +++ b/vdsm/supervdsmServer.py @@ -226,6 +226,14 @@ return configNetwork.setSafeNetworkConfig()
@logDecorator + def udevReloadRules(self, guid): + cmd = [EXT_UDEVADM, 'control', '--reload-rules'] + rc, out, err = misc.execCmd(cmd, sudo=False) + if rc: + raise OSError(errno.EINVAL, "Could not reload-rules for device \ + %s, out %s\nerr %s" % (guid, out, err)) + + @logDecorator def udevTrigger(self, guid): cmd = [EXT_UDEVADM, 'trigger', '--verbose', '--action', 'change', '--property-match=DM_NAME=%s' % guid] @@ -235,6 +243,14 @@ %s, out %s\nerr %s" % (guid, out, err))
@logDecorator + def udevSettle(self, guid): + cmd = [EXT_UDEVADM, 'settle'] + rc, out, err = misc.execCmd(cmd, sudo=False) + if rc: + raise OSError(errno.EINVAL, "Could not settle for device \ + %s, out %s\nerr %s" % (guid, out, err)) + + @logDecorator def appropriateDevice(self, guid, thiefId): ruleFile = _UDEV_RULE_FILE_NAME % (guid, thiefId) rule = 'SYMLINK=="mapper/%s", OWNER="%s", GROUP="%s"\n' % (guid,
-- To view, visit http://gerrit.ovirt.org/10758 To unsubscribe, visit http://gerrit.ovirt.org/settings
Gerrit-MessageType: newchange Gerrit-Change-Id: If3b2008a3d9df2dcaf54190721c2dd9764338627 Gerrit-PatchSet: 1 Gerrit-Project: vdsm Gerrit-Branch: master Gerrit-Owner: Vered Volansky vvolansk@redhat.com Gerrit-Reviewer: Lee Yarwood lyarwood@redhat.com