]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
osd: combine info and log writes into single omap_setkeys
authorSage Weil <sage@redhat.com>
Wed, 4 Mar 2015 23:51:20 +0000 (15:51 -0800)
committerSage Weil <sage@redhat.com>
Wed, 25 Mar 2015 17:32:02 +0000 (10:32 -0700)
This saves a surprising amount of CPU.

Signed-off-by: Sage Weil <sage@redhat.com>
src/osd/PG.cc
src/osd/PGLog.cc
src/osd/PGLog.h
src/tools/ceph_objectstore_tool.cc

index 3118db191792c23e30c7d0dcf5dd3db194c378c6..064ffaea9d53dd6d248a80ca13c08bfb78ddd4a2 100644 (file)
@@ -2864,11 +2864,11 @@ epoch_t PG::peek_map_epoch(ObjectStore *store,
 void PG::write_if_dirty(ObjectStore::Transaction& t)
 {
   map<string,bufferlist> km;
-  if (dirty_big_info || dirty_info) {
+  if (dirty_big_info || dirty_info)
     prepare_write_info(&km);
+  pg_log.write_log(t, &km, coll, pgmeta_oid);
+  if (!km.empty())
     t.omap_setkeys(coll, pgmeta_oid, km);
-  }
-  pg_log.write_log(t, coll, pgmeta_oid);
 }
 
 void PG::trim_peers()
index f7cdf6ae6bd0250cd4b76d99f7fa5f3498cee43b..2f85f1ff0c7a6a15d556aea98ffcabf2b3354fc2 100644 (file)
@@ -711,7 +711,9 @@ void PGLog::check() {
 }
 
 void PGLog::write_log(
-  ObjectStore::Transaction& t, const coll_t& coll, const ghobject_t &log_oid)
+  ObjectStore::Transaction& t,
+  map<string,bufferlist> *km,
+  const coll_t& coll, const ghobject_t &log_oid)
 {
   if (is_dirty()) {
     dout(10) << "write_log with: "
@@ -722,7 +724,7 @@ void PGLog::write_log(
             << ", trimmed: " << trimmed
             << dendl;
     _write_log(
-      t, log, coll, log_oid, divergent_priors,
+      t, km, log, coll, log_oid, divergent_priors,
       dirty_to,
       dirty_from,
       writeout_from,
@@ -736,19 +738,24 @@ void PGLog::write_log(
   }
 }
 
-void PGLog::write_log(ObjectStore::Transaction& t, pg_log_t &log,
+void PGLog::write_log(
+    ObjectStore::Transaction& t,
+    map<string,bufferlist> *km,
+    pg_log_t &log,
     const coll_t& coll, const ghobject_t &log_oid,
     map<eversion_t, hobject_t> &divergent_priors)
 {
   _write_log(
-    t, log, coll, log_oid,
+    t, km, log, coll, log_oid,
     divergent_priors, eversion_t::max(), eversion_t(), eversion_t(),
     set<eversion_t>(),
     true, true, 0);
 }
 
 void PGLog::_write_log(
-  ObjectStore::Transaction& t, pg_log_t &log,
+  ObjectStore::Transaction& t,
+  map<string,bufferlist> *km,
+  pg_log_t &log,
   const coll_t& coll, const ghobject_t &log_oid,
   map<eversion_t, hobject_t> &divergent_priors,
   eversion_t dirty_to,
@@ -788,13 +795,12 @@ void PGLog::_write_log(
     clear_after(log_keys_debug, dirty_from.get_key_name());
   }
 
-  map<string,bufferlist> keys;
   for (list<pg_log_entry_t>::iterator p = log.log.begin();
        p != log.log.end() && p->version < dirty_to;
        ++p) {
     bufferlist bl(sizeof(*p) * 2);
     p->encode_with_checksum(bl);
-    keys[p->get_key_name()].claim(bl);
+    (*km)[p->get_key_name()].claim(bl);
   }
 
   for (list<pg_log_entry_t>::reverse_iterator p = log.log.rbegin();
@@ -804,13 +810,15 @@ void PGLog::_write_log(
        ++p) {
     bufferlist bl(sizeof(*p) * 2);
     p->encode_with_checksum(bl);
-    keys[p->get_key_name()].claim(bl);
+    (*km)[p->get_key_name()].claim(bl);
   }
 
   if (log_keys_debug) {
-    for (map<string, bufferlist>::iterator i = keys.begin();
-        i != keys.end();
+    for (map<string, bufferlist>::iterator i = (*km).begin();
+        i != (*km).end();
         ++i) {
+      if (i->first[0] == '_')
+       continue;
       assert(!log_keys_debug->count(i->first));
       log_keys_debug->insert(i->first);
     }
@@ -818,14 +826,13 @@ void PGLog::_write_log(
 
   if (dirty_divergent_priors) {
     //dout(10) << "write_log: writing divergent_priors" << dendl;
-    ::encode(divergent_priors, keys["divergent_priors"]);
+    ::encode(divergent_priors, (*km)["divergent_priors"]);
   }
-  ::encode(log.can_rollback_to, keys["can_rollback_to"]);
-  ::encode(log.rollback_info_trimmed_to, keys["rollback_info_trimmed_to"]);
+  ::encode(log.can_rollback_to, (*km)["can_rollback_to"]);
+  ::encode(log.rollback_info_trimmed_to, (*km)["rollback_info_trimmed_to"]);
 
   if (!to_remove.empty())
     t.omap_rmkeys(coll, log_oid, to_remove);
-  t.omap_setkeys(coll, log_oid, keys);
 }
 
 void PGLog::read_log(ObjectStore *store, coll_t pg_coll,
index ecfd1a1a3717107c1f03dcc6ae63b895cbe1cc36..c23eabc6fea36a1635d98f51e6060be94a933eba 100644 (file)
@@ -638,15 +638,22 @@ public:
                 pg_info_t &info, LogEntryHandler *rollbacker,
                 bool &dirty_info, bool &dirty_big_info);
 
-  void write_log(ObjectStore::Transaction& t, const coll_t& coll,
+  void write_log(ObjectStore::Transaction& t,
+                map<string,bufferlist> *km,
+                const coll_t& coll,
                 const ghobject_t &log_oid);
 
-  static void write_log(ObjectStore::Transaction& t, pg_log_t &log,
+  static void write_log(
+    ObjectStore::Transaction& t,
+    map<string,bufferlist>* km,
+    pg_log_t &log,
     const coll_t& coll,
     const ghobject_t &log_oid, map<eversion_t, hobject_t> &divergent_priors);
 
   static void _write_log(
-    ObjectStore::Transaction& t, pg_log_t &log,
+    ObjectStore::Transaction& t,
+    map<string,bufferlist>* km,
+    pg_log_t &log,
     const coll_t& coll, const ghobject_t &log_oid,
     map<eversion_t, hobject_t> &divergent_priors,
     eversion_t dirty_to,
index f40b724cce130364101975aff9c4db1913087dcd..dc07d0252b3b03458e0ebf61e6f10d9bd4a6d656 100644 (file)
@@ -830,13 +830,16 @@ int write_info(ObjectStore::Transaction &t, epoch_t epoch, pg_info_t &info,
   //Empty for this
   coll_t coll(info.pgid);
   ghobject_t pgmeta_oid(info.pgid.make_pgmeta_oid());
-  int ret = PG::_write_info(t, epoch,
+  map<string,bufferlist> km;
+  int ret = PG::_prepare_write_info(
+    &km, epoch,
     info, coll,
     past_intervals,
     pgmeta_oid,
     true);
   if (ret < 0) ret = -ret;
   if (ret) cerr << "Failed to write info" << std::endl;
+  t.omap_setkeys(coll, pgmeta_oid, km);
   return ret;
 }
 
@@ -848,7 +851,9 @@ int write_pg(ObjectStore::Transaction &t, epoch_t epoch, pg_info_t &info,
     return ret;
   map<eversion_t, hobject_t> divergent_priors;
   coll_t coll(info.pgid);
-  PGLog::write_log(t, log, coll, info.pgid.make_pgmeta_oid(), divergent_priors);
+  map<string,bufferlist> km;
+  PGLog::write_log(t, &km, log, coll, info.pgid.make_pgmeta_oid(), divergent_priors);
+  t.omap_setkeys(coll, info.pgid.make_pgmeta_oid(), km);
   return 0;
 }