]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
io_exerciser: Improve DataGeneration validation failure error message
authorMatty Williams <Matty.Williams@ibm.com>
Tue, 14 Oct 2025 13:10:34 +0000 (14:10 +0100)
committerMatty Williams <Matty.Williams@ibm.com>
Wed, 25 Mar 2026 14:48:56 +0000 (14:48 +0000)
Added the pool name, test name and test step to the error message.

Fixes: https://tracker.ceph.com/issues/73534
Signed-off-by: Matty Williams <Matty.Williams@ibm.com>
src/common/io_exerciser/DataGenerator.cc
src/common/io_exerciser/DataGenerator.h
src/common/io_exerciser/RadosIo.cc
src/common/io_exerciser/RadosIo.h

index 4e9bc75b55b4b8e6cc82d397a3543cccb8212179..53e5ada06838d5c9cea428bf3e3edacdc39b540d 100644 (file)
@@ -8,6 +8,7 @@
 #include <stdexcept>
 
 #include "ObjectModel.h"
+#include "IoSequence.h"
 #include "common/debug.h"
 #include "common/dout.h"
 #include "fmt/format.h"
@@ -50,7 +51,9 @@ bufferlist DataGenerator::generate_wrong_data(uint64_t offset,
 }
 
 bool DataGenerator::validate(bufferlist& bufferlist, uint64_t offset,
-                             uint64_t length) {
+                             uint64_t length, std::string_view pool,
+                             ceph::io_exerciser::Sequence curseq,
+                             std::unique_ptr<ceph::io_exerciser::IoSequence> seq) {
   return bufferlist.contents_equal(generate_data(offset, length));
 }
 
@@ -212,8 +215,10 @@ HeaderedSeededRandomGenerator::readDateTime(uint64_t block_offset,
   return read_time;
 }
 
