From 0b59b7a68853c7f36e88b476edded8717cedb84d Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Sat, 7 Apr 2018 14:59:57 -0500 Subject: [PATCH] qa/tasks/thrashosds: support merging pgs too Signed-off-by: Sage Weil --- qa/tasks/ceph_manager.py | 41 +++++++++++++++++++++++++++++++++++++++- qa/tasks/thrashosds.py | 2 ++ 2 files changed, 42 insertions(+), 1 deletion(-) diff --git a/qa/tasks/ceph_manager.py b/qa/tasks/ceph_manager.py index 855124567e9..77ad9d46258 100644 --- a/qa/tasks/ceph_manager.py +++ b/qa/tasks/ceph_manager.py @@ -129,7 +129,8 @@ class Thrasher: self.chance_force_recovery = self.config.get('chance_force_recovery', 0.3) num_osds = self.in_osds + self.out_osds - self.max_pgs = self.config.get("max_pgs_per_pool_osd", 1200) * num_osds + self.max_pgs = self.config.get("max_pgs_per_pool_osd", 1200) * len(num_osds) + self.min_pgs = self.config.get("min_pgs_per_pool_osd", 1) * len(num_osds) if self.logger is not None: self.log = lambda x: self.logger.info(x) else: @@ -644,6 +645,19 @@ class Thrasher: self.max_pgs): self.pools_to_fix_pgp_num.add(pool) + def shrink_pool(self): + """ + Decrease the size of the pool + """ + pool = self.ceph_manager.get_pool() + orig_pg_num = self.ceph_manager.get_pool_pg_num(pool) + self.log("Shrinking pool %s" % (pool,)) + if self.ceph_manager.contract_pool( + pool, + self.config.get('pool_shrink_by', 10), + self.min_pgs): + self.pools_to_fix_pgp_num.add(pool) + def fix_pgp_num(self, pool=None): """ Fix number of pgs in pool. @@ -815,6 +829,8 @@ class Thrasher: self.config.get('reweight_osd', .5),)) actions.append((self.grow_pool, self.config.get('chance_pgnum_grow', 0),)) + actions.append((self.shrink_pool, + self.config.get('chance_pgnum_shrink', 0),)) actions.append((self.fix_pgp_num, self.config.get('chance_pgpnum_fix', 0),)) actions.append((self.test_pool_min_size, @@ -1744,6 +1760,29 @@ class CephManager: self.pools[pool_name] = new_pg_num return True + def contract_pool(self, pool_name, by, min_pgs): + """ + Decrease the number of pgs in a pool + """ + with self.lock: + self.log('contract_pool %s by %s min %s' % ( + pool_name, str(by), str(min_pgs))) + assert isinstance(pool_name, basestring) + assert isinstance(by, int) + assert pool_name in self.pools + if self.get_num_creating() > 0: + self.log('too many creating') + return False + proj = self.pools[pool_name] - by + if proj < min_pgs: + self.log('would drop below min_pgs, proj %d, currently %d' % (proj,self.pools[pool_name],)) + return False + self.log("decrease pool size by %d" % (by,)) + new_pg_num = self.pools[pool_name] - by + self.set_pool_property(pool_name, "pg_num", new_pg_num) + self.pools[pool_name] = new_pg_num + return True + def set_pool_pgpnum(self, pool_name, force): """ Set pgpnum property of pool_name pool. diff --git a/qa/tasks/thrashosds.py b/qa/tasks/thrashosds.py index 420b7355908..7af32f0ff95 100644 --- a/qa/tasks/thrashosds.py +++ b/qa/tasks/thrashosds.py @@ -76,6 +76,8 @@ def task(ctx, config): chance_pgnum_grow: (0) chance to increase a pool's size chance_pgpnum_fix: (0) chance to adjust pgpnum to pg for a pool pool_grow_by: (10) amount to increase pgnum by + chance_pgnum_shrink: (0) chance to decrease a pool's size + pool_shrink_by: (10) amount to decrease pgnum by max_pgs_per_pool_osd: (1200) don't expand pools past this size per osd pause_short: (3) duration of short pause -- 2.39.5