]> git.apps.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
osd: add objects_readv_sync
authorxie xingguo <xie.xingguo@zte.com.cn>
Sat, 31 Aug 2019 00:56:21 +0000 (08:56 +0800)
committerxie xingguo <xie.xingguo@zte.com.cn>
Wed, 4 Sep 2019 05:20:53 +0000 (13:20 +0800)
However, this is only meaningful for ReplicatedBackend
since ECBackend is already reading everything in asynchronous way.
Also the osd_verify_sparse_read_holes option could be reliably
dropped as it seems never (ever?) actually get a chance to be
exercised ?

Signed-off-by: xie xingguo <xie.xingguo@zte.com.cn>
src/common/legacy_config_opts.h
src/common/options.cc
src/osd/PGBackend.h
src/osd/PrimaryLogPG.cc
src/osd/ReplicatedBackend.cc
src/osd/ReplicatedBackend.h

index 354475e0a488b93a1f30f5603c68b687ac54c8e1..825548dea049f5aaab2bbafad29269f4877d9f7f 100644 (file)
@@ -755,7 +755,6 @@ OPTION(osd_op_complaint_time, OPT_FLOAT) // how many seconds old makes an op com
 OPTION(osd_command_max_records, OPT_INT)
 OPTION(osd_max_pg_blocked_by, OPT_U32)    // max peer osds to report that are blocking our progress
 OPTION(osd_op_log_threshold, OPT_INT) // how many op log messages to show in one go
-OPTION(osd_verify_sparse_read_holes, OPT_BOOL)  // read fiemap-reported holes and verify they are zeros
 OPTION(osd_backoff_on_unfound, OPT_BOOL)   // object unfound
 OPTION(osd_backoff_on_degraded, OPT_BOOL) // [mainly for debug?] object unreadable/writeable
 OPTION(osd_backoff_on_peering, OPT_BOOL)  // [debug] pg peering
