]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
ReplicatedPG::fill_in_copy_get, use getattr_maybe_cache
authorSamuel Just <sam.just@inktank.com>
Wed, 19 Feb 2014 21:54:02 +0000 (13:54 -0800)
committerSamuel Just <sam.just@inktank.com>
Thu, 20 Feb 2014 01:31:36 +0000 (17:31 -0800)
Also, add user_only flag to getattr_maybe_cache and cleanup
the other user.

Signed-off-by: Samuel Just <sam.just@inktank.com>
src/osd/ReplicatedPG.cc
src/osd/ReplicatedPG.h

index 239c754f063918f8bbef50edd5e4cfa2688b8604..9c48c18be4e60a56b21a924b0fbd8b058ae410fe 100644 (file)
@@ -3260,21 +3260,11 @@ int ReplicatedPG::do_osd_ops(OpContext *ctx, vector<OSDOp>& ops)
    case CEPH_OSD_OP_GETXATTRS:
       ++ctx->num_read;
       {
-       map<string,bufferlist> attrset;
+       map<string, bufferlist> out;
        result = getattrs_maybe_cache(
          ctx->obc,
-         &attrset);
-       map<string, bufferlist> out;
-       for (map<string, bufferlist>::iterator i = attrset.begin();
-            i != attrset.end();
-            ++i) {
-         if (i->first[0] != '_')
-           continue;
-         if (i->first == "_")
-           continue;
-         out[i->first.substr(1, i->first.size())].claim(
-           i->second);
-       }
+         &out,
+         true);
         
         bufferlist bl;
         ::encode(out, bl);
@@ -5233,7 +5223,10 @@ int ReplicatedPG::fill_in_copy_get(
   // attrs
   map<string,bufferlist>& out_attrs = reply_obj.attrs;
   if (!cursor.attr_complete) {
-    result = osd->store->getattrs(coll, soid, out_attrs, true);
+    result = getattrs_maybe_cache(
+      ctx->obc,
+      &out_attrs,
+      true);
     if (result < 0)
       return result;
     cursor.attr_complete = true;
@@ -11319,14 +11312,27 @@ int ReplicatedPG::getattr_maybe_cache(
 
 int ReplicatedPG::getattrs_maybe_cache(
   ObjectContextRef obc,
-  map<string, bufferlist> *out)
+  map<string, bufferlist> *out,
+  bool user_only)
 {
+  int r = 0;
   if (pool.info.require_rollback()) {
     if (out)
       *out = obc->attr_cache;
-    return 0;
+  } else {
+    r = pgbackend->objects_get_attrs(obc->obs.oi.soid, out);
+  }
+  if (out && user_only) {
+    map<string, bufferlist> tmp;
+    for (map<string, bufferlist>::iterator i = out->begin();
+        i != out->end();
+        ++i) {
+      if (i->first.size() > 1 && i->first[0] == '_')
+       tmp[i->first.substr(1, i->first.size())].claim(i->second);
+    }
+    tmp.swap(*out);
   }
-  return pgbackend->objects_get_attrs(obc->obs.oi.soid, out);
+  return r;
 }
 
 void intrusive_ptr_add_ref(ReplicatedPG *pg) { pg->get("intptr"); }
index b8a1f020cd3459f150ba502295ca92ba0ae97448..a8aec999dd3f6ba42648481079c5fa333b0852fd 100644 (file)
@@ -1322,7 +1322,8 @@ public:
     bufferlist *val);
   int getattrs_maybe_cache(
     ObjectContextRef obc,
-    map<string, bufferlist> *out);
+    map<string, bufferlist> *out,
+    bool user_only = false);
 };
 
 inline ostream& operator<<(ostream& out, ReplicatedPG::RepGather& repop)