[NEW PATCH] Related to BZ#728381 - Add additional 'alert' in getStoragePoolInfo if VG's metadata too small (via gerrit-bot)

Igor Lvovsky ilvovsky at redhat.com
Thu Aug 18 12:53:55 UTC 2011


New patch submitted by Igor Lvovsky (ilvovsky at redhat.com)

You can review this change at: http://gerrit.usersys.redhat.com/809

commit 6a065b9c863dc2bfebfb2e988024d346ac80a54c
Author: Igor Lvovsky <ilvovsky at redhat.com>
Date:   Thu Aug 11 10:41:10 2011 +0300

    Related to BZ#728381 -  Add additional 'alert' in getStoragePoolInfo if VG's metadata too small
    
    Change-Id: Icce978f2a8b059c157256ca6c22db7ef5ee8ab38

diff --git a/vdsm/storage/blockSD.py b/vdsm/storage/blockSD.py
index fa12fff..5c045f3 100644
--- a/vdsm/storage/blockSD.py
+++ b/vdsm/storage/blockSD.py
@@ -48,6 +48,10 @@ log = logging.getLogger("Storage.BlockSD")
 RESERVED_METADATA_SIZE = 40 * (2 ** 20)
 RESERVED_MAILBOX_SIZE = MAILBOX_SIZE * safelease.MAX_HOST_ID
 METADATA_BASE_SIZE = 378
+# VG's min metadata threshold is 20%
+VG_MDA_MIN_THRESHOLD = 0.2
+# VG's metadata size in MiB
+VG_METADATASIZE = 128
 
 MAX_PVS_LIMIT = 10 # BZ#648051
 MAX_PVS = config.getint('irs', 'maximum_allowed_pvs')
@@ -187,6 +191,24 @@ def selectMetadata(sdUUID):
         metadata = TagBasedSDMetadata(sdUUID)
     return metadata
 
