]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
ReplicatedPG,FileStore: clone should copy xattrs as well
authorSamuel Just <sam.just@dreamhost.com>
Fri, 16 Mar 2012 05:13:09 +0000 (22:13 -0700)
committerSamuel Just <samuel.just@dreamhost.com>
Fri, 16 Mar 2012 18:40:18 +0000 (11:40 -0700)
_make_clone (called from make_writeable) and _rollback_to included
attr reads from head or a clone.  In that case, an ondisk read
lock would be necessary.  Now, clone also handles xattrs, so the
attr read should not be necessary.

Signed-off-by: Samuel Just <sam.just@dreamhost.com>
src/os/FileStore.cc
src/osd/ReplicatedPG.cc

index 45eccb457909c20016418f2196ded60f713fb3c3..db66a7b0a2dea4ac33106702d336efbd5312ce1d 100644 (file)
@@ -3066,30 +3066,43 @@ int FileStore::_clone(coll_t cid, const hobject_t& oldoid, const hobject_t& newo
     return 0;
 
   int o, n, r;
-  Index index;
-  IndexedPath from, to;
-  o = lfn_open(cid, oldoid, O_RDONLY, 0, &from, &index);
-  if (o < 0) {
-    r = o;
-    goto out2;
-  }
-  n = lfn_open(cid, newoid, O_CREAT|O_TRUNC|O_WRONLY, 0644, &to, &index);
-  if (n < 0) {
-    r = n;
-    goto out;
+  {
+    Index index;
+    IndexedPath from, to;
+    o = lfn_open(cid, oldoid, O_RDONLY, 0, &from, &index);
+    if (o < 0) {
+      r = o;
+      goto out2;
+    }
+    n = lfn_open(cid, newoid, O_CREAT|O_TRUNC|O_WRONLY, 0644, &to, &index);
+    if (n < 0) {
+      r = n;
+      goto out;
+    }
+    struct stat st;
+    ::fstat(o, &st);
+    r = _do_clone_range(o, n, 0, st.st_size, 0);
+    if (r < 0)
+      r = -errno;
+    dout(20) << "objectmap clone" << dendl;
+    r = object_map->clone(oldoid, from->get_index(), newoid, to->get_index());
   }
 
-  struct stat st;
-  ::fstat(o, &st);
-  r = _do_clone_range(o, n, 0, st.st_size, 0);
-  if (r < 0)
-    r = -errno;
-  dout(20) << "objectmap clone" << dendl;
-  r = object_map->clone(oldoid, from->get_index(), newoid, to->get_index());
+  {
+    map<string, bufferptr> aset;
+    r = _getattrs(cid, oldoid, aset);
+    if (r < 0)
+      goto out3;
+
+    r = _setattrs(cid, newoid, aset);
+    if (r < 0)
+      goto out3;
+  }
 
   // clone is non-idempotent; record our work.
   _set_replay_guard(n, spos);
 
+ out3:
   TEMP_FAILURE_RETRY(::close(n));
  out:
   TEMP_FAILURE_RETRY(::close(o));
index bee16773911a1bb618378083d4dccb74cbc3a8b8..82bdad8540df6e41d716f8c5f928702d46b7c382 100644 (file)
@@ -2759,10 +2759,6 @@ int ReplicatedPG::_rollback_to(OpContext *ctx, ceph_osd_op& op)
       map<string, bufferptr> attrs;
       t.clone(coll,
              rollback_to_sobject, soid);
-      osd->store->getattrs(coll,
-                          rollback_to_sobject, attrs, false);
-      osd->filter_xattrs(attrs);
-      t.setattrs(coll, soid, attrs);
       snapset.head_exists = true;
 
       map<snapid_t, interval_set<uint64_t> >::iterator iter =
@@ -2804,13 +2800,9 @@ void ReplicatedPG::_make_clone(ObjectStore::Transaction& t,
   bufferlist bv;
   ::encode(*poi, bv);
 
-  map<string, bufferptr> attrs;
-  osd->store->getattrs(coll, head, attrs);
-  osd->filter_xattrs(attrs);
-
   t.clone(coll, head, coid);
   t.setattr(coll, coid, OI_ATTR, bv);
-  t.setattrs(coll, coid, attrs);
+  t.rmattr(coll, coid, SS_ATTR);
 }
 
 void ReplicatedPG::make_writeable(OpContext *ctx)