From dd10c836d2953f0d65ed5113cd2d2ac547e4d7d0 Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Tue, 30 Aug 2016 14:13:24 -0400 Subject: [PATCH] os/bluestore: improve failed csum debug output Signed-off-by: Sage Weil --- src/common/Checksummer.h | 6 +++- src/os/bluestore/BlueStore.cc | 10 ++++-- src/os/bluestore/bluestore_types.cc | 12 +++---- src/os/bluestore/bluestore_types.h | 3 +- src/test/objectstore/test_bluestore_types.cc | 33 ++++++++++---------- 5 files changed, 37 insertions(+), 27 deletions(-) diff --git a/src/common/Checksummer.h b/src/common/Checksummer.h index eda44734ebf..6ddbf1d12de 100644 --- a/src/common/Checksummer.h +++ b/src/common/Checksummer.h @@ -156,7 +156,8 @@ public: size_t offset, size_t length, const bufferlist &bl, - const bufferptr& csum_data + const bufferptr& csum_data, + uint64_t *bad_csum=0 ) { assert(length % csum_block_size == 0); bufferlist::const_iterator p = bl.begin(); @@ -172,6 +173,9 @@ public: while (length > 0) { typename Alg::value_t v = Alg::calc(state, csum_block_size, p); if (*pv != v) { + if (bad_csum) { + *bad_csum = v; + } return pos; } ++pv; diff --git a/src/os/bluestore/BlueStore.cc b/src/os/bluestore/BlueStore.cc index 1cb20155b4e..6f28b19a0d3 100644 --- a/src/os/bluestore/BlueStore.cc +++ b/src/os/bluestore/BlueStore.cc @@ -3904,19 +3904,23 @@ int BlueStore::_verify_csum(OnodeRef& o, const bufferlist& bl) const { int bad; - int r = csum_type != bluestore_blob_t::CSUM_NONE ? blob->verify_csum(blob_xoffset, bl, &bad) :0; + uint64_t bad_csum; + int r = csum_type != bluestore_blob_t::CSUM_NONE ? + blob->verify_csum(blob_xoffset, bl, &bad, &bad_csum) :0; if (r < 0) { if (r == -1) { vector pex; blob->map( - blob_xoffset, + bad, blob->get_csum_chunk_size(), [&](uint64_t offset, uint64_t length) { pex.emplace_back(bluestore_pextent_t(offset, length)); }); derr << __func__ << " bad " << blob->get_csum_type_string(blob->csum_type) << "/0x" << std::hex << blob->get_csum_chunk_size() - << " checksum at blob offset 0x" << bad << std::dec + << " checksum at blob offset 0x" << bad + << ", got 0x" << bad_csum << ", expected 0x" + << blob->get_csum_item(bad / blob->get_csum_chunk_size()) << std::dec << ", device location " << pex << ", object " << o->oid << dendl; } else { diff --git a/src/os/bluestore/bluestore_types.cc b/src/os/bluestore/bluestore_types.cc index 97278b8d32c..f61ce43b9d3 100644 --- a/src/os/bluestore/bluestore_types.cc +++ b/src/os/bluestore/bluestore_types.cc @@ -747,7 +747,7 @@ void bluestore_blob_t::calc_csum(uint64_t b_off, const bufferlist& bl) } int bluestore_blob_t::verify_csum(uint64_t b_off, const bufferlist& bl, - int* b_bad_off) const + int* b_bad_off, uint64_t *bad_csum) const { int r = 0; @@ -757,23 +757,23 @@ int bluestore_blob_t::verify_csum(uint64_t b_off, const bufferlist& bl, break; case CSUM_XXHASH32: *b_bad_off = Checksummer::verify( - get_csum_chunk_size(), b_off, bl.length(), bl, csum_data); + get_csum_chunk_size(), b_off, bl.length(), bl, csum_data, bad_csum); break; case CSUM_XXHASH64: *b_bad_off = Checksummer::verify( - get_csum_chunk_size(), b_off, bl.length(), bl, csum_data); + get_csum_chunk_size(), b_off, bl.length(), bl, csum_data, bad_csum); break; case CSUM_CRC32C: *b_bad_off = Checksummer::verify( - get_csum_chunk_size(), b_off, bl.length(), bl, csum_data); + get_csum_chunk_size(), b_off, bl.length(), bl, csum_data, bad_csum); break; case CSUM_CRC32C_16: *b_bad_off = Checksummer::verify( - get_csum_chunk_size(), b_off, bl.length(), bl, csum_data); + get_csum_chunk_size(), b_off, bl.length(), bl, csum_data, bad_csum); break; case CSUM_CRC32C_8: *b_bad_off = Checksummer::verify( - get_csum_chunk_size(), b_off, bl.length(), bl, csum_data); + get_csum_chunk_size(), b_off, bl.length(), bl, csum_data, bad_csum); break; default: r = -EOPNOTSUPP; diff --git a/src/os/bluestore/bluestore_types.h b/src/os/bluestore/bluestore_types.h index 89135ba64d1..5308efcab38 100644 --- a/src/os/bluestore/bluestore_types.h +++ b/src/os/bluestore/bluestore_types.h @@ -567,7 +567,8 @@ struct bluestore_blob_t { /// verify csum: return -EOPNOTSUPP for unsupported checksum type; /// return -1 and valid(nonnegative) b_bad_off for checksum error; /// return 0 if all is well. - int verify_csum(uint64_t b_off, const bufferlist& bl, int* b_bad_off) const; + int verify_csum(uint64_t b_off, const bufferlist& bl, int* b_bad_off, + uint64_t *bad_csum) const; }; WRITE_CLASS_ENCODER(bluestore_blob_t) diff --git a/src/test/objectstore/test_bluestore_types.cc b/src/test/objectstore/test_bluestore_types.cc index 99c919ebb05..cd1e7bf146e 100644 --- a/src/test/objectstore/test_bluestore_types.cc +++ b/src/test/objectstore/test_bluestore_types.cc @@ -522,46 +522,47 @@ TEST(bluestore_blob_t, calc_csum) bluestore_blob_t b; int bad_off; - ASSERT_EQ(0, b.verify_csum(0, bl, &bad_off)); + uint64_t bad_csum; + ASSERT_EQ(0, b.verify_csum(0, bl, &bad_off, &bad_csum)); ASSERT_EQ(-1, bad_off); b.init_csum(csum_type, 3, 24); cout << " value size " << b.get_csum_value_size() << std::endl; b.calc_csum(0, bl); - ASSERT_EQ(0, b.verify_csum(0, bl, &bad_off)); + ASSERT_EQ(0, b.verify_csum(0, bl, &bad_off, &bad_csum)); ASSERT_EQ(-1, bad_off); - ASSERT_EQ(-1, b.verify_csum(0, bl2, &bad_off)); + ASSERT_EQ(-1, b.verify_csum(0, bl2, &bad_off, &bad_csum)); ASSERT_EQ(0, bad_off); - ASSERT_EQ(0, b.verify_csum(0, f, &bad_off)); + ASSERT_EQ(0, b.verify_csum(0, f, &bad_off, &bad_csum)); ASSERT_EQ(-1, bad_off); - ASSERT_EQ(-1, b.verify_csum(8, f, &bad_off)); + ASSERT_EQ(-1, b.verify_csum(8, f, &bad_off, &bad_csum)); ASSERT_EQ(8, bad_off); - ASSERT_EQ(-1, b.verify_csum(16, f, &bad_off)); + ASSERT_EQ(-1, b.verify_csum(16, f, &bad_off, &bad_csum)); ASSERT_EQ(16, bad_off); - ASSERT_EQ(-1, b.verify_csum(0, m, &bad_off)); + ASSERT_EQ(-1, b.verify_csum(0, m, &bad_off, &bad_csum)); ASSERT_EQ(0, bad_off); - ASSERT_EQ(0, b.verify_csum(8, m, &bad_off)); + ASSERT_EQ(0, b.verify_csum(8, m, &bad_off, &bad_csum)); ASSERT_EQ(-1, bad_off); - ASSERT_EQ(-1, b.verify_csum(16, m, &bad_off)); + ASSERT_EQ(-1, b.verify_csum(16, m, &bad_off, &bad_csum)); ASSERT_EQ(16, bad_off); - ASSERT_EQ(-1, b.verify_csum(0, e, &bad_off)); + ASSERT_EQ(-1, b.verify_csum(0, e, &bad_off, &bad_csum)); ASSERT_EQ(0, bad_off); - ASSERT_EQ(-1, b.verify_csum(8, e, &bad_off)); + ASSERT_EQ(-1, b.verify_csum(8, e, &bad_off, &bad_csum)); ASSERT_EQ(8, bad_off); - ASSERT_EQ(0, b.verify_csum(16, e, &bad_off)); + ASSERT_EQ(0, b.verify_csum(16, e, &bad_off, &bad_csum)); ASSERT_EQ(-1, bad_off); b.calc_csum(8, n); - ASSERT_EQ(0, b.verify_csum(0, f, &bad_off)); + ASSERT_EQ(0, b.verify_csum(0, f, &bad_off, &bad_csum)); ASSERT_EQ(-1, bad_off); - ASSERT_EQ(0, b.verify_csum(8, n, &bad_off)); + ASSERT_EQ(0, b.verify_csum(8, n, &bad_off, &bad_csum)); ASSERT_EQ(-1, bad_off); - ASSERT_EQ(0, b.verify_csum(16, e, &bad_off)); + ASSERT_EQ(0, b.verify_csum(16, e, &bad_off, &bad_csum)); ASSERT_EQ(-1, bad_off); - ASSERT_EQ(-1, b.verify_csum(0, bl, &bad_off)); + ASSERT_EQ(-1, b.verify_csum(0, bl, &bad_off, &bad_csum)); ASSERT_EQ(8, bad_off); } } -- 2.39.5