From: Kefu Chai Date: Wed, 26 Aug 2015 07:41:13 +0000 (+0800) Subject: ceph_test_rados: also send sparse_read in ReadOp X-Git-Tag: v0.94.6~103^2~2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=64b22dcba316bf9ac5598c249e4fba47c157f588;p=ceph.git ceph_test_rados: also send sparse_read in ReadOp Signed-off-by: Kefu Chai (cherry picked from commit 5ae2e7a185b5f95753a09a89d7110fc38848a083) Conflicts: src/test/osd/RadosModel.h remove the piped-read test --- diff --git a/src/test/osd/Object.cc b/src/test/osd/Object.cc index c5ff040eaf0..68dd2b18c58 100644 --- a/src/test/osd/Object.cc +++ b/src/test/osd/Object.cc @@ -182,3 +182,43 @@ bool ObjectDesc::check(bufferlist &to_check) { } return true; } + +bool ObjectDesc::check_sparse(const std::map& extents, + bufferlist &to_check) { + iterator i = begin(); + bufferlist::iterator p = to_check.begin(); + uint64_t pos = 0; + for (std::map::const_iterator extent = extents.begin(); + extent != extents.end(); + ++extent) { + const uint64_t start = extent->first; + const uint64_t end = start + extent->second; + for (; pos < end; ++i, ++pos) { + if (i.end()) { + std::cout << "reached end of iterator first" << std::endl; + return false; + } + if (pos < start) { + // check the hole + if (*i != '\0') { + std::cout << "incorrect buffer at pos " << pos << std::endl; + return false; + } + } else { + // then the extent + if (*i != *p) { + std::cout << "incorrect buffer at pos " << pos << std::endl; + return false; + } + ++p; + } + } + } + uint64_t size = layers.empty() ? 0 : + most_recent_gen()->get_length(most_recent()); + if (pos != size) { + std::cout << "only read " << pos << " out of size " << size << std::endl; + return false; + } + return true; +} diff --git a/src/test/osd/Object.h b/src/test/osd/Object.h index bffb397cfb6..feeefebe8dd 100644 --- a/src/test/osd/Object.h +++ b/src/test/osd/Object.h @@ -358,6 +358,8 @@ public: // takes ownership of gen void update(ContentsGenerator *gen, const ContDesc &next); bool check(bufferlist &to_check); + bool check_sparse(const std::map& extends, + bufferlist &to_check); const ContDesc &most_recent(); ContentsGenerator *most_recent_gen() { return layers.begin()->first.get(); diff --git a/src/test/osd/RadosModel.h b/src/test/osd/RadosModel.h index 8d6889edb4c..46a936e5996 100644 --- a/src/test/osd/RadosModel.h +++ b/src/test/osd/RadosModel.h @@ -983,6 +983,8 @@ public: bufferlist result; int retval; + std::map extent_result; + bool is_sparse_read; map attrs; int attrretval; @@ -1003,9 +1005,10 @@ public: oid(oid), snap(0), retval(0), + is_sparse_read(false), attrretval(0) {} - + void _begin() { context->state_lock.Lock(); @@ -1049,11 +1052,23 @@ public: context->io_ctx.snap_set_read(context->snaps[snap]); } - op.read(0, - !old_value.has_contents() ? 0 : - old_value.most_recent_gen()->get_length(old_value.most_recent()), - &result, - &retval); + uint64_t read_len = 0; + if (old_value.has_contents()) + read_len = old_value.most_recent_gen()->get_length(old_value.most_recent()); + if (rand() % 2) { + is_sparse_read = false; + op.read(0, + read_len, + &result, + &retval); + } else { + is_sparse_read = true; + op.sparse_read(0, + read_len, + &extent_result, + &result, + &retval); + } for (map::iterator i = old_value.attrs.begin(); i != old_value.attrs.end(); @@ -1122,9 +1137,16 @@ public: << ", expected " << old_value.most_recent() << std::endl; context->errors++; } - if (!old_value.check(result)) { - cerr << num << ": oid " << oid << " contents " << to_check << " corrupt" << std::endl; - context->errors++; + if (is_sparse_read) { + if (!old_value.check_sparse(extent_result, result)) { + cerr << num << ": oid " << oid << " contents " << to_check << " corrupt" << std::endl; + context->errors++; + } + } else { + if (!old_value.check(result)) { + cerr << num << ": oid " << oid << " contents " << to_check << " corrupt" << std::endl; + context->errors++; + } } if (context->errors) assert(0); }