@@ -18,21 +18,8 @@ def is_sandstone():
1818 return os .path .exists ("/opt/sandstone/bin/sds" )
1919
2020
21- def parseDfPools (pools ):
22- res = {}
23-
24- for pool in pools :
25- if not pool .name : continue
26-
27- st = pool .stats
28- if st and st .bytes_used and st .max_avail :
29- res [pool .name ] = (st .bytes_used , st .max_avail )
30-
31- return res
32-
33- def getCephPoolsCapacity (pools ):
21+ def getCephPoolsCapacity ():
3422 result = []
35- poolDfDict = parseDfPools (pools )
3623
3724 o = shell .call ('ceph osd dump -f json' )
3825 df = jsonobject .loads (o )
@@ -45,7 +32,21 @@ def getCephPoolsCapacity(pools):
4532 crush_rule = pool .crush_rule
4633 else :
4734 crush_rule = pool .crush_ruleset
48- 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+
4950 result .append (poolCapacity )
5051
5152 # fill crushRuleItemName
@@ -132,29 +133,24 @@ def findAllChilds(node):
132133 poolCapacity .availableCapacity = poolCapacity .availableCapacity + osd .kb_avail * 1024
133134 poolCapacity .usedCapacity = poolCapacity .usedCapacity + osd .kb_used * 1024
134135
136+ r = poolCapacity .ecRedundancy if poolCapacity .ecRedundancy else poolCapacity .replicatedSize
137+
135138 if poolCapacity .crushItemOsdsTotalSize != 0 and poolCapacity .replicatedSize != 0 :
136- poolCapacity .poolTotalSize = poolCapacity .crushItemOsdsTotalSize / poolCapacity . replicatedSize
139+ poolCapacity .poolTotalSize = poolCapacity .crushItemOsdsTotalSize / r
137140 if poolCapacity .availableCapacity != 0 and poolCapacity .replicatedSize != 0 :
138- poolCapacity .availableCapacity = poolCapacity .availableCapacity / poolCapacity . replicatedSize
141+ poolCapacity .availableCapacity = poolCapacity .availableCapacity / r
139142 if poolCapacity .usedCapacity != 0 and poolCapacity .replicatedSize != 0 :
140- poolCapacity .usedCapacity = poolCapacity .usedCapacity / poolCapacity . replicatedSize
143+ poolCapacity .usedCapacity = poolCapacity .usedCapacity / r
141144
142- for poolCapacity in result :
143- try :
144- bytes_used , max_avail = poolDfDict [poolCapacity .poolName ]
145- poolCapacity .usedCapacity = bytes_used
146- poolCapacity .availableCapacity = max_avail
147- poolCapacity .poolTotalSize = max_avail
148- except KeyError :
149- pass
150145 return result
151146
152147
153148class CephPoolCapacity :
154149
155- def __init__ (self , poolName , replicatedSize , crushRuleSet ):
150+ def __init__ (self , poolName , replicatedSize , crushRuleSet , ecRedundancy = None ):
156151 self .poolName = poolName
157152 self .replicatedSize = replicatedSize
153+ self .ecRedundancy = ecRedundancy
158154 self .crushRuleSet = crushRuleSet
159155 self .availableCapacity = 0
160156 self .usedCapacity = 0
0 commit comments