]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
osd: do not use temp_coll for single-step pushes
authorSage Weil <sage@inktank.com>
Wed, 5 Jun 2013 05:42:52 +0000 (22:42 -0700)
committerSamuel Just <sam.just@inktank.com>
Wed, 3 Jul 2013 20:58:11 +0000 (13:58 -0700)
If we are recovering an object in a single step, there is no need to
write it to temp and then move it.  Avoiding that is a very good thing
when the FileStore has to do an fsync() for non-btrfs fs's.

Signed-off-by: Sage Weil <sage@inktank.com>
Conflicts:
src/osd/ReplicatedPG.cc

src/osd/ReplicatedPG.cc
src/osd/ReplicatedPG.h

index a8b40b4b5cbd7f5f03d4b91cf6fc92b367a1f430..3a664a94cbd14993cf2f6c410d1239bfb2276e78 100644 (file)
@@ -5390,6 +5390,7 @@ int ReplicatedPG::send_pull(int prio, int peer,
 void ReplicatedPG::submit_push_data(
   const ObjectRecoveryInfo &recovery_info,
   bool first,
+  bool complete,
   const interval_set<uint64_t> &intervals_included,
   bufferlist data_included,
   bufferlist omap_header,
@@ -5397,12 +5398,19 @@ void ReplicatedPG::submit_push_data(
   map<string, bufferlist> &omap_entries,
   ObjectStore::Transaction *t)
 {
+  coll_t target_coll;
+  if (first && complete)
+    target_coll = coll;
+  else
+    target_coll = get_temp_coll(t);
+
   if (first) {
     pg_log.revise_have(recovery_info.soid, eversion_t());
     remove_snap_mapped_object(*t, recovery_info.soid);
+    t->remove(coll, recovery_info.soid);
     t->remove(get_temp_coll(t), recovery_info.soid);
-    t->touch(get_temp_coll(t), recovery_info.soid);
-    t->omap_setheader(get_temp_coll(t), recovery_info.soid, omap_header);
+    t->touch(target_coll, recovery_info.soid);
+    t->omap_setheader(target_coll, recovery_info.soid, omap_header);
   }
   uint64_t off = 0;
   for (interval_set<uint64_t>::const_iterator p = intervals_included.begin();
@@ -5410,21 +5418,27 @@ void ReplicatedPG::submit_push_data(
        ++p) {
     bufferlist bit;
     bit.substr_of(data_included, off, p.get_len());
-    t->write(get_temp_coll(t), recovery_info.soid,
+    t->write(target_coll, recovery_info.soid,
             p.get_start(), p.get_len(), bit);
     off += p.get_len();
   }
 
-  t->omap_setkeys(get_temp_coll(t), recovery_info.soid,
+  t->omap_setkeys(target_coll, recovery_info.soid,
                  omap_entries);
-  t->setattrs(get_temp_coll(t), recovery_info.soid,
+  t->setattrs(target_coll, recovery_info.soid,
              attrs);
+
+  if (complete) {
+    if (!first)
+      t->collection_move(coll, target_coll, recovery_info.soid);
+
+    submit_push_complete(recovery_info, t);
+  }
 }
 
 void ReplicatedPG::submit_push_complete(ObjectRecoveryInfo &recovery_info,
                                        ObjectStore::Transaction *t)
 {
-  t->collection_move(coll, get_temp_coll(t), recovery_info.soid);
   for (map<hobject_t, interval_set<uint64_t> >::const_iterator p =
         recovery_info.clone_subset.begin();
        p != recovery_info.clone_subset.end();
@@ -5574,6 +5588,7 @@ void ReplicatedPG::handle_pull_response(OpRequestRef op)
   Context *onreadable_sync = 0;
   Context *oncomplete = 0;
   submit_push_data(pi.recovery_info, first,
+                  complete,
                   data_included, data,
                   m->omap_header,
                   m->attrset,
@@ -5583,7 +5598,6 @@ void ReplicatedPG::handle_pull_response(OpRequestRef op)
   info.stats.stats.sum.num_keys_recovered += m->omap_entries.size();
 
   if (complete) {
-    submit_push_complete(pi.recovery_info, t);
     info.stats.stats.sum.num_objects_recovered++;
 
     SnapSetContext *ssc;
@@ -5671,15 +5685,13 @@ void ReplicatedPG::handle_push(OpRequestRef op)
   Context *onreadable_sync = 0;
   submit_push_data(m->recovery_info,
                   first,
+                  complete,
                   m->data_included,
                   data,
                   m->omap_header,
                   m->attrset,
                   m->omap_entries,
                   t);
-  if (complete)
-    submit_push_complete(m->recovery_info,
-                        t);
 
   int r = osd->store->
     queue_transaction(
index d38fdcd51f2d6c08c37bb0ce1d5c4d703aec2416..099f8b5d93b6d37f4b5ff77688898402f14f059f 100644 (file)
@@ -566,6 +566,7 @@ protected:
                ObjectRecoveryProgress progress);
   void submit_push_data(const ObjectRecoveryInfo &recovery_info,
                        bool first,
+                       bool complete,
                        const interval_set<uint64_t> &intervals_included,
                        bufferlist data_included,
                        bufferlist omap_header,