index c90b3296c56569c67136368453d42dbcc810d120..1029d8d5d503df8c37f302140b024b96556654b3 100644 (file)
@@ -3694,10 +3694,6 @@ std::vector<Option> get_global_options() {
     .set_default(5)
     .set_description(""),
 
-    Option("osd_verify_sparse_read_holes", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
-    .set_default(false)
-    .set_description(""),
-
     Option("osd_backoff_on_unfound", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
     .set_default(true)
     .set_description(""),
index bb0be25099ef65c3b5ce9d96df3b360b1aeec3b3..026c3f0a81e02eddc99262e6d8fdd423a9d4f390 100644 (file)
@@ -561,6 +561,14 @@ typedef std::shared_ptr<const OSDMap> OSDMapRef;
      uint32_t op_flags,
      bufferlist *bl) = 0;
 
+   virtual int objects_readv_sync(
+     const hobject_t &hoid,
+     map<uint64_t, uint64_t>& m,
+     uint32_t op_flags,
+     bufferlist *bl) {
+     return -EOPNOTSUPP;
+   }
+
    virtual void objects_read_async(
      const hobject_t &hoid,
      const list<pair<boost::tuple<uint64_t, uint64_t, uint32_t>,
index e5a642c44c9541fbc370aa568e74ebcfb169b0de..ff1f893ae79ad8787ac4812241d98c24659c5d20 100644 (file)
@@ -5366,72 +5366,20 @@ int PrimaryLogPG::do_sparse_read(OpContext *ctx, OSDOp& osd_op) {
       return r;
     }
 
-    map<uint64_t, uint64_t>::iterator miter;
     bufferlist data_bl;
-    uint64_t last = op.extent.offset;
-    for (miter = m.begin(); miter != m.end(); ++miter) {
-      // verify hole?
-      if (cct->_conf->osd_verify_sparse_read_holes &&
-          last < miter->first) {
-        bufferlist t;
-        uint64_t len = miter->first - last;
-        r = pgbackend->objects_read_sync(soid, last, len, op.flags, &t);
-        if (r < 0) {
-          osd->clog->error() << coll << " " << soid
-                            << " sparse-read failed to read: "
-                            << r;
-        } else if (!t.is_zero()) {
-          osd->clog->error() << coll << " " << soid
-                            << " sparse-read found data in hole "
-                            << last << "~" << len;
-        }
-      }
-
-      bufferlist tmpbl;
-      r = pgbackend->objects_read_sync(soid, miter->first, miter->second,
-                                      op.flags, &tmpbl);
-      if (r == -EIO) {
-        r = rep_repair_primary_object(soid, ctx);
-      }
-      if (r < 0) {
-       return r;
-      }
-
-      // this is usually happen when we get extent that exceeds the actual file
-      // size
-      if (r < (int)miter->second)
-        miter->second = r;
-      total_read += r;
-      dout(10) << "sparse-read " << miter->first << "@" << miter->second
-              << dendl;
-      data_bl.claim_append(tmpbl);
-      last = miter->first + r;
-    }
-
-    // verify trailing hole?
-    if (cct->_conf->osd_verify_sparse_read_holes) {
-      uint64_t end = std::min<uint64_t>(op.extent.offset + op.extent.length,
-                                       oi.size);
-      if (last < end) {
-        bufferlist t;
-        uint64_t len = end - last;
-        r = pgbackend->objects_read_sync(soid, last, len, op.flags, &t);
-        if (r < 0) {
-          osd->clog->error() << coll << " " << soid
-                            << " sparse-read failed to read: " << r;
-        } else if (!t.is_zero()) {
-          osd->clog->error() << coll << " " << soid
-                            << " sparse-read found data in hole "
-                            << last << "~" << len;
-        }
-      }
+    r = pgbackend->objects_readv_sync(soid, m, op.flags, &data_bl);
+    if (r == -EIO) {
+      r = rep_repair_primary_object(soid, ctx);
+    }
+    if (r < 0) {
+      return r;
     }
 
     // Why SPARSE_READ need checksum? In fact, librbd always use sparse-read.
     // Maybe at first, there is no much whole objects. With continued use, more
     // and more whole object exist. So from this point, for spare-read add
     // checksum make sense.
-    if (total_read == oi.size && oi.is_data_digest()) {
+    if ((uint64_t)r == oi.size && oi.is_data_digest()) {
       uint32_t crc = data_bl.crc32c(-1);
       if (oi.data_digest != crc) {
         osd->clog->error() << info.pgid << std::hex
@@ -5450,7 +5398,7 @@ int PrimaryLogPG::do_sparse_read(OpContext *ctx, OSDOp& osd_op) {
     encode(m, osd_op.outdata); // re-encode since it might be modified
     ::encode_destructively(data_bl, osd_op.outdata);
 
-    dout(10) << " sparse_read got " << total_read << " bytes from object "
+    dout(10) << " sparse_read got " << r << " bytes from object "
             << soid << dendl;
   }
 
index 88f142e742581ebaf0aaa884ad25165517d95aec..d7cda9543108e18208103bff80569576cc29709c 100644 (file)
@@ -255,6 +255,20 @@ int ReplicatedBackend::objects_read_sync(
   return store->read(ch, ghobject_t(hoid), off, len, *bl, op_flags);
 }
 
+int ReplicatedBackend::objects_readv_sync(
+  const hobject_t &hoid,
+  map<uint64_t, uint64_t>& m,
+  uint32_t op_flags,
+  bufferlist *bl)
+{
+  interval_set<uint64_t> im(m);
+  auto r = store->readv(ch, ghobject_t(hoid), im, *bl, op_flags);
+  if (r >= 0) {
+    im.move_into(m);
+  }
+  return r;
+}
+
 void ReplicatedBackend::objects_read_async(
   const hobject_t &hoid,
   const list<pair<boost::tuple<uint64_t, uint64_t, uint32_t>,
index bd7afa0af4e80839d543248225fdfff27d408306..f70a0501179ccb3b019b58270e5c891dcf6cade1 100644 (file)
@@ -149,6 +149,12 @@ public:
     uint32_t op_flags,
     bufferlist *bl) override;
 
+  int objects_readv_sync(
+    const hobject_t &hoid,
+    map<uint64_t, uint64_t>& m,
+    uint32_t op_flags,
+    bufferlist *bl) override;
+
   void objects_read_async(
     const hobject_t &hoid,
     const list<pair<boost::tuple<uint64_t, uint64_t, uint32_t>,