]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
osd, objecter, librados: add SRC_CMPXATTR operation
authorSage Weil <sage@newdream.net>
Tue, 2 Aug 2011 21:20:19 +0000 (14:20 -0700)
committerSage Weil <sage@newdream.net>
Tue, 2 Aug 2011 21:20:36 +0000 (14:20 -0700)
and test.

Signed-off-by: Sage Weil <sage@newdream.net>
src/include/ceph_strings.cc
src/include/rados.h
src/include/rados/librados.hpp
src/librados.cc
src/osd/osd_types.h
src/osdc/Objecter.h
src/testradospp.cc

index a8b71439a66377e25bbe9f4e301d19fea1ff9d8f..274b372280ed5da0c256b31e9ce0485ea46106d2 100644 (file)
@@ -48,6 +48,7 @@ const char *ceph_osd_op_name(int op)
 
        case CEPH_OSD_OP_CLONERANGE: return "clonerange";
        case CEPH_OSD_OP_ASSERT_SRC_VERSION: return "assert-src-version";
+       case CEPH_OSD_OP_SRC_CMPXATTR: return "src-cmpxattr";
 
        case CEPH_OSD_OP_GETXATTR: return "getxattr";
        case CEPH_OSD_OP_GETXATTRS: return "getxattrs";
index 7b3b1920e8fddb4651f41b5a5fc99836db227ded..7c89694ea653e730f9849b62c8cc5b30acdbf86d 100644 (file)
@@ -225,6 +225,7 @@ enum {
        /** multi **/
        CEPH_OSD_OP_CLONERANGE = CEPH_OSD_OP_MODE_WR | CEPH_OSD_OP_TYPE_MULTI | 1,
        CEPH_OSD_OP_ASSERT_SRC_VERSION = CEPH_OSD_OP_MODE_RD | CEPH_OSD_OP_TYPE_MULTI | 2,
+       CEPH_OSD_OP_SRC_CMPXATTR = CEPH_OSD_OP_MODE_RD | CEPH_OSD_OP_TYPE_MULTI | 3,
 
        /** attrs **/
        /* read */
index e09e00dc825b864a2e894aeff4ba9e64f18942a4..d891fe8944fe50e8f4dc2e20eef2a3b2fde4fc18 100644 (file)
@@ -126,6 +126,8 @@ namespace librados
     void clone_range(uint64_t dst_off,
                      const std::string& src_oid, uint64_t src_off,
                      size_t len);
+    void src_cmpxattr(const std::string& src_oid,
+                     const char *name, const bufferlist& val, int op, int mode);
 
     void exec(const char *cls, const char *method, bufferlist& bl);
 
index 9336ef451fe585ebd36e43c288c6f8929a7315c0..2c6acee08782ab65cb6607bf91121a733d40d51b 100644 (file)
@@ -211,6 +211,14 @@ void librados::ObjectOperation::clone_range(uint64_t dst_off,
   o->clone_range(src_oid, src_off, len, dst_off);
 }
 
+void librados::ObjectOperation::src_cmpxattr(const std::string& src_oid,
+                                        const char *name, const bufferlist& v, int op, int mode)
+{
+  ::ObjectOperation *o = (::ObjectOperation *)impl;
+  object_t oid(src_oid);
+  o->src_cmpxattr(oid, CEPH_NOSNAP, name, v, op, mode);
+}
+
 
 librados::WatchCtx::
 ~WatchCtx()
index d1cc45cff378567c1e746bce64d6c222860e8e7f..ab07b1bb10e24350af467ba82299e4758d755d9b 100644 (file)
@@ -1667,6 +1667,17 @@ inline ostream& operator<<(ostream& out, const OSDOp& op) {
       out << " v" << op.op.watch.ver
          << " of " << op.soid;
       break;
+    case CEPH_OSD_OP_SRC_CMPXATTR:
+      out << " " << op.soid;
+      if (op.op.xattr.name_len && op.data.length()) {
+       out << " ";
+       op.data.write(0, op.op.xattr.name_len, out);
+      }
+      if (op.op.xattr.value_len)
+       out << " (" << op.op.xattr.value_len << ")";
+      if (op.op.op == CEPH_OSD_OP_CMPXATTR)
+       out << " op " << (int)op.op.xattr.cmp_op << " mode " << (int)op.op.xattr.cmp_mode;
+      break;
     }
   }
   return out;
index d39da7c983467cf73f9550955ffa51e71d82e43c..dd45660fd1646facf1617b91f777527d6004f7d1 100644 (file)
@@ -261,6 +261,15 @@ struct ObjectOperation {
     o.op.xattr.cmp_op = op;
     o.op.xattr.cmp_mode = mode;
   }
+  void src_cmpxattr(const object_t& srcoid, snapid_t srcsnapid,
+                   const char *name, const bufferlist& val,
+                   int op, int mode) {
+    add_xattr(CEPH_OSD_OP_SRC_CMPXATTR, name, val);
+    OSDOp& o = *ops.rbegin();
+    o.soid = sobject_t(srcoid, srcsnapid);
+    o.op.xattr.cmp_op = op;
+    o.op.xattr.cmp_mode = mode;
+  }
 
 };
 
index 7887230a93fe4b1e0dda6adc0b683e240ea3bfef..9edbacbb0609727474e53737fbeb97ae341ee432 100644 (file)
@@ -266,6 +266,29 @@ int main(int argc, const char **argv)
     assert(r == -ECANCELED);
   }
 
+  cout << "src_cmpxattr" << std::endl;
+  const char *oidb = "bar-clone";
+  {
+    ObjectOperation o;
+    o.src_cmpxattr(oid, "foo", val, CEPH_OSD_CMPXATTR_OP_EQ, CEPH_OSD_CMPXATTR_MODE_STRING);
+    io_ctx.locator_set_key(oid);
+    o.write_full(val);
+    r = io_ctx.operate(oidb, &o, &bl2);
+    cout << " got " << r << " wanted ECANCELED" << std::endl;
+    assert(r == -ECANCELED);
+  }
+  {
+    ObjectOperation o;
+    o.src_cmpxattr(oid, "foo", val, CEPH_OSD_CMPXATTR_OP_NE, CEPH_OSD_CMPXATTR_MODE_STRING);
+    io_ctx.locator_set_key(oid);
+    o.write_full(val);
+    r = io_ctx.operate(oidb, &o, &bl2);
+    cout << " got " << r << " wanted >= 0" << std::endl;
+    assert(r >= 0);
+  }
+  io_ctx.locator_set_key(string());
+
+
   cout << "iterating over objects..." << std::endl;
   int num_objs = 0;
   for (ObjectIterator iter = io_ctx.objects_begin();