]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
ceph_test_rados: also send sparse_read in ReadOp
authorKefu Chai <kchai@redhat.com>
Wed, 26 Aug 2015 07:41:13 +0000 (15:41 +0800)
committerKefu Chai <kchai@redhat.com>
Mon, 14 Sep 2015 13:22:34 +0000 (21:22 +0800)
Signed-off-by: Kefu Chai <kchai@redhat.com>
(cherry picked from commit 5ae2e7a185b5f95753a09a89d7110fc38848a083)

Conflicts:
src/test/osd/RadosModel.h
remove the piped-read test

src/test/osd/Object.cc
src/test/osd/Object.h
src/test/osd/RadosModel.h

index c5ff040eaf07310577f40dcb229fe12ada35af7f..68dd2b18c586549a3c8ac0b2c17cbaac0708883c 100644 (file)
@@ -182,3 +182,43 @@ bool ObjectDesc::check(bufferlist &to_check) {
   }
   return true;
 }
+
+bool ObjectDesc::check_sparse(const std::map<uint64_t, uint64_t>& extents,
+                             bufferlist &to_check) {
+  iterator i = begin();
+  bufferlist::iterator p = to_check.begin();
+  uint64_t pos = 0;
+  for (std::map<uint64_t, uint64_t>::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;
+}
index bffb397cfb667af5d564fcd05430938b7ae52c32..feeefebe8dd99782542a3f95aae42897321349fb 100644 (file)
@@ -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<uint64_t, uint64_t>& extends,
+                   bufferlist &to_check);
   const ContDesc &most_recent();
   ContentsGenerator *most_recent_gen() {
     return layers.begin()->first.get();
index 8d6889edb4c1b180c2db077c45a3fbd07e128545..46a936e5996755dfd45207f5b98b8a3d54e88990 100644 (file)
@@ -983,6 +983,8 @@ public:
 
   bufferlist result;
   int retval;
+  std::map<uint64_t, uint64_t> extent_result;
+  bool is_sparse_read;
 
   map<string, bufferlist> 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<string, ContDesc>::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);
       }