Skip to content

Commit 7a46f40

Browse files
committed
[BugFix: ZSTACK-34935] handle Ceph EC pool
Signed-off-by: Qun Li <qun.li@zstack.io>
1 parent e52b161 commit 7a46f40

File tree

1 file changed

+22
-5
lines changed

1 file changed

+22
-5
lines changed

zstacklib/zstacklib/utils/ceph.py

Lines changed: 22 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -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

132148
class 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

Comments
 (0)