@@ -32,7 +32,21 @@ def getCephPoolsCapacity():
3232 crush_rule = pool .crush_rule
3333 else :
3434 crush_rule = pool .crush_ruleset
35- poolCapacity = CephPoolCapacity (pool .pool_name , pool .size , crush_rule )
35+
36+ if pool .type == 1 :
37+ poolCapacity = CephPoolCapacity (pool .pool_name , pool .size , crush_rule )
38+ elif pool .type == 3 :
39+ prof = shell .call ('ceph osd erasure-code-profile get %s -f json' % pool .erasure_code_profile )
40+ jprof = jsonobject .loads (prof )
41+ if not jprof .k or not jprof .m :
42+ raise Exception ('unexpected erasure-code-profile for pool: %s' % pool .pool_name )
43+ k = int (jprof .k )
44+ m = int (jprof .m )
45+ r = float (k + m )/ k
46+ poolCapacity = CephPoolCapacity (pool .pool_name , pool .size , crush_rule , r )
47+ else :
48+ raise Exception ("unexpected pool type: %s:%d" % (pool .pool_name , pool .type ))
49+
3650 result .append (poolCapacity )
3751
3852 # fill crushRuleItemName
@@ -119,21 +133,24 @@ def findAllChilds(node):
119133 poolCapacity .availableCapacity = poolCapacity .availableCapacity + osd .kb_avail * 1024
120134 poolCapacity .usedCapacity = poolCapacity .usedCapacity + osd .kb_used * 1024
121135
136+ r = poolCapacity .ecRedundancy if poolCapacity .ecRedundancy else poolCapacity .replicatedSize
137+
122138 if poolCapacity .crushItemOsdsTotalSize != 0 and poolCapacity .replicatedSize != 0 :
123- poolCapacity .poolTotalSize = poolCapacity .crushItemOsdsTotalSize / poolCapacity . replicatedSize
139+ poolCapacity .poolTotalSize = poolCapacity .crushItemOsdsTotalSize / r
124140 if poolCapacity .availableCapacity != 0 and poolCapacity .replicatedSize != 0 :
125- poolCapacity .availableCapacity = poolCapacity .availableCapacity / poolCapacity . replicatedSize
141+ poolCapacity .availableCapacity = poolCapacity .availableCapacity / r
126142 if poolCapacity .usedCapacity != 0 and poolCapacity .replicatedSize != 0 :
127- poolCapacity .usedCapacity = poolCapacity .usedCapacity / poolCapacity . replicatedSize
143+ poolCapacity .usedCapacity = poolCapacity .usedCapacity / r
128144
129145 return result
130146
131147
132148class CephPoolCapacity :
133149
134- def __init__ (self , poolName , replicatedSize , crushRuleSet ):
150+ def __init__ (self , poolName , replicatedSize , crushRuleSet , ecRedundancy = None ):
135151 self .poolName = poolName
136152 self .replicatedSize = replicatedSize
153+ self .ecRedundancy = ecRedundancy
137154 self .crushRuleSet = crushRuleSet
138155 self .availableCapacity = 0
139156 self .usedCapacity = 0
0 commit comments