+def metadataValidity(vg):
+    """
+    Return the metadata validity:
+     mdathreshold - False if the VG's metadata exceeded its threshold, else True
+     mdavalid - False if the VG's metadata size too small, else True
+    """
+    mdaStatus = {'mdavalid':True, 'mdathreshold':True}
+    mda_size = int(vg.vg_mda_size)
+    mda_free = int(vg.vg_mda_free)
+
+
+    if mda_size < (VG_METADATASIZE * constants.MEGAB)/2:
+        mdaStatus['mdavalid'] = False
+
+    if (mda_size * VG_MDA_MIN_THRESHOLD) > mda_free:
+        mdaStatus['mdathreshold'] = False
+
+    return mdaStatus
 
 class BlockStorageDomain(sd.StorageDomain):
     mountpoint = os.path.join(sd.StorageDomain.storage_repository,
@@ -705,7 +727,11 @@ class BlockStorageDomain(sd.StorageDomain):
         """
         """
         vg = lvm.getVG(self.sdUUID)
-        return dict(disktotal=vg.size, diskfree=vg.free, mdavalid=lvm.isMetadataSizeValid(self.sdUUID))
+        vgMetadataStatus = metadataValidity(vg)
+        return dict(disktotal=vg.size, diskfree=vg.free,
+                    mdasize=vg.vg_mda_size, mdafree=vg.vg_mda_free,
+                    mdavalid=vgMetadataStatus['mdavalid'],
+                    mdathreshold=vgMetadataStatus['mdathreshold'])
 
     def getAllImages(self):
         """
diff --git a/vdsm/storage/fileSD.py b/vdsm/storage/fileSD.py
index 713008e..2a0a0cb 100644
--- a/vdsm/storage/fileSD.py
+++ b/vdsm/storage/fileSD.py
@@ -235,7 +235,8 @@ class FileStorageDomain(sd.StorageDomain):
         Get storage domain statistics
         """
         ##self.log.info("sdUUID=%s", self.sdUUID)
-        stats = {'disktotal':'', 'diskfree':'', 'mdavalid':True}
+        stats = {'disktotal':'', 'diskfree':'', 'mdavalid':True, 'mdathreshold':True,
+                 'mdasize':0, 'mdafree':0}
         try:
             st = self.oop.os.statvfs(self.domaindir)
             stats['disktotal'] = str(st.f_frsize * st.f_blocks)
diff --git a/vdsm/storage/hsm.py b/vdsm/storage/hsm.py
index 5799c8f..2011d42 100644
--- a/vdsm/storage/hsm.py
+++ b/vdsm/storage/hsm.py
@@ -840,7 +840,8 @@ class HSM:
         if size < MINIMALVGSIZE:
            raise se.VolumeGroupSizeError("VG size must be more than %s MiB" % str(MINIMALVGSIZE / constants.MEGAB))
 
-        lvm.createVG(vgname, devices, blockSD.STORAGE_UNREADY_DOMAIN_TAG)
+        lvm.createVG(vgname, devices, blockSD.STORAGE_UNREADY_DOMAIN_TAG,
+                     metadataSize=blockSD.VG_METADATASIZE)
 
         return dict(uuid=lvm.getVG(vgname).uuid)
 
diff --git a/vdsm/storage/lvm.py b/vdsm/storage/lvm.py
index 4035762..6a89aa8 100644
--- a/vdsm/storage/lvm.py
+++ b/vdsm/storage/lvm.py
@@ -133,8 +133,6 @@ log = logging.getLogger("Storage.LVM")
 """
 
 LVM_DEFAULT_TTL = 100
-# VG's min metadata threshold is 20%
-MDA_MIN_THRESHOLD = 0.2
 
 PV_FIELDS = "uuid,name,size,vg_name,vg_uuid,pe_start,pe_count,pe_alloc_count,mda_count,dev_size"
 VG_FIELDS = "uuid,name,attr,size,free,extent_size,extent_count,free_count,tags,vg_mda_size,vg_mda_free"
@@ -692,9 +690,11 @@ def _fqpvname(pv):
         pv = os.path.join(PV_PREFIX, pv)
     return pv
 
-def _initpv(device, withmetadata=False):
-    if withmetadata:
-        cmd = ["pvcreate", "--metadatasize", "128m", device]
+def _initpv(device, metadataSize=0):
+    if metadataSize > 0:
+        # Size for pvcreate should be with units k|m|g
+        metadatasize = str(metadataSize) + 'm'
+        cmd = ["pvcreate", "--metadatasize", metadatasize, device]
     else:
         cmd = ["pvcreate", "--pvmetadatacopies", "0", device]
 
@@ -832,9 +832,9 @@ def getLV(vgName, lvName=None):
 # Public Volume Group interface
 #
 
-def createVG(vgName, devices, initialTag, extentsize="128m"):
+def createVG(vgName, devices, initialTag, metadataSize, extentsize="128m"):
     pvs = [_fqpvname(pdev) for pdev in _normalizeargs(devices)]
-    _initpv(pvs[0], withmetadata=True)
+    _initpv(pvs[0], metadataSize)
     for dev in pvs[1:]:
         _initpv(dev)
 
@@ -1190,15 +1190,3 @@ def replaceLVTag(vg, lv, deltag, addtag):
     _lvminfo._invalidatelvs(vg, lv)
     if rc != 0:
         raise se.LogicalVolumeReplaceTagError("%s/%s" % (vg, lv), "%s,%s" % (deltag, addtag))
-
-def isMetadataSizeValid(vgName):
-    """
-    Return False if the VG's metadata exceeded its threshold else return True
-    """
-    vg = getVG(vgName)
-    mda_size = int(vg.vg_mda_size)
-    mda_free = int(vg.vg_mda_free)
-
-    if mda_size * MDA_MIN_THRESHOLD > mda_free:
-        return False
-    return True
diff --git a/vdsm/storage/sp.py b/vdsm/storage/sp.py
index 6404e3d..c1a5cff 100644
--- a/vdsm/storage/sp.py
+++ b/vdsm/storage/sp.py
@@ -1043,9 +1043,17 @@ class StoragePool:
                         stats['disktotal'] = repoStats[item]['disktotal']
                         stats['diskfree'] = repoStats[item]['diskfree']
                         if not repoStats[item]['mdavalid']:
+                            alerts.append({'code':se.SmallVgMetadata.code,
+                                           'message':se.SmallVgMetadata.message})
+                            self.log.warning("VG %s's metadata size too small %s",
+                                              dom.sdUUID, repoStats[item]['mdasize'])
+
+                        if not repoStats[item]['mdathreshold']:
                             alerts.append({'code':se.VgMetadataCriticallyFull.code,
                                            'message':se.VgMetadataCriticallyFull.message})
-                            self.log.warning("VG %s's metadata size exceeded critical size", dom.sdUUID)
+                            self.log.warning("VG %s's metadata size exceeded critical size: \
+                                             mdasize=%s mdafree=%s", dom.sdUUID,
+                                             repoStats[item]['mdasize'], repoStats[item]['mdafree'])
                     except KeyError:
                         # We might have been asked to run before the first repoStats cycle was run
                         if item not in self.repostats:
diff --git a/vdsm/storage/storage_exception.py b/vdsm/storage/storage_exception.py
index 6009429..e118c55 100644
--- a/vdsm/storage/storage_exception.py
+++ b/vdsm/storage/storage_exception.py
@@ -1145,11 +1145,21 @@ class LogicalVolumeWrongTagError(StorageException):
     message = "Wrong logical volume tag"
 
 class VgMetadataCriticallyFull(StorageException):
+    def __init__(self, vgname, mdasize, mdafree):
+        self.value = "vgname=%s mdasize=%s mdafree=%s" % (vgname, mdasize, mdafree)
     code = 613
-    message = """Error - The system has reached the 80% watermark on the VG metadata area size.
+    message = """Error - The system has reached the high watermark on the VG metadata area size.
                  This is due high number of Vdisks or large Vdisks size allocated on this
                  specific VG. Please call Redhat Global Support to address the issue"""
 
+class SmallVgMetadata(StorageException):
+    def __init__(self, vgname, mdasize, mdafree):
+        self.value = "vgname=%s mdasize=%s mdafree=%s" % (vgname, mdasize, mdafree)
+    code = 614
+    message = """Warning - The allocated VG metadata area size is too small, which might limit
+                 its capacity (the number of Vdisks and/or their size). Refer to GSS knowledge
+                 base to understand the issue and how to resolve it"""
+
 #################################################
 #  SPM/HSM Exceptions
 #################################################




More information about the vdsm-patches mailing list