-bool HeaderedSeededRandomGenerator::validate(bufferlist& bufferlist,
-                                             uint64_t offset, uint64_t length) {
+bool HeaderedSeededRandomGenerator::validate(bufferlist& bufferlist, uint64_t offset, 
+                                             uint64_t length, std::string_view pool,
+                                             ceph::io_exerciser::Sequence curseq,
+                                             std::unique_ptr<ceph::io_exerciser::IoSequence> seq) {
   std::vector<uint64_t> invalid_block_offsets;
 
   for (uint64_t block_offset = offset; block_offset < offset + length;
@@ -228,7 +233,8 @@ bool HeaderedSeededRandomGenerator::validate(bufferlist& bufferlist,
 
   if (!invalid_block_offsets.empty()) {
     dout(0) << "Miscompare for read of " << m_model.get_primary_oid() <<
-      " offset=" << offset << " length=" << length << dendl;
+      " offset=" << offset << " length=" << length << " in pool " << pool << 
+      ". This occured in test " << curseq << " step " << seq->get_step() << dendl;
     printDebugInformationForOffsets(offset, invalid_block_offsets, bufferlist);
   }
 
index dd99c23fe042f767613cc2f97874fb2c44bd3ca6..59f073dc5706714847b481cc5c1c9d50b95f30e4 100644 (file)
@@ -4,6 +4,7 @@
 #include <random>
 
 #include "ObjectModel.h"
+#include "IoSequence.h"
 #include "include/buffer.h"
 
 /* Overview
@@ -46,7 +47,9 @@ class DataGenerator {
       GenerationType generatorType, const ObjectModel& model);
   virtual bufferlist generate_data(uint64_t length, uint64_t offset) = 0;
   virtual bool validate(bufferlist& bufferlist, uint64_t offset,
-                        uint64_t length);
+                        uint64_t length, std::string_view pool,
+                        ceph::io_exerciser::Sequence curseq,
+                        std::unique_ptr<ceph::io_exerciser::IoSequence> seq);
 
   // Used for testing debug outputs from data generation
   virtual bufferlist generate_wrong_data(uint64_t offset, uint64_t length);
@@ -79,7 +82,8 @@ class HeaderedSeededRandomGenerator : public SeededRandomGenerator {
   bufferptr generate_block(uint64_t offset) override;
   bufferptr generate_wrong_block(uint64_t offset) override;
   bool validate(bufferlist& bufferlist, uint64_t offset,
-                uint64_t length) override;
+                uint64_t length, std::string_view pool, ceph::io_exerciser::Sequence curseq,
+                std::unique_ptr<ceph::io_exerciser::IoSequence> seq) override;
 
  private:
   using UniqueIdBytes = uint64_t;
index 24be675c1843694aa9be0fcad8e8f529bffd1fb0..c39ff421dee0b4e51bbacf16df0694b6e436b12b 100644 (file)
@@ -8,6 +8,7 @@
 #include "DataGenerator.h"
 #include "IoOp.h"
 #include "common/ceph_json.h"
+#include "common/io_exerciser/IoSequence.h"
 #include "common/json/OSDStructures.h"
 #include "librados/librados_asio.h"
 
@@ -46,7 +47,8 @@ RadosIo::RadosIo(librados::Rados& rados, boost::asio::io_context& asio,
                  const std::string& pool, const std::string& primary_oid, const std::string& secondary_oid,
                  uint64_t block_size, int seed, int threads, ceph::mutex& lock,
                  ceph::condition_variable& cond, bool is_replicated_pool,
-                 bool ec_optimizations, bool delete_objects)
+                 bool ec_optimizations, ceph::io_exerciser::Sequence curseq,
+                 std::unique_ptr<ceph::io_exerciser::IoSequence> seq, bool delete_objects)
     : Model(primary_oid, secondary_oid, block_size, delete_objects),
       rados(rados),
       asio(asio),
@@ -57,7 +59,9 @@ RadosIo::RadosIo(librados::Rados& rados, boost::asio::io_context& asio,
       threads(threads),
       lock(lock),
       cond(cond),
-      outstanding_io(0) {
+      outstanding_io(0),
+      curseq(curseq),
+      seq(seq) {
   int rc;
   rc = rados.ioctx_create(pool.c_str(), io);
   ceph_assert(rc == 0);
@@ -260,7 +264,7 @@ void RadosIo::applyReadWriteOp(IoOp& op) {
       ceph_assert(ec == boost::system::errc::success);
       for (int i = 0; i < N; i++) {
         ceph_assert(db->validate(op_info->bufferlist[i], op_info->offset[i],
-                                 op_info->length[i]));
+                                 op_info->length[i], pool, curseq, seq));
       }
       finish_io();
     };
index f44216d138b2ab13cdebe1d648ec0648c60dcf9d..2f19f7a8d8878168d23f0b295691d384897b1537 100644 (file)
@@ -1,6 +1,7 @@
 #pragma once
 
 #include "ObjectModel.h"
+#include "common/io_exerciser/IoSequence.h"
 #include "erasure-code/consistency/ConsistencyChecker.h"
 #include "librados/AioCompletionImpl.h"
 #include "common/ceph_mutex.h"
@@ -37,6 +38,8 @@ class RadosIo : public Model {
   ceph::condition_variable& cond;
   librados::IoCtx io;
   int outstanding_io;
+  ceph::io_exerciser::Sequence curseq;
+  std::unique_ptr<ceph::io_exerciser::IoSequence> seq;
 
   void start_io();
   void finish_io();
@@ -47,7 +50,8 @@ class RadosIo : public Model {
           const std::string& pool, const std::string& primary_oid, const std::string& secondary_oid,
           uint64_t block_size, int seed, int threads, ceph::mutex& lock,
           ceph::condition_variable& cond, bool is_replicated_pool,
-          bool ec_optimizations, bool delete_objects = true);
+          bool ec_optimizations, ceph::io_exerciser::Sequence curseq,
+          std::unique_ptr<ceph::io_exerciser::IoSequence> seq, bool delete_objects = true);
 
   ~RadosIo();