Eduardo has uploaded a new change for review.
Change subject: getAllVolumes returns partially deleted volumes too.
......................................................................
getAllVolumes returns partially deleted volumes too.
getAllVolumesImages differentiates between legal and remnants.
Added getAllRemnants for garbage detection.
Related to: BZ#905938, BZ#910013, BZ#875708
Change-Id: Ib8514236a5d4793f66709e9daf546fb46047414f
Signed-off-by: Eduardo <ewarszaw(a)redhat.com>
---
M vdsm/storage/blockSD.py
1 file changed, 33 insertions(+), 10 deletions(-)
git pull ssh://gerrit.ovirt.org:29418/vdsm refs/changes/46/12546/1
diff --git a/vdsm/storage/blockSD.py b/vdsm/storage/blockSD.py
index 35282e5..4a00cec 100644
--- a/vdsm/storage/blockSD.py
+++ b/vdsm/storage/blockSD.py
@@ -171,11 +171,15 @@
res[volName]['parent'] = parentVol
if vImg not in res[volName]['imgs']:
res[volName]['imgs'].insert(0, vImg)
- if (parentVol != sd.BLANK_UUID and
- not volName.startswith(
- sd.REMOVED_IMAGE_PREFIX) and
- vImg not in res[parentVol]['imgs']):
- res[parentVol]['imgs'].append(vImg)
+ if parentVol != sd.BLANK_UUID:
+ try:
+ newImg = vImg not in res[parentVol]['imgs']
+ except KeyError:
+ log.warning("Orphan volume %s/%s: img: %s, parent %s",
+ sdUUID, volName, vImg, parentVol)
+ else:
+ if newImg:
+ res[parentVol]['imgs'].append(vImg)
return dict((k, sd.ImgsPar(tuple(v['imgs']), v['parent']))
for k, v in res.iteritems())
@@ -1003,15 +1007,34 @@
zeroImgVolumes(sdUUID, imgUUID, toZero)
self.rmDCImgDir(imgUUID, volsImgs)
- def getAllVolumes(self):
+ def getAllVolumesImages(self):
"""
Return all the images that depend on a volume.
- TODO: rename to getAllVolumeImages.
-
- Return dict {volUUID: ([imgUUID1, imgUUID2], parentUUID)]}.
+ Return dicts:
+ vols = {volUUID: ([imgUUID1, imgUUID2], parentUUID)]}
+ for complete images.
+ remnants (same) for broken imgs, orphan volumes, etc.
"""
- return getAllVolumes(self.sdUUID)
+ vols = {} # The "legal" volumes: not half deleted/removed volumes.
+ remnants = {} # vols belongs to a partially deleted imgs
+ allVols = getAllVolumes(self.sdUUID)
+ for volName, ip in allVols.iteritems():
+ images, parent = ip
+ if (volName.startswith(sd.REMOVED_IMAGE_PREFIX) or
+ ip.imgs[0].startswith(sd.REMOVED_IMAGE_PREFIX)):
+ remnants[volName] = ip
+ else:
+ vols[volName] = ip
+ return vols, remnants
+
+ def getAllVolumes(self):
+ vols, rems = self.getAllVolumesImages()
+ return vols
+
+ def getAllRemnants(self):
+ vols, rems = self.getAllVolumesImages()
+ return rems
def activateVolumes(self, volUUIDs):
"""
--
To view, visit
http://gerrit.ovirt.org/12546
To unsubscribe, visit
http://gerrit.ovirt.org/settings
Gerrit-MessageType: newchange
Gerrit-Change-Id: Ib8514236a5d4793f66709e9daf546fb46047414f
Gerrit-PatchSet: 1
Gerrit-Project: vdsm
Gerrit-Branch: master
Gerrit-Owner: Eduardo <ewarszaw(a)redhat.com>