]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
osd: cache coll_t string representation in memory
authorSage Weil <sage@redhat.com>
Tue, 6 Jan 2015 23:08:21 +0000 (15:08 -0800)
committerSage Weil <sage@redhat.com>
Fri, 19 Jun 2015 00:02:48 +0000 (17:02 -0700)
Avoid rerendering the string form (which we use a lot).  We have almost
no mutators and all of our members are private so this is pretty clean.

Signed-off-by: Sage Weil <sage@redhat.com>
src/osd/osd_types.cc
src/osd/osd_types.h

index acf14c9a97320315914d3aa1e604bb258e7c7206..6224838cca3e649041db4609a460c37c02422a32 100644 (file)
@@ -548,19 +548,23 @@ ostream& operator<<(ostream& out, const pg_t &pg)
 
 // -- coll_t --
 
-std::string coll_t::to_str() const
+void coll_t::calc_str()
 {
   switch (type) {
   case TYPE_META:
-    return "meta";
+    _str = "meta";
+    break;
   case TYPE_PG:
-    return stringify(pgid) + "_head";
+    _str = stringify(pgid) + "_head";
+    break;
   case TYPE_PG_TEMP:
-    return stringify(pgid) + "_TEMP";
+    _str = stringify(pgid) + "_TEMP";
+    break;
   case TYPE_PG_REMOVAL:
-    return string("FORREMOVAL_") +
+    _str = string("FORREMOVAL_") +
       stringify(removal_seq) + "_" +
       stringify(pgid);
+    break;
   default:
     assert(0 == "unknown collection type");
   }
@@ -572,18 +576,24 @@ bool coll_t::parse(const std::string& s)
     type = TYPE_META;
     pgid = spg_t();
     removal_seq = 0;
+    calc_str();
+    assert(s == _str);
     return true;
   }
   if (s.find("_head") == s.length() - 5 &&
       pgid.parse(s.substr(0, s.length() - 5))) {
     type = TYPE_PG;
     removal_seq = 0;
+    calc_str();
+    assert(s == _str);
     return true;
   }
   if (s.find("_TEMP") == s.length() - 5 &&
       pgid.parse(s.substr(0, s.length() - 5))) {
     type = TYPE_PG_TEMP;
     removal_seq = 0;
+    calc_str();
+    assert(s == _str);
     return true;
   }
   if (s.find("FORREMOVAL_") == 0) {
@@ -599,6 +609,8 @@ bool coll_t::parse(const std::string& s)
       assert(0);
       return false;
     }
+    calc_str();
+    assert(s == _str);
     return true;
   }
   return false;
index 3fa9139300e1c4bd5d27b378bbd5ec1be720e52a..838de63f3fbc7e2355882a2a0952cebadc95e959 100644 (file)
@@ -489,18 +489,35 @@ class coll_t {
   spg_t pgid;
   uint64_t removal_seq;  // note: deprecated, not encoded
 
+  string _str;  // cached string
+
+  void calc_str();
+
+  coll_t(type_t t, spg_t p, uint64_t r)
+    : type(t), pgid(p), removal_seq(r) {
+    calc_str();
+  }
+
 public:
   coll_t() : type(TYPE_META), removal_seq(0)
-  { }
+  {
+    calc_str();
+  }
 
   coll_t(const coll_t& other)
-    : type(other.type), pgid(other.pgid), removal_seq(other.removal_seq) {}
+    : type(other.type), pgid(other.pgid), removal_seq(other.removal_seq) {
+    calc_str();
+  }
 
   explicit coll_t(spg_t pgid)
     : type(TYPE_PG), pgid(pgid)
-  { }
+  {
+    calc_str();
+  }
 
-  std::string to_str() const;
+  const std::string& to_str() const {
+    return _str;
+  }
   bool parse(const std::string& s);
 
   int operator<(const coll_t &rhs) const {
@@ -561,12 +578,9 @@ public:
 
   // get a TEMP collection that corresponds to the current collection,
   // which we presume is a pg collection.
-  coll_t get_temp() {
+  coll_t get_temp() const {
     assert(type == TYPE_PG);
-    coll_t other;
-    other.type = TYPE_PG_TEMP;
-    other.pgid = pgid;
-    return other;
+    return coll_t(TYPE_PG_TEMP, pgid, 0);
   }
 
   void dump(Formatter *f) const;