Skip to content

Commit 3ff6f5d

Browse files
author
gitlab
committed
Merge branch 'fix-34935-master' into 'master'
Fix 34935 master See merge request zstackio/zstack-utility!330
2 parents 88c27b8 + 7a46f40 commit 3ff6f5d

File tree

3 files changed

+25
-29
lines changed

3 files changed

+25
-29
lines changed

cephbackupstorage/cephbackupstorage/cephagent.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -426,7 +426,7 @@ def _get_capacity(self):
426426
if not df.pools:
427427
return total, avail, poolCapacities, xsky
428428

429-
pools = ceph.getCephPoolsCapacity(df.pools)
429+
pools = ceph.getCephPoolsCapacity()
430430
if not pools:
431431
return total, avail, poolCapacities, xsky
432432

cephprimarystorage/cephprimarystorage/cephagent.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -291,7 +291,7 @@ def _set_capacity_to_response(self, rsp):
291291
if not df.pools:
292292
return
293293

294-
pools = ceph.getCephPoolsCapacity(df.pools)
294+
pools = ceph.getCephPoolsCapacity()
295295
if not pools:
296296
return
297297

zstacklib/zstacklib/utils/ceph.py

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

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

Comments
 (0)