[NEW PATCH] BZ#728381 - Return 'alerts' key for each domain in getStoragePoolInfo query (via gerrit-bot)

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


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

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

commit df103a82ae3f4173750eb616c39a883977da0ac3
Author: Igor Lvovsky <ilvovsky at redhat.com>
Date:   Mon Aug 8 18:05:35 2011 +0300

    BZ#728381 - Return 'alerts' key for each domain in getStoragePoolInfo query
    
    Change-Id: I62f80bfaa2044eab541101de5b2825aa895c5d04

diff --git a/vdsm/storage/blockSD.py b/vdsm/storage/blockSD.py
index 6986f71..fa12fff 100644
--- a/vdsm/storage/blockSD.py
+++ b/vdsm/storage/blockSD.py
@@ -705,7 +705,7 @@ class BlockStorageDomain(sd.StorageDomain):
         """
         """
         vg = lvm.getVG(self.sdUUID)
-        return dict(disktotal=vg.size, diskfree=vg.free)
+        return dict(disktotal=vg.size, diskfree=vg.free, mdavalid=lvm.isMetadataSizeValid(self.sdUUID))
 
     def getAllImages(self):
         """
diff --git a/vdsm/storage/fileSD.py b/vdsm/storage/fileSD.py
index 6219303..713008e 100644
--- a/vdsm/storage/fileSD.py
+++ b/vdsm/storage/fileSD.py
@@ -235,7 +235,7 @@ class FileStorageDomain(sd.StorageDomain):
         Get storage domain statistics
         """
         ##self.log.info("sdUUID=%s", self.sdUUID)
-        stats = {'disktotal':'', 'diskfree':''}
+        stats = {'disktotal':'', 'diskfree':'', 'mdavalid':True}
         try:
             st = self.oop.os.statvfs(self.domaindir)
             stats['disktotal'] = str(st.f_frsize * st.f_blocks)
diff --git a/vdsm/storage/lvm.py b/vdsm/storage/lvm.py
index d2707a2..4035762 100644
--- a/vdsm/storage/lvm.py
+++ b/vdsm/storage/lvm.py
@@ -133,9 +133,11 @@ 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_FIELDS = "uuid,name,attr,size,free,extent_size,extent_count,free_count,tags,vg_mda_size,vg_mda_free"
 LV_FIELDS = "uuid,name,vg_name,attr,size,seg_start_pe,devices,tags"
 
 VG_ATTR_BITS = ("permission", "resizeable", "exported",
@@ -1189,4 +1191,14 @@ def replaceLVTag(vg, lv, deltag, addtag):
     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 b3d699c..6404e3d 100644
--- a/vdsm/storage/sp.py
+++ b/vdsm/storage/sp.py
@@ -1028,6 +1028,7 @@ class StoragePool:
         for item in domDict:
             # Return statistics for active domains only
             stats = {}
+            alerts = []
             if domDict[item] == sd.DOM_ACTIVE_STATUS:
                 try:
                     dom = SDF.produce(item)
@@ -1041,6 +1042,10 @@ class StoragePool:
                     try:
                         stats['disktotal'] = repoStats[item]['disktotal']
                         stats['diskfree'] = repoStats[item]['diskfree']
+                        if not repoStats[item]['mdavalid']:
+                            alerts.append({'code':se.VgMetadataCriticallyFull.code,
+                                           'message':se.VgMetadataCriticallyFull.message})
+                            self.log.warning("VG %s's metadata size exceeded critical size", dom.sdUUID)
                     except KeyError:
                         # We might have been asked to run before the first repoStats cycle was run
                         if item not in self.repostats:
@@ -1054,6 +1059,7 @@ class StoragePool:
                             # Return defaults
                             stats['disktotal'] = ""
                             stats['diskfree'] = ""
+                    stats['alerts'] = alerts
 
             stats['status'] = domDict[item]
             list_and_stats[item] = stats
diff --git a/vdsm/storage/storage_exception.py b/vdsm/storage/storage_exception.py
index 997c9f3..6009429 100644
--- a/vdsm/storage/storage_exception.py
+++ b/vdsm/storage/storage_exception.py
@@ -1144,6 +1144,12 @@ class LogicalVolumeWrongTagError(StorageException):
     code = 612
     message = "Wrong logical volume tag"
 
+class VgMetadataCriticallyFull(StorageException):
+    code = 613
+    message = """Error - The system has reached the 80% 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"""
+
 #################################################
 #  SPM/HSM Exceptions
 #################################################




More information about the vdsm-patches mailing list