and test.
Signed-off-by: Sage Weil <sage@newdream.net>
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";
/** 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 */
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);
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()
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;
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;
+ }
};
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();