diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-21 11:54:28 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-21 11:54:28 +0000 |
commit | e6918187568dbd01842d8d1d2c808ce16a894239 (patch) | |
tree | 64f88b554b444a49f656b6c656111a145cbbaa28 /qa/tasks/thrash_pool_snaps.py | |
parent | Initial commit. (diff) | |
download | ceph-upstream/18.2.2.tar.xz ceph-upstream/18.2.2.zip |
Adding upstream version 18.2.2.upstream/18.2.2
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'qa/tasks/thrash_pool_snaps.py')
-rw-r--r-- | qa/tasks/thrash_pool_snaps.py | 61 |
1 files changed, 61 insertions, 0 deletions
diff --git a/qa/tasks/thrash_pool_snaps.py b/qa/tasks/thrash_pool_snaps.py new file mode 100644 index 000000000..c71c9ce8d --- /dev/null +++ b/qa/tasks/thrash_pool_snaps.py @@ -0,0 +1,61 @@ +""" +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 = [] + manager = ctx.managers['ceph'] + def remove_snap(): + assert len(snaps) > 0 + snap = random.choice(snaps) + log.info("Removing snap %s" % (snap,)) + for pool in pools: + manager.remove_pool_snap(pool, str(snap)) + snaps.remove(snap) + def add_snap(snap): + log.info("Adding snap %s" % (snap,)) + for pool in pools: + 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() + |