]> git.apps.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
qa/tasks/radosbench: add auth_exit_on_failure arg
authorPatrick Donnelly <pdonnell@ibm.com>
Tue, 25 Mar 2025 17:49:13 +0000 (13:49 -0400)
committerPatrick Donnelly <pdonnell@ibm.com>
Mon, 22 Sep 2025 16:35:21 +0000 (12:35 -0400)
To cause `rados bench` to exit immediately when an auth failure occurs.

Signed-off-by: Patrick Donnelly <pdonnell@ibm.com>
(cherry picked from commit 2f5a990c0c359a5160fb464aacfb40ed592b6784)

qa/tasks/radosbench.py

index d4d163656260a2b4e3310aebd0acac38b895bfc7..683d5af489367dbcb48e1677b3e1112f43c522c8 100644 (file)
@@ -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: <int>
         clients: [client list]
+        expected_rc: <int>
         time: <seconds to run>
         pool: <pool to use>
         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)