]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
ReplicatedPG: use new fiemap interface 14640/head
authorPiotr Dałek <piotr.dalek@corp.ovh.com>
Tue, 18 Apr 2017 14:12:04 +0000 (16:12 +0200)
committerPiotr Dałek <piotr.dalek@corp.ovh.com>
Thu, 20 Apr 2017 15:24:55 +0000 (17:24 +0200)
Reduce memory allocator load during sparse reads and recovery by not
encoding sparse file extents from map into bufferlist, then back again
into map.

Signed-off-by: Piotr Dałek <piotr.dalek@corp.ovh.com>
src/osd/PrimaryLogPG.cc
src/osd/ReplicatedBackend.cc

index 71846caabf80eeb4b8938caa014b71c05cf11023..f5e164d770b5832170a627ed375a67a1ba143dad 100644 (file)
@@ -4429,18 +4429,15 @@ int PrimaryLogPG::do_osd_ops(OpContext *ctx, vector<OSDOp>& ops)
        }
       } else {
        // read into a buffer
-       bufferlist bl;
+        map<uint64_t, uint64_t> m;
         uint32_t total_read = 0;
        int r = osd->store->fiemap(ch, ghobject_t(soid, ghobject_t::NO_GEN,
                                                  info.pgid.shard),
-                                  op.extent.offset, op.extent.length, bl);
+                                  op.extent.offset, op.extent.length, m);
        if (r < 0)  {
          result = r;
           break;
        }
-        map<uint64_t, uint64_t> m;
-        bufferlist::iterator iter = bl.begin();
-        ::decode(m, iter);
         map<uint64_t, uint64_t>::iterator miter;
         bufferlist data_bl;
        uint64_t last = op.extent.offset;
index 1364cc6277025839643bfcbb1d75c6c66250471f..2b6ca917a47fc14e1de553a0f2bd2bbbd0b59751 100644 (file)
@@ -1981,21 +1981,17 @@ int ReplicatedBackend::build_push_op(const ObjectRecoveryInfo &recovery_info,
   if (available > 0) {
     if (!recovery_info.copy_subset.empty()) {
       interval_set<uint64_t> copy_subset = recovery_info.copy_subset;
-      bufferlist bl;
+      map<uint64_t, uint64_t> m;
       int r = store->fiemap(ch, ghobject_t(recovery_info.soid), 0,
-                            copy_subset.range_end(), bl);
+                            copy_subset.range_end(), m);
       if (r >= 0)  {
-        interval_set<uint64_t> fiemap_included;
-        map<uint64_t, uint64_t> m;
-        bufferlist::iterator iter = bl.begin();
-        ::decode(m, iter);
-        map<uint64_t, uint64_t>::iterator miter;
-        for (miter = m.begin(); miter != m.end(); ++miter) {
-          fiemap_included.insert(miter->first, miter->second);
-        }
-
+        interval_set<uint64_t> fiemap_included(m);
         copy_subset.intersection_of(fiemap_included);
+      } else {
+        // intersection of copy_subset and empty interval_set would be empty anyway
+        copy_subset.clear();
       }
+
       out_op->data_included.span_of(copy_subset, progress.data_recovered_to,
                                     available);
       if (out_op->data_included.empty()) // zero filled section, skip to end!