From 91b300d12caefa4c8e7881abea9e5145fbbd3b12 Mon Sep 17 00:00:00 2001 From: Samuel Just Date: Wed, 20 May 2015 15:09:18 -0700 Subject: [PATCH] rados/thrash: add test for radosgw with snaps Signed-off-by: Samuel Just --- suites/rados/thrash/workloads/rgw_snaps.yaml | 25 ++++++++ tasks/ceph_manager.py | 18 ++++++ tasks/thrash_pool_snaps.py | 60 ++++++++++++++++++++ 3 files changed, 103 insertions(+) create mode 100644 suites/rados/thrash/workloads/rgw_snaps.yaml create mode 100644 tasks/thrash_pool_snaps.py diff --git a/suites/rados/thrash/workloads/rgw_snaps.yaml b/suites/rados/thrash/workloads/rgw_snaps.yaml new file mode 100644 index 0000000000000..8200cc395cce5 --- /dev/null +++ b/suites/rados/thrash/workloads/rgw_snaps.yaml @@ -0,0 +1,25 @@ +tasks: +- rgw: + default_idle_timeout: 3600 + client.0: null +- thrash_pool_snaps: + pools: + - .rgw.buckets + - .rgw.root + - .rgw.control + - .rgw + - .users.uid + - .users.email + - .users +- s3readwrite: + client.0: + rgw_server: client.0 + readwrite: + bucket: rwtest + readers: 10 + writers: 3 + duration: 300 + files: + num: 10 + size: 2000 + stddev: 500 diff --git a/tasks/ceph_manager.py b/tasks/ceph_manager.py index 5b62d10506298..dbaac4012bf1a 100644 --- a/tasks/ceph_manager.py +++ b/tasks/ceph_manager.py @@ -1137,6 +1137,24 @@ class CephManager: pool_name, str(pg_num)) self.pools[pool_name] = pg_num + def add_pool_snap(self, pool_name, snap_name): + """ + Add pool snapshot + :param pool_name: name of pool to snapshot + :param snap_name: name of snapshot to take + """ + self.raw_cluster_cmd('osd', 'pool', 'mksnap', + str(pool_name), str(snap_name)) + + def remove_pool_snap(self, pool_name, snap_name): + """ + Remove pool snapshot + :param pool_name: name of pool to snapshot + :param snap_name: name of snapshot to remove + """ + self.raw_cluster_cmd('osd', 'pool', 'rmsnap', + str(pool_name), str(snap_name)) + def remove_pool(self, pool_name): """ Remove the indicated pool diff --git a/tasks/thrash_pool_snaps.py b/tasks/thrash_pool_snaps.py new file mode 100644 index 0000000000000..1c3f8f4f92e17 --- /dev/null +++ b/tasks/thrash_pool_snaps.py @@ -0,0 +1,60 @@ +""" +Thrash -- Simulate random osd failures. +""" +import contextlib +import logging +import gevent +import time +import random + + +log = logging.getLogger(__name__) + +@contextlib.contextmanager +def task(ctx, config): + """ + "Thrash" snap creation and removal on the listed pools + + Example: + + thrash_pool_snaps: + pools: [.rgw.buckets, .rgw.buckets.index] + max_snaps: 10 + min_snaps: 5 + period: 10 + """ + stopping = False + def do_thrash(): + pools = config.get('pools', []) + max_snaps = config.get('max_snaps', 10) + min_snaps = config.get('min_snaps', 5) + period = config.get('period', 30) + snaps = [] + def remove_snap(): + assert len(snaps) > 0 + snap = random.choice(snaps) + log.info("Removing snap %s" % (snap,)) + for pool in pools: + ctx.manager.remove_pool_snap(pool, str(snap)) + snaps.remove(snap) + def add_snap(snap): + log.info("Adding snap %s" % (snap,)) + for pool in pools: + ctx.manager.add_pool_snap(pool, str(snap)) + snaps.append(snap) + index = 0 + while not stopping: + index += 1 + time.sleep(period) + if len(snaps) <= min_snaps: + add_snap(index) + elif len(snaps) >= max_snaps: + remove_snap() + else: + random.choice([lambda: add_snap(index), remove_snap])() + log.info("Stopping") + thread = gevent.spawn(do_thrash) + yield + stopping = True + thread.join() + -- 2.39.5