[NEW PATCH] BZ#717658 - Remove SDF.invalidateStorage. (via gerrit-bot)
by ewarszaw@redhat.com
New patch submitted by Eduardo Warszawski (ewarszaw(a)redhat.com)
You can review this change at: http://gerrit.usersys.redhat.com/638
commit 3862cfc24502f249e2d1a298cde2ab8a7ef6d581
Author: Eduardo Warszawski <ewarszaw(a)redhat.com>
Date: Thu Jun 30 06:06:00 2011 +0300
BZ#717658 - Remove SDF.invalidateStorage.
Change-Id: I13a6c7a91e372d6c53ffaddfbe527d6fe1a5c6d7
diff --git a/vdsm/storage/sdc.py b/vdsm/storage/sdc.py
index a3ea775..0ed34e5 100644
--- a/vdsm/storage/sdc.py
+++ b/vdsm/storage/sdc.py
@@ -37,7 +37,7 @@ class StorageDomainCache:
self.storageStale = True
- def invalidateStorage(self):
+ def _invalidateStorage(self):
self.storageStale = True
@misc.samplingmethod
@@ -117,7 +117,7 @@ class StorageDomainCache:
return uuids
def refresh(self):
- self.invalidateStorage()
+ self._invalidateStorage()
self.__cache.clear()
def manuallyAddDomain(self, dom):
diff --git a/vdsm/storage/sdf.py b/vdsm/storage/sdf.py
index b5ec3e3..da8335c 100644
--- a/vdsm/storage/sdf.py
+++ b/vdsm/storage/sdf.py
@@ -103,11 +103,6 @@ class StorageDomainFactory:
@classmethod
- def invalidateStorage(cls):
- cls.__sdc.invalidateStorage()
-
-
- @classmethod
def refreshStorage(cls):
cls.__sdc.refreshStorage()
12 years, 6 months
[NEW PATCH] BZ#717658 - Forward one step the reloading of block domains. (via gerrit-bot)
by ewarszaw@redhat.com
New patch submitted by Eduardo Warszawski (ewarszaw(a)redhat.com)
You can review this change at: http://gerrit.usersys.redhat.com/637
commit 0f27a3fcc8ecbe2e7f3925d0251a05c033b01d64
Author: Eduardo Warszawski <ewarszaw(a)redhat.com>
Date: Thu Jun 30 05:40:58 2011 +0300
BZ#717658 - Forward one step the reloading of block domains.
SDF.invalidateStorage() will trigger SDF.refreshStorage when SDF.lookup,
but lvm reload will came only after.
Change-Id: I035060894720518d70a0951ffc0d0c14a98793d2
diff --git a/vdsm/storage/hsm.py b/vdsm/storage/hsm.py
index ab5a59d..29206f5 100644
--- a/vdsm/storage/hsm.py
+++ b/vdsm/storage/hsm.py
@@ -1055,7 +1055,7 @@ class HSM:
statusList = storage_connection.StorageServerConnection().connect(domType=domType, conList=conList)
# Connecting new device may change the visible storage domain list
# so invalidate caches
- SDF.invalidateStorage()
+ SDF.refreshStorage()
return dict(statuslist=statusList)
12 years, 6 months
[NEW PATCH] BZ#712106 - Add lock for template during moveImage operation (via gerrit-bot)
by Igor Lvovsky
New patch submitted by Igor Lvovsky (ilvovsky(a)redhat.com)
You can review this change at: http://gerrit.usersys.redhat.com/630
commit 74ec9aede8460a5cb69269ff5420bb183b3d3110
Author: Igor Lvovsky <ilvovsky(a)redhat.com>
Date: Tue Jun 21 13:52:20 2011 +0300
BZ#712106 - Add lock for template during moveImage operation
Change-Id: Ib87649cf0aebd5a35d56faa7e8f165d10d715331
diff --git a/vdsm/constants.py b/vdsm/constants.py
index ae9a79b..3a800a4 100644
--- a/vdsm/constants.py
+++ b/vdsm/constants.py
@@ -139,6 +139,11 @@ CMD_LOWPRIO = [EXT_NICE, '-n', '19', EXT_IONICE, '-c', '2', '-n', '7']
#
# Storage constants
#
+
+LVM_ACTIVATION_NAMESPACE = 'lvmActivationNS'
+IMAGE_NAMESPACE = 'imageNS'
+VOLUME_NAMESPACE = 'volumeNS'
+
STRG_ISCSI_HOST = "iscsi_host/"
STRG_SCSI_HOST = "scsi_host/"
STRG_ISCSI_SESSION = "iscsi_session/"
diff --git a/vdsm/storage/blockSD.py b/vdsm/storage/blockSD.py
index 214e8a4..01b2182 100644
--- a/vdsm/storage/blockSD.py
+++ b/vdsm/storage/blockSD.py
@@ -27,7 +27,7 @@ import safelease
import blockVolume
import multipath
import resourceFactories
-from resourceFactories import LVM_ACTIVATION_NAMESPACE
+from constants import LVM_ACTIVATION_NAMESPACE
from persistentDict import PersistentDict, DictValidator
import iscsi
import storage_exception as se
diff --git a/vdsm/storage/blockVolume.py b/vdsm/storage/blockVolume.py
index ae411be..cebdd6b 100644
--- a/vdsm/storage/blockVolume.py
+++ b/vdsm/storage/blockVolume.py
@@ -24,7 +24,7 @@ import lvm
import resourceManager as rm
from threadLocal import vars
from sdf import StorageDomainFactory as SDF
-from resourceFactories import LVM_ACTIVATION_NAMESPACE
+from constants import LVM_ACTIVATION_NAMESPACE
import fileUtils
TAG_PREFIX_MD = "MD_"
diff --git a/vdsm/storage/hsm.py b/vdsm/storage/hsm.py
index 2aaf822..c00cb70 100644
--- a/vdsm/storage/hsm.py
+++ b/vdsm/storage/hsm.py
@@ -38,7 +38,7 @@ from threadLocal import vars
import constants
from storageConstants import STORAGE
from task import Job
-from resourceFactories import IMAGE_NAMESPACE
+from constants import IMAGE_NAMESPACE
import resourceManager as rm
import devicemapper
diff --git a/vdsm/storage/image.py b/vdsm/storage/image.py
index 40a82c9..f655e44 100644
--- a/vdsm/storage/image.py
+++ b/vdsm/storage/image.py
@@ -22,6 +22,11 @@ from config import config
import storage_exception as se
import task
from threadLocal import vars
+from constants import IMAGE_NAMESPACE
+import resourceManager as rm
+from contextlib import contextmanager
+
+rmanager = rm.ResourceManager.getInstance()
# Disk type
UNKNOWN_DISK_TYPE = 0
@@ -315,7 +320,8 @@ class Image:
srcVol = None
if not srcVol:
- raise se.ImageIsNotLegalChain("Image %s is not a leaf" % imgUUID)
+ self.log.error("There is no leaf in the image %s" % imgUUID)
+ raise se.ImageIsNotLegalChain(imgUUID)
# Build up the sorted (parent->child) chain
while not srcVol.isShared():
@@ -450,48 +456,29 @@ class Image:
"""
try:
if srcVol:
- srcVol.teardown(sdUUID=srcVol.sdUUID, volUUID=srcVol.volUUID, justme=True)
+ srcVol.teardown(sdUUID=srcVol.sdUUID, volUUID=srcVol.volUUID)
if dstVol:
- dstVol.teardown(sdUUID=dstVol.sdUUID, volUUID=dstVol.volUUID, justme=True)
+ dstVol.teardown(sdUUID=dstVol.sdUUID, volUUID=dstVol.volUUID)
except Exception:
self.log.error("Unexpected error", exc_info=True)
- def move(self, srcSdUUID, dstSdUUID, imgUUID, vmUUID, op, postZero, force):
- """
- Move/Copy image between storage domains within same storage pool
- """
- self.log.info("srcSdUUID=%s dstSdUUID=%s "\
- "imgUUID=%s vmUUID=%s op=%s force=%s postZero=%s",
- srcSdUUID, dstSdUUID, imgUUID, vmUUID, OP_TYPES[op], str(force), str(postZero))
-
- srcVol = leafVol = dstVol = None
+ def _createTargetImage(self, destDom, srcSdUUID, imgUUID):
+ # Before actual data copying we need perform several operation
+ # such as: create all volumes, create fake template if needed, ...
try:
# Find all volumes of source image
- chain = self.getChain(srcSdUUID, imgUUID)
- leafVol = chain[-1]
- except se.StorageException, e:
+ srcChain = self.getChain(srcSdUUID, imgUUID)
+ except se.StorageException:
self.log.error("Unexpected error", exc_info=True)
raise
except Exception, e:
self.log.error("Unexpected error", exc_info=True)
raise se.SourceImageActionError(imgUUID, srcSdUUID, str(e))
- destDom = SDF.produce(dstSdUUID)
+ fakeTemplate = False
pimg = volume.BLANK_UUID # standalone chain
- # If image already exists check whether it illegal/fake, overwrite it
- if not self.isLegal(dstSdUUID, imgUUID):
- force = True
- # We must first remove the previous instance of image (if exists)
- # in destination domain, if we got the overwrite command
- if force:
- try:
- self.log.info("delete image %s on domain %s before overwriting", imgUUID, dstSdUUID)
- self.delete(dstSdUUID, imgUUID, postZero, force=True)
- except Exception, e:
- self.log.error("Unexpected error", exc_info=True)
- raise e
# check if the chain is build above a template, or it is a standalone
- pvol = chain[0].getParentVolume()
+ pvol = srcChain[0].getParentVolume()
if pvol:
# find out parent volume parameters
volParams = pvol.getVolumeParams()
@@ -500,81 +487,145 @@ class Image:
# FIXME: This workaround help as copy VM to the backup domain without its template
# We will create fake template for future VM creation and mark it as FAKE volume
# This situation is relevant for backup domain only
- self.createFakeTemplate(dstSdUUID, volParams)
+ fakeTemplate = True
+
+ @contextmanager
+ def justLogIt(pimg):
+ self.log.debug("You don't really need lock for image %s", pimg)
+ yield
+
+ dstTmplResourcesNamespace = sd.getNamespace(destDom.sdUUID, IMAGE_NAMESPACE)
+ # In destination domain we need to lock image's template if exists
+ with rmanager.acquireResource(dstTmplResourcesNamespace, pimg, rm.LockType.shared) \
+ if pimg != volume.BLANK_UUID else justLogIt(pimg):
+ if fakeTemplate:
+ self.createFakeTemplate(destDom.sdUUID, volParams)
+
+ dstChain = []
+ for srcVol in srcChain:
+ # Create the dst volume
+ try:
+ # find out src volume parameters
+ volParams = srcVol.getVolumeParams(bs=1)
+
+ # To avoid 'prezeroing' preallocated volume on NFS domain,
+ # we create the target volume with minimal size and after that w'll change
+ # its metadata back to the original size.
+ tmpSize = 20480 # in sectors (10M)
+ destDom.createVolume(imgUUID=imgUUID, size=tmpSize,
+ volFormat=volParams['volFormat'], preallocate=volParams['prealloc'],
+ diskType=volParams['disktype'], volUUID=srcVol.volUUID, desc=volParams['descr'],
+ srcImgUUID=pimg, srcVolUUID=volParams['parent'])
+ dstVol = destDom.produceVolume(imgUUID=imgUUID, volUUID=srcVol.volUUID)
+ # Extend volume (for LV only) size to the actual size
+ dstVol.extend((volParams['apparentsize'] + 511) / 512)
+ # Change destination volume metadata back to the original size.
+ dstVol.setSize(volParams['size'])
+ dstChain.append(dstVol)
+ except se.StorageException:
+ self.log.error("Unexpected error", exc_info=True)
+ raise
+ except Exception, e:
+ self.log.error("Unexpected error", exc_info=True)
+ raise se.DestImageActionError(imgUUID, destDom.sdUUID, str(e))
- for srcVol in chain:
- # Create the dst volume
- try:
- # find out src volume parameters
- volParams = srcVol.getVolumeParams(bs=1)
+ # only base may have a different parent image
+ pimg = imgUUID
- # To avoid 'prezeroing' preallocated volume on NFS domain,
- # we create the target volume with minimal size and after that w'll change
- # its metadata back to the original size.
- tmpSize = 20480 # in sectors (10M)
- destDom.createVolume(imgUUID=imgUUID, size=tmpSize,
- volFormat=volParams['volFormat'], preallocate=volParams['prealloc'],
- diskType=volParams['disktype'], volUUID=srcVol.volUUID, desc=volParams['descr'],
- srcImgUUID=pimg, srcVolUUID=volParams['parent'])
- # Extend volume (for LV only) size to the actual size
- dstVol = destDom.produceVolume(imgUUID=imgUUID, volUUID=srcVol.volUUID)
- dstVol.extend((volParams['apparentsize'] + 511) / 512)
- # Change destination volume metadata back to the original size.
- dstVol.setSize(volParams['size'])
- except se.StorageException, e:
- self.log.error("Unexpected error", exc_info=True)
- raise
- except Exception, e:
- self.log.error("Unexpected error", exc_info=True)
- raise se.DestImageActionError(imgUUID, dstSdUUID, str(e))
+ return {'srcChain':srcChain, 'dstChain':dstChain}
- # Do the actual copy
- try:
+ def _interImagesCopy(self, destDom, srcSdUUID, imgUUID, chains):
+ srcLeafVol = chains['srcChain'][-1]
+ dstLeafVol = chains['dstChain'][-1]
+ try:
+ # Prepare the whole chains before the copy
+ srcLeafVol.prepare(rw=False)
+ dstLeafVol.prepare(rw=True, chainrw=True, setrw=True)
+ except Exception, e:
+ self.log.error("Unexpected error", exc_info=True)
+ # teardown volumes
+ self.__cleanupMove(srcLeafVol, dstLeafVol)
+ raise
+
+ try:
+ for srcVol in chains['srcChain']:
+ # Do the actual copy
try:
+ dstVol = destDom.produceVolume(imgUUID=imgUUID, volUUID=srcVol.volUUID)
srcSize = srcVol.getVolumeSize(bs=1)
- # Prepare relevant volumes before copy and teardown after that
- srcVol.prepare(rw=False, justme=True)
- dstVol.prepare(rw=True, justme=True, setrw=True)
misc.ddWatchCopy(srcVol.getVolumePath(), dstVol.getVolumePath(), vars.task.aborting, self.idle, size=srcSize)
- # In case of copying template, we should set the destination volume
- # as SHARED (after copy because otherwise prepare as RW would fail)
- if srcVol.isShared():
- dstVol.setShared()
- elif srcVol.isInternal():
- dstVol.setInternal()
- except se.ActionStopped, e:
- raise e
- except se.StorageException, e:
+ except se.ActionStopped:
+ raise
+ except se.StorageException:
self.log.error("Unexpected error", exc_info=True)
raise
except Exception, e:
self.log.error("Unexpected error", exc_info=True)
- raise se.CopyImageError("image=%s, src domain=%s, dst domain=%s: msg %s" % (imgUUID, srcSdUUID, dstSdUUID, str(e)))
- finally:
- # teardown volumes
- self.__cleanupMove(srcVol, dstVol)
- srcVol = dstVol = None
+ raise se.CopyImageError("image=%s, src domain=%s, dst domain=%s: msg %s" % (imgUUID, srcSdUUID, destDom.sdUUID, str(e)))
+ finally:
+ # teardown volumes
+ self.__cleanupMove(srcLeafVol, dstLeafVol)
- # only base may have a different parent image
- pimg = imgUUID
+ def _finalizeDestinationImage(self, destDom, imgUUID, chains, force):
+ for srcVol in chains['srcChain']:
+ try:
+ dstVol = destDom.produceVolume(imgUUID=imgUUID, volUUID=srcVol.volUUID)
+ # In case of copying template, we should set the destination volume
+ # as SHARED (after copy because otherwise prepare as RW would fail)
+ if srcVol.isShared():
+ dstVol.setShared()
+ elif srcVol.isInternal():
+ dstVol.setInternal()
+ except se.StorageException:
+ self.log.error("Unexpected error", exc_info=True)
+ raise
+ except Exception, e:
+ self.log.error("Unexpected error", exc_info=True)
+ raise se.DestImageActionError(imgUUID, destDom.sdUUID, str(e))
if force:
+ leafVol = chains['dstChain'][-1]
# Now we should re-link all deleted hardlinks, if exists
- self.__templateRelink(dstSdUUID, imgUUID, leafVol.volUUID)
+ self.__templateRelink(destDom.sdUUID, imgUUID, leafVol.volUUID)
# At this point we successfully finished the 'copy' part of the operation
# and we can clear all recoveries.
vars.task.clearRecoveries()
+
+ def _removeImage(self, sdUUID, imgUUID, postZero, force):
+ try:
+ self.delete(sdUUID, imgUUID, postZero, force)
+ except se.StorageException:
+ self.log.error("Unexpected error", exc_info=True)
+ raise
+ except Exception, e:
+ self.log.error("Unexpected error", exc_info=True)
+ raise se.ImageDeleteError("%s: %s" % (imgUUID), str(e))
+
+ def move(self, srcSdUUID, dstSdUUID, imgUUID, vmUUID, op, postZero, force):
+ """
+ Move/Copy image between storage domains within same storage pool
+ """
+ self.log.info("srcSdUUID=%s dstSdUUID=%s "\
+ "imgUUID=%s vmUUID=%s op=%s force=%s postZero=%s",
+ srcSdUUID, dstSdUUID, imgUUID, vmUUID, OP_TYPES[op], str(force), str(postZero))
+
+ destDom = SDF.produce(dstSdUUID)
+ # If image already exists check whether it illegal/fake, overwrite it
+ if not self.isLegal(destDom.sdUUID, imgUUID):
+ force = True
+ # We must first remove the previous instance of image (if exists)
+ # in destination domain, if we got the overwrite command
+ if force:
+ self.log.info("delete image %s on domain %s before overwriting", imgUUID, destDom.sdUUID)
+ self._removeImage(destDom.sdUUID, imgUUID, postZero, force=True)
+
+ chains = self._createTargetImage(destDom, srcSdUUID, imgUUID)
+ self._interImagesCopy(destDom, srcSdUUID, imgUUID, chains)
+ self._finalizeDestinationImage(destDom, imgUUID, chains, force)
# If it's 'move' operation, we should delete src image after copying
if op == MOVE_OP:
- try:
- self.delete(srcSdUUID, imgUUID, postZero, force=True)
- except se.StorageException, e:
- self.log.error("Unexpected error", exc_info=True)
- raise
- except Exception, e:
- self.log.error("Unexpected error", exc_info=True)
- raise se.ImageDeleteError("%s: %s" % (imgUUID), str(e))
+ self._removeImage(srcSdUUID, imgUUID, postZero, force=True)
self.log.info("%s task on image %s was successfully finished", OP_TYPES[op], imgUUID)
return True
diff --git a/vdsm/storage/resourceFactories.py b/vdsm/storage/resourceFactories.py
index ce3ec70..4836217 100644
--- a/vdsm/storage/resourceFactories.py
+++ b/vdsm/storage/resourceFactories.py
@@ -16,10 +16,7 @@ import storage_exception as se
from sdf import StorageDomainFactory as SDF
import sd
import image
-
-LVM_ACTIVATION_NAMESPACE = 'lvmActivationNS'
-IMAGE_NAMESPACE = 'imageNS'
-VOLUME_NAMESPACE = 'volumeNS'
+from constants import VOLUME_NAMESPACE
rmanager = rm.ResourceManager.getInstance()
diff --git a/vdsm/storage/sd.py b/vdsm/storage/sd.py
index 325da5d..4cdaef9 100644
--- a/vdsm/storage/sd.py
+++ b/vdsm/storage/sd.py
@@ -17,7 +17,7 @@ from glob import glob
import storage_exception as se
import misc
import resourceFactories
-from resourceFactories import IMAGE_NAMESPACE, VOLUME_NAMESPACE
+from constants import IMAGE_NAMESPACE, VOLUME_NAMESPACE
import resourceManager as rm
import constants
import safelease
diff --git a/vdsm/storage/spm.py b/vdsm/storage/spm.py
index b186d39..6ed480b 100644
--- a/vdsm/storage/spm.py
+++ b/vdsm/storage/spm.py
@@ -36,7 +36,7 @@ import logging
import storage_exception as se
from threadLocal import vars
from storageConstants import STORAGE
-from resourceFactories import IMAGE_NAMESPACE
+from constants import IMAGE_NAMESPACE
import resourceManager as rm
from contextlib import nested
import fileUtils
diff --git a/vdsm/storage/storage_exception.py b/vdsm/storage/storage_exception.py
index b1cbcdf..c9df109 100644
--- a/vdsm/storage/storage_exception.py
+++ b/vdsm/storage/storage_exception.py
@@ -274,7 +274,7 @@ class ImageValidationError(StorageException):
class ImageDeleteError(StorageException):
code = 256
- message = "Could not remove all files"
+ message = "Could not remove all image's volumes"
#REMOVED in 2.3.
#This class was not in use in 2.2 nor in 2.3.
diff --git a/vdsm/storage/volume.py b/vdsm/storage/volume.py
index 123ed37..0052e84 100644
--- a/vdsm/storage/volume.py
+++ b/vdsm/storage/volume.py
@@ -21,8 +21,9 @@ import misc
import fileUtils
import task
from threadLocal import vars
-import resourceFactories
import resourceManager as rm
+from constants import IMAGE_NAMESPACE
+
rmanager = rm.ResourceManager.getInstance()
@@ -150,7 +151,7 @@ class Volume:
cls.log.info("sdUUID=%s srcImg=%s srcVol=%s dstFormat=%s srcParent=%s",
sdUUID, srcImg, srcVol, dstFormat, srcParent)
- imageResourcesNamespace = sd.getNamespace(sdUUID, resourceFactories.IMAGE_NAMESPACE)
+ imageResourcesNamespace = sd.getNamespace(sdUUID, IMAGE_NAMESPACE)
with rmanager.acquireResource(imageResourcesNamespace, srcImg, rm.LockType.exclusive):
try:
vol = SDF.produce(sdUUID).produceVolume(imgUUID=srcImg, volUUID=srcVol)
12 years, 8 months
[NEW PATCH] BZ#705058 - Don't start monitoring domains when reconstructing master (via gerrit-bot)
by Yotam Oron
New patch submitted by Yotam Oron (yoron(a)redhat.com)
You can review this change at: http://gerrit.usersys.redhat.com/634
commit c4bac51ca8afabd41144097bed81068e76b75f44
Author: Yotam Oron <yoron(a)redhat.com>
Date: Mon Jun 27 15:22:39 2011 +0300
BZ#705058 - Don't start monitoring domains when reconstructing master
During master recostruction there is no point in updating the repo stats
monitoring threads (this is cause a repo stats thread reference not to
be inserted to the list of monitoring threads and hence it leaks)
Change-Id: I05914b8c3a8f304e0acda5463e1ad00630c3233b
diff --git a/vdsm/storage/sp.py b/vdsm/storage/sp.py
index c377ee4..543984c 100644
--- a/vdsm/storage/sp.py
+++ b/vdsm/storage/sp.py
@@ -1156,7 +1156,6 @@ class StoragePool:
del domDict[sdUUID]
self.setMetaParam(PMDK_DOMAINS, domDict)
self.log.info("Set storage pool domains: %s", domDict)
- self.updateMonitoringThreads()
if refresh:
self.refresh()
12 years, 8 months
[NEW PATCH] BZ#716692 Report the real gateway for the networks (via gerrit-bot)
by Dan Kenigsberg
New patch submitted by Dan Kenigsberg (danken(a)redhat.com)
You can review this change at: http://gerrit.usersys.redhat.com/631
commit 0c4496b13119f7480843e4a2daff90d614b1f26d
Author: Federico Simoncelli <fsimonce(a)redhat.com>
Date: Tue Jun 28 14:00:31 2011 +0000
BZ#716692 Report the real gateway for the networks
Change-Id: Ifcafa3617bcab3a720f229bfce45d49c9109b37d
diff --git a/vdsm/netinfo.py b/vdsm/netinfo.py
index d2d0795..c26bc25 100644
--- a/vdsm/netinfo.py
+++ b/vdsm/netinfo.py
@@ -131,6 +131,33 @@ def getVlanBondingNic(bridge):
nics = [iface]
return vlan, bonding, nics
+def intToAddress(ip_num):
+ "Convert an integer to the corresponding ip address in the dot-notation"
+ ip_address = []
+
+ for i in xrange(4):
+ ip_num, ip_val = divmod(ip_num, 256)
+ ip_address.append(str(ip_val))
+
+ return '.'.join(ip_address)
+
+def getRoutes():
+ """Return the interface gateway or None if not found."""
+
+ gateways = dict()
+
+ with open("/proc/net/route") as route_file:
+ head = route_file.readline()
+
+ for route_line in route_file.xreadlines():
+ route_parm = route_line.rstrip().split('\t')
+
+ if route_parm[2] != '00000000':
+ ip_num = int(route_parm[2], 16)
+ gateways[route_parm[0]] = intToAddress(ip_num)
+
+ return gateways
+
def getIfaceCfg(iface):
d = {}
try:
@@ -161,11 +188,13 @@ def permAddr():
def get():
d = {}
ifaces = ifconfig()
+ routes = getRoutes()
# FIXME handle bridge/nic missing from ifconfig
d['networks'] = dict([ (bridge, {'ports': ports(bridge),
'stp': bridge_stp_state(bridge),
'addr': ifaces[bridge]['addr'],
'netmask': ifaces[bridge]['netmask'],
+ 'gateway': routes.get(bridge, '0.0.0.0'),
'cfg': getIfaceCfg(bridge)})
for bridge in bridges() ])
d['nics'] = dict([ (nic, {'speed': speed(nic),
12 years, 9 months
[NEW PATCH] BZ#716962 logrotate: compress logs using the xz format (via gerrit-bot)
by Dan Kenigsberg
New patch submitted by Dan Kenigsberg (danken(a)redhat.com)
You can review this change at: http://gerrit.usersys.redhat.com/632
commit f7d79ce0791e8cb8281b0d5974c2667ce2b38c49
Author: Federico Simoncelli <fsimonce(a)redhat.com>
Date: Tue Jun 28 14:12:04 2011 +0000
BZ#716962 logrotate: compress logs using the xz format
Change-Id: I736c5e625e4d4fba8d5d7d220ee86df9f01cd7fb
diff --git a/vdsm/vdsm-logrotate b/vdsm/vdsm-logrotate
index 4c84d7e..efa9e09 100755
--- a/vdsm/vdsm-logrotate
+++ b/vdsm/vdsm-logrotate
@@ -7,7 +7,6 @@ if [ $EXITVALUE != 0 ]; then
/usr/bin/logger -t logrotate "ALERT exited abnormally with [$EXITVALUE]"
fi
-/usr/bin/find /var/log/core -type f -name '*gz' -mtime +7 -exec /bin/rm -f '{}' \;
EXITVALUE=$?
if [ $EXITVALUE != 0 ]; then
/usr/bin/logger -t logrotate "ALERT clean old core files exited abnormally with [$EXITVALUE]"
diff --git a/vdsm/vdsm-logrotate.conf b/vdsm/vdsm-logrotate.conf
index 2962ce3..12e16ad 100644
--- a/vdsm/vdsm-logrotate.conf
+++ b/vdsm/vdsm-logrotate.conf
@@ -4,12 +4,21 @@
copytruncate
size 15M
compress
+ compresscmd /usr/bin/xz
+ uncompresscmd /usr/bin/unxz
+ compressext .xz
}
/var/log/core/*.dump {
rotate 1
missingok
size 0
compress
+ compresscmd /usr/bin/xz
+ uncompresscmd /usr/bin/unxz
+ compressext .xz
+}
+/var/log/core/*.dump.xz {
+ maxage 7
}
/var/log/libvirtd*.log {
rotate 100
@@ -17,4 +26,7 @@
copytruncate
size 15M
compress
+ compresscmd /usr/bin/xz
+ uncompresscmd /usr/bin/unxz
+ compressext .xz
}
12 years, 9 months
[NEW PATCH] BZ#717658 - Remove StorageDomainCache.invalidate(). (via gerrit-bot)
by ewarszaw@redhat.com
New patch submitted by Eduardo Warszawski (ewarszaw(a)redhat.com)
You can review this change at: http://gerrit.usersys.redhat.com/639
commit de0a772b1b35618ad2d41fece354859039663d8e
Author: Eduardo Warszawski <ewarszaw(a)redhat.com>
Date: Thu Jun 30 06:09:56 2011 +0300
BZ#717658 - Remove StorageDomainCache.invalidate().
Change-Id: If6ee4fb5bd115d258c3027fe5e810f21e138985e
diff --git a/vdsm/storage/sdc.py b/vdsm/storage/sdc.py
index 0ed34e5..1a8a3fa 100644
--- a/vdsm/storage/sdc.py
+++ b/vdsm/storage/sdc.py
@@ -45,13 +45,6 @@ class StorageDomainCache:
multipath.rescan()
lvm.updateLvmConf()
self.storageStale = False
- self.invalidate()
-
- def invalidate(self):
- """
- """
- # TODO : Remove all calls to this
- pass
def _getDomainFromCache(self, sdUUID):
try:
12 years, 9 months
[NEW PATCH] BZ#717658 - Remove unnecessary SDF.refreshStorage(). (via gerrit-bot)
by ewarszaw@redhat.com
New patch submitted by Eduardo Warszawski (ewarszaw(a)redhat.com)
You can review this change at: http://gerrit.usersys.redhat.com/636
commit 7e8dc5a4bef64a1a5861d782e91ed0d09da2deb2
Author: Eduardo Warszawski <ewarszaw(a)redhat.com>
Date: Wed Jun 29 18:52:31 2011 +0300
BZ#717658 - Remove unnecessary SDF.refreshStorage().
Change-Id: I7de05de83f17a14895c150c331e971f35d7ae547
diff --git a/vdsm/storage/hsm.py b/vdsm/storage/hsm.py
index 2aaf822..ab5a59d 100644
--- a/vdsm/storage/hsm.py
+++ b/vdsm/storage/hsm.py
@@ -747,7 +747,7 @@ class HSM:
:param guid: The GUID of the device you want to get info on.
:type guid: UUID
- :param options: ?
+ :param options: ? DEPRECATED
:returns: Dict of all the info on the device.
:rtype: dict
@@ -756,15 +756,6 @@ class HSM:
"""
vars.task.setDefaultException(se.BlockDeviceActionError("GUID: %s" % str(guid)))
#getSharedLock(connectionsResource...)
- rescan = True
- try:
- if options:
- rescan = options.get("rescan", True)
- except:
- self.log.warning("ignore options %s" % (str(options)))
- if rescan:
- SDF.refreshStorage()
-
try:
devInfo = self._getDeviceList(guids=[guid])[0]
for p in devInfo["pathstatus"]:
12 years, 9 months
[NEW PATCH] BZ#716705 refuse to start VMs with "unknown" host osname (via gerrit-bot)
by Dan Kenigsberg
New patch submitted by Dan Kenigsberg (danken(a)redhat.com)
You can review this change at: http://gerrit.usersys.redhat.com/635
commit 3b75da8c26d6c3cf56dfb3e4397fd1d188b94df6
Author: Dan Kenigsberg <danken(a)redhat.com>
Date: Sun Jun 26 16:54:41 2011 +0300
BZ#716705 refuse to start VMs with "unknown" host osname
If, due to misconfiguration, the host os is not recognizable, refuse to
start new VMs as the os name should be passed to the guest bios.
Change-Id: Ia41ef922d2393acb9b62ff8daed9974f2eb79b4d
diff --git a/vdsm/clientIF.py b/vdsm/clientIF.py
index 7758a8a..c1219e4 100644
--- a/vdsm/clientIF.py
+++ b/vdsm/clientIF.py
@@ -614,6 +614,11 @@ class clientIF:
vmParams['vmId'])
vmParams['volatileFloppy'] = True
+ if caps.osversion()['name'] == caps.OSName.UNKNOWN:
+ return {'status': {'code': errCode['createErr']
+ ['status']['code'],
+ 'message': 'Unknown host operating system'}}
+
if 'sysprepInf' in vmParams:
if not self._createSysprepFloppyFromInf(vmParams['sysprepInf'],
vmParams['floppy']):
12 years, 9 months
[NEW PATCH] Related to BZ#712106 - Get rid of redundant instance of rmanager (via gerrit-bot)
by Igor Lvovsky
New patch submitted by Igor Lvovsky (ilvovsky(a)redhat.com)
You can review this change at: http://gerrit.usersys.redhat.com/629
commit f51d3c58f64c2cbc7db39e1dd91788fc038c8a1a
Author: Igor Lvovsky <ilvovsky(a)redhat.com>
Date: Tue Jun 21 13:57:38 2011 +0300
Related to BZ#712106 - Get rid of redundant instance of rmanager
Change-Id: I4ac15a45e0716a78be24b322e0a2b6d4d6035d3d
diff --git a/vdsm/storage/spm.py b/vdsm/storage/spm.py
index 085d03b..b186d39 100644
--- a/vdsm/storage/spm.py
+++ b/vdsm/storage/spm.py
@@ -40,9 +40,9 @@ from resourceFactories import IMAGE_NAMESPACE
import resourceManager as rm
from contextlib import nested
import fileUtils
-from resourceManager import ResourceManager, LockType
from processPool import Timeout
-rmanager = ResourceManager.getInstance()
+
+rmanager = rm.ResourceManager.getInstance()
# Global operation definitions
NOOP = 1
@@ -122,8 +122,6 @@ class Secure:
raise se.SpmStatusError(self.name)
-rmanager = rm.ResourceManager.getInstance()
-
class SPM:
"""
A class to manage a storage pool.
@@ -352,7 +350,7 @@ class SPM:
return {"upgradeStatus" : "started"}
def _upgradePool(self, spUUID, targetDomVersion):
- with rmanager.acquireResource(STORAGE, "upgrade_" + spUUID, LockType.exclusive):
+ with rmanager.acquireResource(STORAGE, "upgrade_" + spUUID, rm.LockType.exclusive):
if len(self._domainsToUpgrade) > 0:
raise se.PoolUpgradeInProgress(spUUID)
@@ -361,7 +359,7 @@ class SPM:
masterDom = pool.getMasterDomain()
sdUUID = masterDom.sdUUID
self.log.info("Trying to upgrade master domain `%s`", sdUUID)
- with rmanager.acquireResource(STORAGE, masterDom.sdUUID, LockType.exclusive):
+ with rmanager.acquireResource(STORAGE, masterDom.sdUUID, rm.LockType.exclusive):
masterDom.upgrade(targetDomVersion)
self.log.debug("Marking all domains for upgrade")
@@ -401,8 +399,8 @@ class SPM:
self.log.error("Error while preparing domain `%s` upgrade", sdUUID, exc_info=True)
return
- with rmanager.acquireResource(STORAGE, "upgrade_" + sdUUID, LockType.exclusive):
- with rmanager.acquireResource(STORAGE, sdUUID, LockType.exclusive):
+ with rmanager.acquireResource(STORAGE, "upgrade_" + sdUUID, rm.LockType.exclusive):
+ with rmanager.acquireResource(STORAGE, sdUUID, rm.LockType.exclusive):
if sdUUID not in self._domainsToUpgrade:
return
@@ -623,7 +621,7 @@ class SPM:
"""
Stop SPM
"""
- with rmanager.acquireResource(STORAGE, "upgrade_" + spUUID, LockType.exclusive):
+ with rmanager.acquireResource(STORAGE, "upgrade_" + spUUID, rm.LockType.exclusive):
domains = self._domainsToUpgrade
try:
sp.StatsThread.onDomainConnectivityStateChange.unregister(self._upgradePoolDomain)
@@ -640,7 +638,7 @@ class SPM:
res.release()
for sdUUID in domains:
- req = rmanager.registerResource(STORAGE, "upgrade_" + sdUUID, LockType.exclusive, partial(cancelUpgrade, sdUUID))
+ req = rmanager.registerResource(STORAGE, "upgrade_" + sdUUID, rm.LockType.exclusive, partial(cancelUpgrade, sdUUID))
requests.append(req)
for req in requests:
12 years, 9 months