From 14b89a938909fc774ff72366ed5b43ed644b1977 Mon Sep 17 00:00:00 2001 From: Patrick Donnelly Date: Tue, 25 Mar 2025 13:49:13 -0400 Subject: [PATCH] qa/tasks/radosbench: add auth_exit_on_failure arg To cause `rados bench` to exit immediately when an auth failure occurs. Signed-off-by: Patrick Donnelly (cherry picked from commit 2f5a990c0c359a5160fb464aacfb40ed592b6784) --- qa/tasks/radosbench.py | 80 ++++++++++++++++++++++++++++-------------- 1 file changed, 54 insertions(+), 26 deletions(-) diff --git a/qa/tasks/radosbench.py b/qa/tasks/radosbench.py index d4d16365626..683d5af4893 100644 --- a/qa/tasks/radosbench.py +++ b/qa/tasks/radosbench.py @@ -6,6 +6,7 @@ import logging from teuthology.orchestra import run from teuthology import misc as teuthology +from teuthology.exceptions import CommandFailedError log = logging.getLogger(__name__) @@ -18,7 +19,9 @@ def task(ctx, config): The config should be as follows: radosbench: + auth_exit_on_failure: clients: [client list] + expected_rc: time: pool: size: write size to use @@ -52,6 +55,8 @@ def task(ctx, config): manager = ctx.managers['ceph'] runtype = config.get('type', 'write') + expected_rc = config.setdefault('expected_rc', 0) + create_pool = config.get('create_pool', True) for role in config.get( 'clients', @@ -84,27 +89,42 @@ def task(ctx, config): pool = manager.create_pool_with_unique_name(erasure_code_profile_name=profile_name) concurrency = config.get('concurrency', 16) + + cmd = [ + 'adjust-ulimits', + 'ceph-coverage', + '{tdir}/archive/coverage', + 'rados', + ] + extra_args = [ + '--no-log-to-stderr', + f'--name={role}', + f'--pool={pool}', + ] + auth_exit_on_failure = config.get('auth_exit_on_failure', None) + if auth_exit_on_failure is not None: + extra_args.append(f'--auth_exit_on_failure={auth_exit_on_failure}') + + bench_args = [ + f'bench', + f'--concurrent-ios={concurrency}', + ] osize = config.get('objectsize', 65536) - if osize == 0: - objectsize = [] - else: - objectsize = ['--object-size', str(osize)] + if osize > 0: + bench_args.append(f'--object-size={osize}') + size = ['-b', str(config.get('size', 65536))] # If doing a reading run then populate data if runtype != "write": proc = remote.run( args=[ "/bin/sh", "-c", - " ".join(['adjust-ulimits', - 'ceph-coverage', - '{tdir}/archive/coverage', - 'rados', - '--no-log-to-stderr', - '--name', role] + - ['-t', str(concurrency)] - + size + objectsize + - ['-p' , pool, - 'bench', str(60), "write", "--no-cleanup" + " ".join([*cmd, + *extra_args, + *bench_args, + str(60), + "write", + "--no-cleanup" ]).format(tdir=testdir), ], logger=log.getChild('radosbench.{id}'.format(id=id_)), @@ -116,17 +136,15 @@ def task(ctx, config): proc = remote.run( args=[ "/bin/sh", "-c", - " ".join(['adjust-ulimits', - 'ceph-coverage', - '{tdir}/archive/coverage', - 'rados', - '--no-log-to-stderr', - '--name', role] + - ['-t', str(concurrency)] - + size + objectsize + - ['-p' , pool, - 'bench', str(config.get('time', 360)), runtype, - ] + write_to_omap + cleanup).format(tdir=testdir), + " ".join([*cmd, + *extra_args, + *bench_args, + *size, + str(config.get('time', 360)), + runtype, + *write_to_omap, + *cleanup, + ]).format(tdir=testdir), ], logger=log.getChild('radosbench.{id}'.format(id=id_)), stdin=run.PIPE, @@ -139,7 +157,17 @@ def task(ctx, config): finally: timeout = config.get('time', 360) * 30 + 300 log.info('joining radosbench (timing out after %ss)', timeout) - run.wait(radosbench.values(), timeout=timeout) + try: + run.wait(radosbench.values(), timeout=timeout) + except CommandFailedError as e: + for p in radosbench.values(): + if p.exitstatus == expected_rc: + pass + else: + raise + else: + if expected_rc != 0: + raise RuntimeError("expected radosbench failure") if pool != 'data' and create_pool: manager.remove_pool(pool) -- 2.39.5