Change in vdsm[master]: rwlock: Add simpler RWLock supporting acquire timeout
by Nir Soffer
Nir Soffer has uploaded a new change for review.
Change subject: rwlock: Add simpler RWLock supporting acquire timeout
......................................................................
rwlock: Add simpler RWLock supporting acquire timeout
We have RWLock implementation in storage.misc, used for by the resource
manager. We want to simplify the resource manager, which is way too
complex to understand or maintain.
Patch https://gerrit.ovirt.org/42773 suggests to add a non-blocking
acquire to the current RWLock, needed for the new simple lock manager.
However, adding more code to the current RWLock is not a good idea.
Instead, this patch replace the current implementation with a simpler
one.
This implementation does not support recursive locking; I'm not sure we
need this, and usually having a recursive lock is a design smell. We
will add it later only if required.
Change-Id: I2466c137c89598772fb46347eb02195916883cac
Signed-off-by: Nir Soffer <nsoffer(a)redhat.com>
---
M debian/vdsm-python.install
M lib/vdsm/Makefile.am
A lib/vdsm/rwlock.py
M tests/rwlock_test.py
M vdsm.spec.in
5 files changed, 95 insertions(+), 1 deletion(-)
git pull ssh://gerrit.ovirt.org:29418/vdsm refs/changes/08/42908/1
diff --git a/debian/vdsm-python.install b/debian/vdsm-python.install
index 57d5033..3047d9f 100644
--- a/debian/vdsm-python.install
+++ b/debian/vdsm-python.install
@@ -28,6 +28,7 @@
./usr/lib/python2.7/dist-packages/vdsm/pthread.py
./usr/lib/python2.7/dist-packages/vdsm/qemuimg.py
./usr/lib/python2.7/dist-packages/vdsm/response.py
+./usr/lib/python2.7/dist-packages/vdsm/rwlock.py
./usr/lib/python2.7/dist-packages/vdsm/schedule.py
./usr/lib/python2.7/dist-packages/vdsm/sslutils.py
./usr/lib/python2.7/dist-packages/vdsm/tool/__init__.py
diff --git a/lib/vdsm/Makefile.am b/lib/vdsm/Makefile.am
index 95e236f..45cef02 100644
--- a/lib/vdsm/Makefile.am
+++ b/lib/vdsm/Makefile.am
@@ -38,6 +38,7 @@
pthread.py \
qemuimg.py \
response.py \
+ rwlock.py \
schedule.py \
sslutils.py \
sysctl.py \
diff --git a/lib/vdsm/rwlock.py b/lib/vdsm/rwlock.py
new file mode 100644
index 0000000..900d91d
--- /dev/null
+++ b/lib/vdsm/rwlock.py
@@ -0,0 +1,91 @@
+#
+# Copyright 2015 Red Hat, Inc.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+#
+# Refer to the README and COPYING files for full details of the license
+#
+
+from __future__ import absolute_import
+import threading
+
+
+class RWLock(object):
+
+ def __init__(self):
+ self._lock = threading.Lock()
+ self._waiters = []
+ self._readers = set()
+ self._writer = None
+
+ def acquireWrite(self):
+ with self._lock:
+ if self._writer or self._readers or self._waiters:
+ self._wait(True)
+ self._writer = threading.current_thread()
+
+ def acquireRead(self):
+ with self._lock:
+ if self._writer or self._waiters:
+ self._wait(False)
+ self._readers.add(threading.current_thread())
+
+ def release(self):
+ me = threading.current_thread()
+ with self._lock:
+ if self._writer:
+ if self._writer is not me:
+ raise RuntimeError("Thread %s attempted to release a "
+ "write lock held by thread %s"
+ % (me, self._writer))
+ self._writer = None
+ else:
+ if me not in self._readers:
+ raise RuntimeError("Thread %s attempted to release a "
+ "read lock it does not hold"
+ % (me,))
+ self._readers.remove(me)
+ if self._waiters:
+ self._wakeup_waiter()
+
+ def _wait(self, wants_write):
+ waiter = Waiter(wants_write)
+ self._waiters.append(waiter)
+ try:
+ self._lock.release()
+ try:
+ waiter.wait()
+ finally:
+ self._lock.acquire()
+ finally:
+ self._waiters.remove(waiter)
+
+ def _wakeup_waiter(self):
+ if self._readers and self._waiters[0].wants_write:
+ return
+ self._waiters[0].wakeup()
+
+
+class Waiter(object):
+
+ def __init__(self, wants_write):
+ self.wants_write = wants_write
+ self._event = threading.Event()
+
+ def wait(self):
+ self._event.wait()
+
+ def wakeup(self):
+ self._event.set()
diff --git a/tests/rwlock_test.py b/tests/rwlock_test.py
index 80d04f1..e67e27a 100644
--- a/tests/rwlock_test.py
+++ b/tests/rwlock_test.py
@@ -25,7 +25,7 @@
from testlib import VdsmTestCase
from testValidation import slowtest, stresstest
-from storage.misc import RWLock
+from vdsm.rwlock import RWLock
class RWLockTests(VdsmTestCase):
diff --git a/vdsm.spec.in b/vdsm.spec.in
index 2b41835..35a9670 100644
--- a/vdsm.spec.in
+++ b/vdsm.spec.in
@@ -1263,6 +1263,7 @@
%{python_sitelib}/%{vdsm_name}/pthread.py*
%{python_sitelib}/%{vdsm_name}/qemuimg.py*
%{python_sitelib}/%{vdsm_name}/response.py*
+%{python_sitelib}/%{vdsm_name}/rwlock.py*
%{python_sitelib}/%{vdsm_name}/netconfpersistence.py*
%{python_sitelib}/%{vdsm_name}/schedule.py*
%{python_sitelib}/%{vdsm_name}/sslutils.py*
--
To view, visit https://gerrit.ovirt.org/42908
To unsubscribe, visit https://gerrit.ovirt.org/settings
Gerrit-MessageType: newchange
Gerrit-Change-Id: I2466c137c89598772fb46347eb02195916883cac
Gerrit-PatchSet: 1
Gerrit-Project: vdsm
Gerrit-Branch: master
Gerrit-Owner: Nir Soffer <nsoffer(a)redhat.com>
8 years, 6 months
Change in vdsm[master]: lvm: Exclude faulty devices from lvm long filter
by Nir Soffer
Nir Soffer has uploaded a new change for review.
Change subject: lvm: Exclude faulty devices from lvm long filter
......................................................................
lvm: Exclude faulty devices from lvm long filter
lvm commands use filter to limit access to relevant devices. When the
filter includes a faulty device, lvm commands may block for several
minutes (stuck in D state). We have seen getDevicesList command stuck
for up to 10 minutes because of faulty devices in the long filter.
We used to build the filter from all multipath devices. Now we build the
filter only from devices which have at least one active paths.
# multipath -ll
360060160f4a0300038ed7058b5e9e311 dm-0 DGC ,VRAID
size=15G features='0' hwhandler='1 emc' wp=rw
|-+- policy='service-time 0' prio=0 status=enabled
| `- 4:0:3:0 sdd 8:48 failed faulty running
`-+- policy='service-time 0' prio=0 status=enabled
`- 4:0:2:0 sdb 8:16 failed faulty running
360060160f4a030003268ab211002e411 dm-1 DGC ,VRAID
size=30G features='1 queue_if_no_path' hwhandler='1 emc' wp=rw
|-+- policy='service-time 0' prio=4 status=active
| `- 4:0:3:1 sde 8:64 active ready running
`-+- policy='service-time 0' prio=1 status=enabled
`- 4:0:2:1 sdc 8:32 active ready running
Previously, both devices were included in the filter, now only
360060160f4a030003268ab211002e411 will be included in lvm filter.
A faulty device which became active again will be included in lvm filter
after the next refresh (every 5 minutes), or after trying edit or create
a new storage domain.
lvm uses also short filter, including devices used by the certain vg or
lv. It is possible that we also have to exclude such devices from the
short filter. This will be handled later if needed.
Change-Id: I6d7a973bcefa95813fdc289847760c0955aca30c
Bug-Url: https://bugzilla.redhat.com/880738
Signed-off-by: Nir Soffer <nsoffer(a)redhat.com>
---
M vdsm/storage/lvm.py
M vdsm/storage/multipath.py
2 files changed, 13 insertions(+), 1 deletion(-)
git pull ssh://gerrit.ovirt.org:29418/vdsm refs/changes/75/31875/1
diff --git a/vdsm/storage/lvm.py b/vdsm/storage/lvm.py
index 86edf55..9cfad01 100644
--- a/vdsm/storage/lvm.py
+++ b/vdsm/storage/lvm.py
@@ -244,7 +244,7 @@
if not self._filterStale:
return self._extraCfg
- self._extraCfg = _buildConfig(multipath.getMPDevNamesIter())
+ self._extraCfg = _buildConfig(multipath.getActiveMPDevNamesIter())
_updateLvmConf(self._extraCfg)
self._filterStale = False
diff --git a/vdsm/storage/multipath.py b/vdsm/storage/multipath.py
index ba98866..2b30995 100644
--- a/vdsm/storage/multipath.py
+++ b/vdsm/storage/multipath.py
@@ -382,6 +382,18 @@
yield os.path.join(devicemapper.DMPATH_PREFIX, name)
+def getActiveMPDevNamesIter():
+ status = devicemapper.getPathsStatus()
+ for dmId, guid in getMPDevsIter():
+ active = [slave for slave in devicemapper.getSlaves(dmId)
+ if status.get(slave) == "active"]
+ if not active:
+ log.warning("Skipping device %s - no active slave", guid)
+ continue
+ log.debug("Found device %s %s", guid, active)
+ yield os.path.join(devicemapper.DMPATH_PREFIX, guid)
+
+
def getMPDevsIter():
"""
Collect the list of all the multipath block devices.
--
To view, visit http://gerrit.ovirt.org/31875
To unsubscribe, visit http://gerrit.ovirt.org/settings
Gerrit-MessageType: newchange
Gerrit-Change-Id: I6d7a973bcefa95813fdc289847760c0955aca30c
Gerrit-PatchSet: 1
Gerrit-Project: vdsm
Gerrit-Branch: master
Gerrit-Owner: Nir Soffer <nsoffer(a)redhat.com>
8 years, 6 months
Change in vdsm[master]: utils: allow retry of multiple functions
by ykaplan@redhat.com
Yeela Kaplan has uploaded a new change for review.
Change subject: utils: allow retry of multiple functions
......................................................................
utils: allow retry of multiple functions
Change-Id: I6c805ef33b710fbbe674ac62ae96c3fdf47423e1
Signed-off-by: Yeela Kaplan <ykaplan(a)redhat.com>
---
M lib/vdsm/libvirtconnection.py
M lib/vdsm/utils.py
M tests/functional/vmRecoveryTests.py
M tests/miscTests.py
M tests/remoteFileHandlerTests.py
M tests/utilsTests.py
M vdsm/clientIF.py
M vdsm/storage/hsm.py
M vdsm/supervdsm.py
9 files changed, 18 insertions(+), 13 deletions(-)
git pull ssh://gerrit.ovirt.org:29418/vdsm refs/changes/36/36336/1
diff --git a/lib/vdsm/libvirtconnection.py b/lib/vdsm/libvirtconnection.py
index 492a02e..55af991 100644
--- a/lib/vdsm/libvirtconnection.py
+++ b/lib/vdsm/libvirtconnection.py
@@ -99,7 +99,7 @@
libvirtOpen = functools.partial(
libvirt.openAuth, uri, auth, 0)
- return utils.retry(libvirtOpen, timeout=10, sleep=0.2)
+ return utils.retry((libvirtOpen,), timeout=10, sleep=0.2)
def get(target=None, killOnFailure=True):
diff --git a/lib/vdsm/utils.py b/lib/vdsm/utils.py
index db38e0c..ed4dec6 100644
--- a/lib/vdsm/utils.py
+++ b/lib/vdsm/utils.py
@@ -903,13 +903,13 @@
return unicode(self.cmd)
-def retry(func, expectedException=Exception, tries=None,
+def retry(funcs, expectedException=Exception, tries=None,
timeout=None, sleep=1, stopCallback=None):
"""
- Retry a function. Wraps the retry logic so you don't have to
+ Retry functions. Wraps the retry logic so you don't have to
implement it each time you need it.
- :param func: The callable to run.
+ :param funcs: a tuple of the callables to run.
:param expectedException: The exception you expect to receive when the
function fails.
:param tries: The number of times to try. None\0,-1 means infinite.
@@ -932,7 +932,9 @@
while True:
tries -= 1
try:
- return func()
+ for func in funcs:
+ res = func()
+ return res
except expectedException:
if tries == 0:
raise
diff --git a/tests/functional/vmRecoveryTests.py b/tests/functional/vmRecoveryTests.py
index 37a96f3..0028f62 100644
--- a/tests/functional/vmRecoveryTests.py
+++ b/tests/functional/vmRecoveryTests.py
@@ -96,7 +96,8 @@
def ensure_vdsm_started(self):
vdsm.utils.retry(
- self.setUp, expectedException=(socket.error, KeyError), tries=10)
+ (self.setUp,), expectedException=(socket.error, KeyError),
+ tries=10)
@ValidateRunningAsRoot
def test_vm_recovery(self):
diff --git a/tests/miscTests.py b/tests/miscTests.py
index a955979..eb8b11d 100644
--- a/tests/miscTests.py
+++ b/tests/miscTests.py
@@ -1047,7 +1047,7 @@
nice = utils.pidStat(proc.pid).nice
self.assertEquals(nice, 10)
- utils.retry(AssertionError, test, tries=10, sleep=0.1)
+ utils.retry((test,), AssertionError, tries=10, sleep=0.1)
proc.kill()
proc.wait()
diff --git a/tests/remoteFileHandlerTests.py b/tests/remoteFileHandlerTests.py
index 0c62f60..c093c2d 100644
--- a/tests/remoteFileHandlerTests.py
+++ b/tests/remoteFileHandlerTests.py
@@ -70,7 +70,7 @@
p.stop()
test = lambda: self.assertFalse(os.path.exists(procPath))
- utils.retry(test, AssertionError, timeout=4, sleep=0.1)
+ utils.retry((test,), AssertionError, timeout=4, sleep=0.1)
class RemoteFileHandlerTruncateTests(TestCaseBase):
diff --git a/tests/utilsTests.py b/tests/utilsTests.py
index cb3da85..75119e8 100644
--- a/tests/utilsTests.py
+++ b/tests/utilsTests.py
@@ -57,7 +57,8 @@
"fool about it.")
# W. C. Fields
- self.assertRaises(RuntimeError, utils.retry, foo, tries=(limit + 10),
+ self.assertRaises(RuntimeError, utils.retry, (foo,),
+ tries=(limit + 10),
sleep=0, stopCallback=stopCallback)
# Make sure we had the proper amount of iterations before failing
self.assertEquals(counter[0], limit)
@@ -111,7 +112,7 @@
try:
test = lambda: self.assertEquals(utils.getCmdArgs(sproc.pid),
tuple())
- utils.retry(AssertionError, test, tries=10, sleep=0.1)
+ utils.retry((test,), AssertionError, tries=10, sleep=0.1)
finally:
sproc.wait()
diff --git a/vdsm/clientIF.py b/vdsm/clientIF.py
index 971d5ff..673975a 100644
--- a/vdsm/clientIF.py
+++ b/vdsm/clientIF.py
@@ -393,7 +393,7 @@
# Trying to run recover process until it works. During that time vdsm
# stays in recovery mode (_recover=True), means all api requests
# returns with "vdsm is in initializing process" message.
- utils.retry(self._recoverExistingVms, sleep=5)
+ utils.retry((self._recoverExistingVms,), sleep=5)
def _recoverExistingVms(self):
try:
diff --git a/vdsm/storage/hsm.py b/vdsm/storage/hsm.py
index c8aaf93..fa6eb5a 100644
--- a/vdsm/storage/hsm.py
+++ b/vdsm/storage/hsm.py
@@ -3155,7 +3155,7 @@
supervdsm.getProxy().appropriateDevice(guid, thiefId)
supervdsm.getProxy().udevTrigger(guid)
devPath = os.path.join(devicemapper.DMPATH_PREFIX, guid)
- utils.retry(partial(fileUtils.validateQemuReadable, devPath),
+ utils.retry((partial(fileUtils.validateQemuReadable, devPath),),
expectedException=OSError,
timeout=QEMU_READABLE_TIMEOUT)
diff --git a/vdsm/supervdsm.py b/vdsm/supervdsm.py
index 8e42af2..c29a1f2 100644
--- a/vdsm/supervdsm.py
+++ b/vdsm/supervdsm.py
@@ -75,7 +75,8 @@
self._manager.register('open')
self._log.debug("Trying to connect to Super Vdsm")
try:
- utils.retry(self._manager.connect, Exception, timeout=60, tries=3)
+ utils.retry((self._manager.connect,), Exception,
+ timeout=60, tries=3)
except Exception as ex:
msg = "Connect to supervdsm service failed: %s" % ex
utils.panic(msg)
--
To view, visit http://gerrit.ovirt.org/36336
To unsubscribe, visit http://gerrit.ovirt.org/settings
Gerrit-MessageType: newchange
Gerrit-Change-Id: I6c805ef33b710fbbe674ac62ae96c3fdf47423e1
Gerrit-PatchSet: 1
Gerrit-Project: vdsm
Gerrit-Branch: master
Gerrit-Owner: Yeela Kaplan <ykaplan(a)redhat.com>
8 years, 6 months
Change in vdsm[master]: lib: add support for utillinux commands
by Federico Simoncelli
Federico Simoncelli has uploaded a new change for review.
Change subject: lib: add support for utillinux commands
......................................................................
lib: add support for utillinux commands
Change-Id: I2ea7dd19fadc600b8fe78fb436ae430d35f52165
Signed-off-by: Federico Simoncelli <fsimonce(a)redhat.com>
---
M lib/vdsm/Makefile.am
A lib/vdsm/utillinux.py
M tests/Makefile.am
A tests/utillinuxTests.py
M vdsm.spec.in
5 files changed, 132 insertions(+), 0 deletions(-)
git pull ssh://gerrit.ovirt.org:29418/vdsm refs/changes/29/35629/1
diff --git a/lib/vdsm/Makefile.am b/lib/vdsm/Makefile.am
index b862e71..4e0868a 100644
--- a/lib/vdsm/Makefile.am
+++ b/lib/vdsm/Makefile.am
@@ -33,6 +33,7 @@
profile.py \
qemuimg.py \
sslutils.py \
+ utillinux.py \
utils.py \
vdscli.py \
virtsparsify.py \
diff --git a/lib/vdsm/utillinux.py b/lib/vdsm/utillinux.py
new file mode 100644
index 0000000..7fb42cf
--- /dev/null
+++ b/lib/vdsm/utillinux.py
@@ -0,0 +1,47 @@
+#
+# Copyright 2014 Red Hat, Inc.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+#
+# Refer to the README and COPYING files for full details of the license
+#
+
+import os
+import re
+import signal
+
+from . import utils
+
+_blkdiscard = utils.CommandPath("blkdiscard",
+ "/sbin/blkdiscard",) # Fedora, EL6
+
+
+def blkdiscard(device, offset=None, length=None, secure=False):
+ cmd = [_blkdiscard.cmd]
+
+ if offset:
+ cmd.extend(("-o", str(offset)))
+
+ if length:
+ cmd.extend(("-l", str(length)))
+
+ if secure:
+ cmd.append("-s")
+
+ cmd.append(device)
+ rc, out, err = utils.execCmd(cmd, deathSignal=signal.SIGKILL)
+
+ if rc != 0:
+ raise QImgError(rc, out, err)
diff --git a/tests/Makefile.am b/tests/Makefile.am
index b365921..5aa9fc3 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -79,6 +79,7 @@
testlibTests.py \
toolTests.py \
transportWrapperTests.py \
+ utillinuxTests.py \
utilsTests.py \
vdsClientTests.py \
vmApiTests.py \
diff --git a/tests/utillinuxTests.py b/tests/utillinuxTests.py
new file mode 100644
index 0000000..dbbb50e
--- /dev/null
+++ b/tests/utillinuxTests.py
@@ -0,0 +1,82 @@
+#
+# Copyright 2014 Red Hat, Inc.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+#
+# Refer to the README and COPYING files for full details of the license
+#
+
+from testlib import VdsmTestCase as TestCaseBase
+import monkeypatch
+from vdsm import utillinux
+from vdsm import utils
+
+BLKDISCARD = utillinux._blkdiscard.cmd
+
+
+class FakeCmd(object):
+
+ def __init__(self, module, name, *calls):
+ self.patch = monkeypatch.Patch([(module, name, self)])
+ self.calls = list(calls)
+
+ def __call__(self, cmd, **kw):
+ call = self.calls.pop(0)
+ return call(cmd, **kw)
+
+ def __enter__(self):
+ self.patch.apply()
+
+ def __exit__(self, t=None, v=None, tb=None):
+ self.patch.revert()
+
+
+class BlkDiscardTests(TestCaseBase):
+
+ def test_no_options(self):
+ def discard(cmd, **kw):
+ expected = [BLKDISCARD, 'device']
+ self.assertEqual(cmd, expected)
+ return 0, '', ''
+
+ with FakeCmd(utils, 'execCmd', discard):
+ utillinux.blkdiscard('device')
+
+ def test_offset(self):
+ def discard(cmd, **kw):
+ expected = [BLKDISCARD, '-o', '1024', 'device']
+ self.assertEqual(cmd, expected)
+ return 0, '', ''
+
+ with FakeCmd(utils, 'execCmd', discard):
+ utillinux.blkdiscard('device', offset=1024)
+
+ def test_length(self):
+ def discard(cmd, **kw):
+ expected = [BLKDISCARD, '-l', '2048', 'device']
+ self.assertEqual(cmd, expected)
+ return 0, '', ''
+
+ with FakeCmd(utils, 'execCmd', discard):
+ utillinux.blkdiscard('device', length=2048)
+
+ def test_offset_and_length(self):
+ def discard(cmd, **kw):
+ expected = [BLKDISCARD, '-o', '1024', '-l', '2048', 'device']
+ self.assertEqual(cmd, expected)
+ return 0, '', ''
+
+ with FakeCmd(utils, 'execCmd', discard):
+ utillinux.blkdiscard('device', offset=1024, length=2048)
diff --git a/vdsm.spec.in b/vdsm.spec.in
index d15f5c2..befe0e0 100644
--- a/vdsm.spec.in
+++ b/vdsm.spec.in
@@ -1252,6 +1252,7 @@
%{python_sitelib}/%{vdsm_name}/qemuimg.py*
%{python_sitelib}/%{vdsm_name}/netconfpersistence.py*
%{python_sitelib}/%{vdsm_name}/sslutils.py*
+%{python_sitelib}/%{vdsm_name}/utillinux.py*
%{python_sitelib}/%{vdsm_name}/utils.py*
%{python_sitelib}/%{vdsm_name}/vdscli.py*
%{python_sitelib}/%{vdsm_name}/virtsparsify.py*
--
To view, visit http://gerrit.ovirt.org/35629
To unsubscribe, visit http://gerrit.ovirt.org/settings
Gerrit-MessageType: newchange
Gerrit-Change-Id: I2ea7dd19fadc600b8fe78fb436ae430d35f52165
Gerrit-PatchSet: 1
Gerrit-Project: vdsm
Gerrit-Branch: master
Gerrit-Owner: Federico Simoncelli <fsimonce(a)redhat.com>
8 years, 6 months
Change in vdsm[master]: lvm: Decrease number of retries before failing
by Nir Soffer
Nir Soffer has uploaded a new change for review.
Change subject: lvm: Decrease number of retries before failing
......................................................................
lvm: Decrease number of retries before failing
Previously we configured lvm to stop accessing a device during an lvm
opoeration after 3 errors. This can cause lvm to block 3 times when
trying to access inaccessible device. With current iscsi settings, each
block can be 120 seconds, total 360 seconds. We have seen lvm block for
couple of minutes in such cases.
The retries seems uneeded when working with multiple paths, as multipath
already retry all available paths after SCSI errors on one path. However
when working with single path, multipath should fail after one try.
According to lvm developer this may decrease the time lvm is blocked
when devices are not accesible.
(Not tested yet)
Change-Id: I5d11abaaff45ce86e88c6589264e162318ac1f1d
Relates-To: https://bugzilla.redhat.com/880738
Signed-off-by: Nir Soffer <nsoffer(a)redhat.com>
---
M vdsm/storage/lvm.py
1 file changed, 1 insertion(+), 1 deletion(-)
git pull ssh://gerrit.ovirt.org:29418/vdsm refs/changes/56/32356/1
diff --git a/vdsm/storage/lvm.py b/vdsm/storage/lvm.py
index 86edf55..f760f7b 100644
--- a/vdsm/storage/lvm.py
+++ b/vdsm/storage/lvm.py
@@ -106,7 +106,7 @@
preferred_names = ["^/dev/mapper/"]
ignore_suspended_devices=1
write_cache_state=0
-disable_after_error_count=3
+disable_after_error_count=1
obtain_device_list_from_udev=0
%s
}
--
To view, visit http://gerrit.ovirt.org/32356
To unsubscribe, visit http://gerrit.ovirt.org/settings
Gerrit-MessageType: newchange
Gerrit-Change-Id: I5d11abaaff45ce86e88c6589264e162318ac1f1d
Gerrit-PatchSet: 1
Gerrit-Project: vdsm
Gerrit-Branch: master
Gerrit-Owner: Nir Soffer <nsoffer(a)redhat.com>
8 years, 6 months
Change in vdsm[master]: clusterlock: Remove uneeded workaround
by Nir Soffer
Nir Soffer has uploaded a new change for review.
Change subject: clusterlock: Remove uneeded workaround
......................................................................
clusterlock: Remove uneeded workaround
Sanlock version XXXX had a off-by-one bug when calling get_hosts with a
host id, returning info for the next host. This bug is fixed in version
XXX. Now we can use the hostId parameter, making the call more efficient
and simpligying clusterlock code.
Change-Id: Ide75e749fbc2916540c2b526b78fedc247b5c6f9
Signed-off-by: Nir Soffer <nsoffer(a)redhat.com>
---
M vdsm.spec.in
M vdsm/storage/clusterlock.py
2 files changed, 5 insertions(+), 16 deletions(-)
git pull ssh://gerrit.ovirt.org:29418/vdsm refs/changes/62/31162/1
diff --git a/vdsm.spec.in b/vdsm.spec.in
index 5ba6fc6..fc39eb9 100644
--- a/vdsm.spec.in
+++ b/vdsm.spec.in
@@ -167,7 +167,7 @@
Requires: iscsi-initiator-utils >= 6.2.0.873-21
%endif
-Requires: sanlock >= 2.8, sanlock-python
+Requires: sanlock >= XXX, sanlock-python
%if 0%{?rhel}
Requires: python-ethtool >= 0.6-3
diff --git a/vdsm/storage/clusterlock.py b/vdsm/storage/clusterlock.py
index 24a5d81..17cdd53 100644
--- a/vdsm/storage/clusterlock.py
+++ b/vdsm/storage/clusterlock.py
@@ -265,26 +265,15 @@
return False
def getHostStatus(self, hostId):
- # Note: get_hosts has off-by-one bug when asking for particular host
- # id, so get all hosts info and filter.
- # See https://bugzilla.redhat.com/1111210
try:
- hosts = sanlock.get_hosts(self._sdUUID)
+ hosts = sanlock.get_hosts(self._sdUUID, hostId)
except sanlock.SanlockException as e:
self.log.debug("Unable to get host %d status in lockspace %s: %s",
hostId, self._sdUUID, e)
return HOST_STATUS_UNAVAILABLE
-
- for info in hosts:
- if info['host_id'] == hostId:
- status = info['flags']
- return self.STATUS_NAME[status]
-
- # get_hosts with host_id=0 returns only hosts with timestamp != 0,
- # which means that no host is using this host id now. If there a
- # timestamp, sanlock will return HOST_UNKNOWN and then HOST_LIVE or
- # HOST_FAIL.
- return HOST_STATUS_FREE
+ else:
+ status = hosts[0]['flags']
+ return self.STATUS_NAME[status]
# The hostId parameter is maintained here only for compatibility with
# ClusterLock. We could consider to remove it in the future but keeping it
--
To view, visit http://gerrit.ovirt.org/31162
To unsubscribe, visit http://gerrit.ovirt.org/settings
Gerrit-MessageType: newchange
Gerrit-Change-Id: Ide75e749fbc2916540c2b526b78fedc247b5c6f9
Gerrit-PatchSet: 1
Gerrit-Project: vdsm
Gerrit-Branch: master
Gerrit-Owner: Nir Soffer <nsoffer(a)redhat.com>
8 years, 6 months
Change in vdsm[master]: migration: Add support for max migration bandwidth setting
by tjelinek@redhat.com
Tomas Jelinek has uploaded a new change for review.
Change subject: migration: Add support for max migration bandwidth setting
......................................................................
migration: Add support for max migration bandwidth setting
Enriched the migrate verb by maxBandwidth.
It is an optional argument and the fallback is to migration_max_bandwidth from
config.
Feature-Page: http://www.ovirt.org/Features/Migration_Enhancements
Change-Id: I9d99e488a9e8bb80b0c3c069628171c666f3bf4b
Signed-off-by: Tomas Jelinek <tjelinek(a)redhat.com>
---
M client/vdsClient.py
M vdsm/API.py
M vdsm/virt/migration.py
3 files changed, 6 insertions(+), 3 deletions(-)
git pull ssh://gerrit.ovirt.org:29418/vdsm refs/changes/46/46846/1
diff --git a/client/vdsClient.py b/client/vdsClient.py
index 71b559a..29f6ba4 100755
--- a/client/vdsClient.py
+++ b/client/vdsClient.py
@@ -2221,13 +2221,14 @@
'migrate': (serv.do_migrate,
('vmId=<id> method=<offline|online> src=<host[:port]> '
'dst=<host[:port]> dstqemu=<host> [consoleAddress:str] '
- '[autoConverge:bool] [compressed:bool]',
+ '[autoConverge:bool] [compressed:bool] [maxBandwidth:int]',
'Migrate a desktop from src machine to dst host using '
'the specified ports and an optional address for '
'migration data traffic.',
'o consoleAddress: destination host grapics address',
'o autoConverge: force convergence during migration',
'o compressed: compress repeated pages during migration'
+ 'o maxBandwidth: max bandwidth used by this migration'
)),
'migrateStatus': (serv.do_mStat,
('<vmId>',
diff --git a/vdsm/API.py b/vdsm/API.py
index e3b9241..8b5eb1b 100644
--- a/vdsm/API.py
+++ b/vdsm/API.py
@@ -532,6 +532,7 @@
*dstqemu* - remote host address dedicated for migration
*compressed* - compress repeated pages during live migration
*autoConverge* - force convergence during live migration
+ *maxBandwidth* - max bandwidth used by this specific migration
"""
params['vmId'] = self._UUID
self.log.debug(params)
diff --git a/vdsm/virt/migration.py b/vdsm/virt/migration.py
index 32caccb..46bbfee 100644
--- a/vdsm/virt/migration.py
+++ b/vdsm/virt/migration.py
@@ -93,6 +93,8 @@
self._dstqemu = dstqemu
self._downtime = kwargs.get('downtime') or \
config.get('vars', 'migration_downtime')
+ self._maxBandwidth = kwargs.get('maxBandwidth') or \
+ config.getint('vars', 'migration_max_bandwidth')
self._autoConverge = autoConverge
self._compressed = compressed
self.status = {
@@ -371,7 +373,6 @@
SPICE_MIGRATION_HANDOVER_TIME = 120
self._vm._reviveTicket(SPICE_MIGRATION_HANDOVER_TIME)
- maxBandwidth = config.getint('vars', 'migration_max_bandwidth')
# FIXME: there still a race here with libvirt,
# if we call stop() and libvirt migrateToURI3 didn't start
# we may return migration stop but it will start at libvirt
@@ -380,7 +381,7 @@
if not self._migrationCanceledEvt:
# TODO: use libvirt constants when bz#1222795 is fixed
params = {VIR_MIGRATE_PARAM_URI: str(muri),
- VIR_MIGRATE_PARAM_BANDWIDTH: maxBandwidth}
+ VIR_MIGRATE_PARAM_BANDWIDTH: int(self._maxBandwidth)}
if self._consoleAddress:
if self._vm.hasSpice:
graphics = 'spice'
--
To view, visit https://gerrit.ovirt.org/46846
To unsubscribe, visit https://gerrit.ovirt.org/settings
Gerrit-MessageType: newchange
Gerrit-Change-Id: I9d99e488a9e8bb80b0c3c069628171c666f3bf4b
Gerrit-PatchSet: 1
Gerrit-Project: vdsm
Gerrit-Branch: master
Gerrit-Owner: Tomas Jelinek <tjelinek(a)redhat.com>
8 years, 6 months
Change in vdsm[master]: hook: before_network_rollback
by phoracek@redhat.com
Petr Horáček has uploaded a new change for review.
Change subject: hook: before_network_rollback
......................................................................
hook: before_network_rollback
When an exception occurs during network setup, rollback is executed
and after_network_setup is never triggered.
This hook point triggers hooks right before rollback (if needed).
Change-Id: I8a5d086b15b72c13d2b390c1310c2279446ac14f
Signed-off-by: Petr Horáček <phoracek(a)redhat.com>
---
M vdsm.spec.in
M vdsm/hooks.py
M vdsm/network/api.py
M vdsm/vdsmd.8.in
M vdsm_hooks/Makefile.am
5 files changed, 27 insertions(+), 9 deletions(-)
git pull ssh://gerrit.ovirt.org:29418/vdsm refs/changes/85/45085/1
diff --git a/vdsm.spec.in b/vdsm.spec.in
index 72e7df6..53e388e 100644
--- a/vdsm.spec.in
+++ b/vdsm.spec.in
@@ -962,6 +962,7 @@
%dir %{_libexecdir}/%{vdsm_name}/hooks/after_disk_hotunplug
%dir %{_libexecdir}/%{vdsm_name}/hooks/before_vdsm_start
%dir %{_libexecdir}/%{vdsm_name}/hooks/after_vdsm_stop
+%dir %{_libexecdir}/%{vdsm_name}/hooks/before_network_rollback
%dir %{_libexecdir}/%{vdsm_name}/hooks/before_network_setup
%dir %{_libexecdir}/%{vdsm_name}/hooks/after_network_setup
%dir %{_libexecdir}/%{vdsm_name}/hooks/before_set_num_of_cpus
diff --git a/vdsm/hooks.py b/vdsm/hooks.py
index 5a4d25e..d3f8741 100644
--- a/vdsm/hooks.py
+++ b/vdsm/hooks.py
@@ -351,6 +351,11 @@
raiseError=False, hookType=_JSON_HOOK)
+def before_network_rollback(network_config_dict):
+ return _runHooksDir(network_config_dict, 'before_network_rollback',
+ raiseError=False, hookType=_JSON_HOOK)
+
+
def before_get_vm_stats():
return _runHooksDir({}, 'before_get_vm_stats', raiseError=True,
hookType=_JSON_HOOK)
diff --git a/vdsm/network/api.py b/vdsm/network/api.py
index 5c8bed5..7798497 100755
--- a/vdsm/network/api.py
+++ b/vdsm/network/api.py
@@ -19,6 +19,7 @@
from __future__ import absolute_import
from __future__ import print_function
+from contextlib import contextmanager
from functools import wraps
import errno
import inspect
@@ -865,7 +866,8 @@
kernel_config = netconfpersistence.KernelConfig(_netinfo)
normalized_config = kernel_config.normalize(
netconfpersistence.BaseConfig(networks, bondings))
- with ConfiguratorClass(in_rollback) as configurator:
+ with ConfiguratorClass(in_rollback) as configurator,\
+ _hooks_before_network_rollback(networks, bondings, options):
# Remove edited networks and networks with 'remove' attribute
for network, attrs in networks.items():
if network in _netinfo.networks:
@@ -907,6 +909,16 @@
hooks.after_network_setup(_buildSetupHookDict(networks, bondings, options))
+@contextmanager
+def _hooks_before_network_rollback(networks, bondings, options):
+ try:
+ yield
+ except:
+ hooks.before_network_rollback(
+ _buildSetupHookDict(networks, bondings, options))
+ raise
+
+
def _vlanToInternalRepresentation(vlan):
if vlan is None or vlan == '':
vlan = None
diff --git a/vdsm/vdsmd.8.in b/vdsm/vdsmd.8.in
index 5dcac3f..a42e329 100644
--- a/vdsm/vdsmd.8.in
+++ b/vdsm/vdsmd.8.in
@@ -57,7 +57,7 @@
before_disk_hotplug, after_disk_hotplug,
before_disk_hotunplug, after_disk_hotunplug,
before_vdsm_start, after_vdsm_stop,
- before_network_setup, after_network_setup,
+ before_network_setup, after_network_setup, before_network_rollback,
before_set_num_of_cpus, after_set_num_of_cpus,
before_get_vm_stats, after_get_vm_stats,
before_get_all_vm_stats, after_get_all_vm_stats,
@@ -72,11 +72,10 @@
.SS Hook environment
Each hook script (except before_vdsm_start, after_vdsm_stop,
-before_network_setup and after_network_setup, before_get_vm_stats,
-after_get_vm_stats, before_get_all_vm_stats, after_get_all_vm_stats,
-before_get_caps, after_get_caps,
-before_get_stats, after_get_stats,
-and after_hostdev_list_by_caps) inherit
+before_network_setup and after_network_setup, before_network_rollback,
+before_get_vm_stats, after_get_vm_stats, before_get_all_vm_stats,
+after_get_all_vm_stats, before_get_caps, after_get_caps, before_get_stats,
+after_get_stats, and after_hostdev_list_by_caps) inherit
the environment of the VDSM process, with an additional variable
.B _hook_domxml
which holds the path of libvirt's
@@ -86,8 +85,8 @@
available as the environment variable
.B vmId.
-The before_network_setup and after_network_setup hooks do also include an
-extra environment variable
+The before_network_setup, after_network_setup and before_network_rollback
+hooks do also include an extra environment variable
.B _hook_json
which holds a pointer to a file with the network parameters that vdsm is
setting up (
diff --git a/vdsm_hooks/Makefile.am b/vdsm_hooks/Makefile.am
index 7dc9ff2..5e8d401 100644
--- a/vdsm_hooks/Makefile.am
+++ b/vdsm_hooks/Makefile.am
@@ -115,6 +115,7 @@
after_disk_hotunplug \
before_vdsm_start \
after_vdsm_stop \
+ before_network_rollback \
before_network_setup \
after_network_setup \
before_set_num_of_cpus \
--
To view, visit https://gerrit.ovirt.org/45085
To unsubscribe, visit https://gerrit.ovirt.org/settings
Gerrit-MessageType: newchange
Gerrit-Change-Id: I8a5d086b15b72c13d2b390c1310c2279446ac14f
Gerrit-PatchSet: 1
Gerrit-Project: vdsm
Gerrit-Branch: master
Gerrit-Owner: Petr Horáček <phoracek(a)redhat.com>
8 years, 6 months
Change in vdsm[master]: net: ovs: remove initial nic ip, dont touch unchanged networks
by phoracek@redhat.com
Petr Horáček has uploaded a new change for review.
Change subject: net: ovs: remove initial nic ip, dont touch unchanged networks
......................................................................
net: ovs: remove initial nic ip, dont touch unchanged networks
According to ifcfg configurator behavior, now we remove inital IP
configuration of nics attached to VDSM network.
Also there is an improvement in IP changes handling: If IP configuration
was not changed, don't recreate it.
Signed-off-by: Petr Horáček <phoracek(a)redhat.com>
Change-Id: Ie9682c75cfb79f75b64cb8cb587fc3ed01cf15c8
---
M vdsm_hooks/ovs/ovs_before_network_setup.py
M vdsm_hooks/ovs/ovs_before_network_setup_ip.py
2 files changed, 53 insertions(+), 18 deletions(-)
git pull ssh://gerrit.ovirt.org:29418/vdsm refs/changes/92/46692/1
diff --git a/vdsm_hooks/ovs/ovs_before_network_setup.py b/vdsm_hooks/ovs/ovs_before_network_setup.py
index 6cef711..a8aa707 100755
--- a/vdsm_hooks/ovs/ovs_before_network_setup.py
+++ b/vdsm_hooks/ovs/ovs_before_network_setup.py
@@ -81,7 +81,8 @@
with _rollback(running_config, initial_config, in_rollback):
configure_ovs(commands, libvirt_create, libvirt_remove, running_config)
configure_mtu(running_config)
- configure_ip(nets, initial_config.networks)
+ configure_ip(nets, initial_config.networks, bonds,
+ initial_config.bonds)
hooking.log('Saving running configuration: %s %s' %
(running_config.networks, running_config.bonds))
diff --git a/vdsm_hooks/ovs/ovs_before_network_setup_ip.py b/vdsm_hooks/ovs/ovs_before_network_setup_ip.py
index 90640a4..ba6b6d3 100644
--- a/vdsm_hooks/ovs/ovs_before_network_setup_ip.py
+++ b/vdsm_hooks/ovs/ovs_before_network_setup_ip.py
@@ -17,6 +17,7 @@
#
# Refer to the README and COPYING files for full details of the license
#
+import os
import sys
from vdsm import ipwrapper, sysctl
@@ -27,7 +28,7 @@
# TODO: move required modules into vdsm/lib
sys.path.append('/usr/share/vdsm')
-from network.configurators.dhclient import DhcpClient
+from network.configurators.dhclient import DhcpClient, kill_dhclient
from network.configurators.iproute2 import Iproute2
from network.models import NetDevice, IPv4, IPv6
from network.sourceroute import DynamicSourceRoute
@@ -89,7 +90,7 @@
iproute2._addSourceRoute(net_dev)
-def _remove_ip_config(iface, ipv4, ipv6):
+def _remove_ip_config(iface, ipv4, ipv6, vdsm=True):
net_dev = NetDevice(iface, iproute2, ipv4=ipv4, ipv6=ipv6)
DynamicSourceRoute.addInterfaceTracking(net_dev)
DhcpClient(iface).shutdown()
@@ -99,25 +100,58 @@
ipwrapper.addrFlush(iface)
-def configure_ip(nets, init_nets):
+def _drop_ip_config(iface):
+ """Remove IP configuration of a new nic attached to VDSM"""
+ if os.path.exists(os.path.join('/sys/class/net', iface)):
+ kill_dhclient(iface, family=4) # kill_dhclient flushes IP
+ kill_dhclient(iface, family=6)
+
+
+def configure_ip(nets, init_nets, bonds, init_bonds):
+
+ def _gather_ip_config(attrs):
+ top_dev = net if 'vlan' in attrs else BRIDGE_NAME
+ ipv4 = _get_ipv4_model(attrs)
+ ipv6 = _get_ipv6_model(attrs)
+ port = attrs.get('nic') or attrs.get('bonding')
+ blocking_dhcp = 'blockingdhcp' in attrs
+ return top_dev, ipv4, ipv6, port, blocking_dhcp
+
ip_config_to_set = {}
ip_config_to_remove = {}
- for net, attrs in nets.items():
- if net in init_nets:
- init_attrs = init_nets[net]
- init_top_dev = net if 'vlan' in init_attrs else BRIDGE_NAME
- ipv4 = _get_ipv4_model(init_attrs)
- ipv6 = _get_ipv6_model(init_attrs)
+ for net, attrs in nets.iteritems():
+ if 'remove' in attrs: # if network was removed
+ # remove networks IP config (running dhclient)
+ init_top_dev, ipv4, ipv6, _, _ = _gather_ip_config(init_nets[net])
ip_config_to_remove[init_top_dev] = ipv4, ipv6
- if 'remove' not in attrs:
- top_dev = net if 'vlan' in attrs else BRIDGE_NAME
- ipv4 = _get_ipv4_model(attrs)
- ipv6 = _get_ipv6_model(attrs)
- port = attrs.get('nic') or attrs.get('bonding')
- if ipv4 or ipv6:
- ip_config_to_set[top_dev] = (
- ipv4, ipv6, port, 'blockingdhcp' in attrs)
+ else:
+ top_dev, ipv4, ipv6, port, blocking_dhcp = _gather_ip_config(attrs)
+
+ if net in init_nets: # if network was edited
+ init_top_dev, init_ipv4, init_ipv6, _, _ = \
+ _gather_ip_config(init_nets[net])
+
+ # drop IP of newly attached nics
+ if init_nets[net].get('nic') != attrs.get('nic') is not None:
+ _drop_ip_config(attrs.get('nic'))
+
+ # if IP config is to be changed or net top device was changed,
+ # remove initial configuration and set the new one if any
+ if (ipv4 != init_ipv4 or ipv6 != init_ipv6 or
+ attrs.get('vlan') != init_nets[net].get('vlan')):
+ ip_config_to_remove[init_top_dev] = ipv4, ipv6
+ if ipv4 or ipv6:
+ ip_config_to_set[top_dev] = (ipv4, ipv6, port,
+ blocking_dhcp)
+ else: # if network was added
+ # set networks IP configuration if any
+ if ipv4 or ipv6:
+ ip_config_to_set[top_dev] = (ipv4, ipv6, port,
+ blocking_dhcp)
+ # drop IP of newly attached nics
+ if attrs.get('nic') is not None:
+ _drop_ip_config(attrs.get('nic'))
hooking.log('Remove IP configuration of: %s' % ip_config_to_remove)
hooking.log('Set IP configuration: %s' % ip_config_to_set)
--
To view, visit https://gerrit.ovirt.org/46692
To unsubscribe, visit https://gerrit.ovirt.org/settings
Gerrit-MessageType: newchange
Gerrit-Change-Id: Ie9682c75cfb79f75b64cb8cb587fc3ed01cf15c8
Gerrit-PatchSet: 1
Gerrit-Project: vdsm
Gerrit-Branch: master
Gerrit-Owner: Petr Horáček <phoracek(a)redhat.com>
8 years, 6 months
Change in vdsm[ovirt-3.6]: spec: install bonding-defaults.json with 644 permissions, no...
by osvoboda@redhat.com
Ondřej Svoboda has uploaded a new change for review.
Change subject: spec: install bonding-defaults.json with 644 permissions, not 600
......................................................................
spec: install bonding-defaults.json with 644 permissions, not 600
This way make check succeeds under non-root account for
testIterNetworkHierarchy, testTextualRepr and testValidateBondingOptions
which previously failed to read the file.
Change-Id: I3090cb77c8b6329c4885c6dbd43b04998df20dfe
Signed-off-by: Ondřej Svoboda <osvoboda(a)redhat.com>
Reviewed-on: https://gerrit.ovirt.org/46395
Continuous-Integration: Jenkins CI
Reviewed-by: Dan Kenigsberg <danken(a)redhat.com>
---
M vdsm.spec.in
1 file changed, 2 insertions(+), 1 deletion(-)
git pull ssh://gerrit.ovirt.org:29418/vdsm refs/changes/01/46401/1
diff --git a/vdsm.spec.in b/vdsm.spec.in
index f000f63..8772640 100644
--- a/vdsm.spec.in
+++ b/vdsm.spec.in
@@ -1006,7 +1006,6 @@
%dir %{_sysconfdir}/pki/%{vdsm_name}/certs
%dir %{_sysconfdir}/pki/%{vdsm_name}/libvirt-spice
%config(noreplace) %{_sysconfdir}/pki/%{vdsm_name}/keys/libvirt_password
-%{_localstatedir}/lib/%{vdsm_name}/bonding-defaults.json
%dir %{_localstatedir}/lib/%{vdsm_name}
%dir %{_localstatedir}/lib/%{vdsm_name}/netconfback
%dir %{_localstatedir}/lib/%{vdsm_name}/persistence
@@ -1018,6 +1017,8 @@
%dir %{_localstatedir}/run/%{vdsm_name}/v2v
%dir %{_localstatedir}/log/%{vdsm_name}
%dir %{_localstatedir}/log/%{vdsm_name}/backup
+%defattr(644, %{vdsm_user}, %{vdsm_group}, -)
+%{_localstatedir}/lib/%{vdsm_name}/bonding-defaults.json
%files python
%defattr(-, root, root, -)
--
To view, visit https://gerrit.ovirt.org/46401
To unsubscribe, visit https://gerrit.ovirt.org/settings
Gerrit-MessageType: newchange
Gerrit-Change-Id: I3090cb77c8b6329c4885c6dbd43b04998df20dfe
Gerrit-PatchSet: 1
Gerrit-Project: vdsm
Gerrit-Branch: ovirt-3.6
Gerrit-Owner: Ondřej Svoboda <osvoboda(a)redhat.com>
8 years, 6 months