summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSage Weil <sage@inktank.com>2013-09-16 22:48:41 -0700
committerSage Weil <sage@inktank.com>2013-09-17 06:27:34 -0700
commit05d6160809d0f2ffc99c3e35e3f5b6c50b53d083 (patch)
tree4eb20196f8067ef1a737fea968cf0de16a6d4b2a
parentc0db53780f08ff615a346a1a35af11765b64d161 (diff)
downloadceph-05d6160809d0f2ffc99c3e35e3f5b6c50b53d083.tar.gz
add cmpxattr noentok flag
-rw-r--r--src/include/rados.h1
-rw-r--r--src/osd/ReplicatedPG.cc5
-rw-r--r--src/osdc/Objecter.h11
3 files changed, 13 insertions, 4 deletions
diff --git a/src/include/rados.h b/src/include/rados.h
index 178c171c445..c387a2ebd11 100644
--- a/src/include/rados.h
+++ b/src/include/rados.h
@@ -342,6 +342,7 @@ enum {
enum {
CEPH_OSD_OP_FLAG_EXCL = 1, /* EXCL object create */
CEPH_OSD_OP_FLAG_FAILOK = 2, /* continue despite failure */
+ CEPH_OSD_OP_FLAG_NOENTOK = 4, /* ignore NOENT error */
};
#define EOLDSNAPC 85 /* ORDERSNAP flag set; writer has old snapc*/
diff --git a/src/osd/ReplicatedPG.cc b/src/osd/ReplicatedPG.cc
index 3cd5a7ef865..774b2bb35e8 100644
--- a/src/osd/ReplicatedPG.cc
+++ b/src/osd/ReplicatedPG.cc
@@ -2450,8 +2450,11 @@ int ReplicatedPG::do_osd_ops(OpContext *ctx, vector<OSDOp>& ops)
result = osd->store->getattr(coll, soid, name.c_str(), xattr);
else
result = osd->store->getattr(coll, src_obc->obs.oi.soid, name.c_str(), xattr);
- if (result < 0 && result != -EEXIST && result != -ENODATA)
+ int flags = le32_to_cpu(op.flags);
+ if (result < 0 && result != -EEXIST && result != -ENODATA &&
+ (!(flags & CEPH_OSD_OP_FLAG_NOENTOK) || result != -ENOENT)) {
break;
+ }
ctx->delta_stats.num_rd++;
ctx->delta_stats.num_rd_kb += SHIFT_ROUND_UP(xattr.length(), 10);
diff --git a/src/osdc/Objecter.h b/src/osdc/Objecter.h
index 880023ab37b..9178630fd97 100644
--- a/src/osdc/Objecter.h
+++ b/src/osdc/Objecter.h
@@ -112,9 +112,10 @@ struct ObjectOperation {
osd_op.indata.append(name);
osd_op.indata.append(data);
}
- void add_xattr_cmp(int op, const char *name, uint8_t cmp_op, uint8_t cmp_mode, const bufferlist& data) {
+ void add_xattr_cmp(int op, const char *name, uint8_t cmp_op, uint8_t cmp_mode, uint32_t flags, const bufferlist& data) {
OSDOp& osd_op = add_op(op);
osd_op.op.op = op;
+ osd_op.op.flags = flags;
osd_op.op.xattr.name_len = (name ? strlen(name) : 0);
osd_op.op.xattr.value_len = data.length();
osd_op.op.xattr.cmp_op = cmp_op;
@@ -453,7 +454,10 @@ struct ObjectOperation {
add_xattr(CEPH_OSD_OP_SETXATTR, name, bl);
}
void cmpxattr(const char *name, uint8_t cmp_op, uint8_t cmp_mode, const bufferlist& bl) {
- add_xattr_cmp(CEPH_OSD_OP_CMPXATTR, name, cmp_op, cmp_mode, bl);
+ add_xattr_cmp(CEPH_OSD_OP_CMPXATTR, name, cmp_op, cmp_mode, 0, bl);
+ }
+ void cmpxattr(const char *name, uint8_t cmp_op, uint8_t cmp_mode, uint32_t flags, const bufferlist& bl) {
+ add_xattr_cmp(CEPH_OSD_OP_CMPXATTR, name, cmp_op, cmp_mode, flags, bl);
}
void rmxattr(const char *name) {
bufferlist bl;
@@ -733,11 +737,12 @@ struct ObjectOperation {
}
void cmpxattr(const char *name, const bufferlist& val,
- int op, int mode) {
+ int op, int mode, int flags = 0) {
add_xattr(CEPH_OSD_OP_CMPXATTR, name, val);
OSDOp& o = *ops.rbegin();
o.op.xattr.cmp_op = op;
o.op.xattr.cmp_mode = mode;
+ o.op.flags = flags;
}
void src_cmpxattr(const object_t& srcoid, snapid_t srcsnapid,
const char *name, const bufferlist& val,