From: Jianpeng Ma Date: Fri, 18 Dec 2015 15:48:04 +0000 (+0800) Subject: osd/ReplicatedPG: check obs.exists for CEPH_OSD_OP_CMPXATTR/SRC_CMPXATTR. X-Git-Tag: v10.1.0~401^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=7794bc4d68f6caf83b3e3ff1ec819ea9ea0d1232;p=ceph.git osd/ReplicatedPG: check obs.exists for CEPH_OSD_OP_CMPXATTR/SRC_CMPXATTR. We may use those ops(CMPXATTR, WRITE, SET_XATTR) to do a write. Using CMPXATTR to indiate whether to write. But if object don't exist, because the ops is writeable(because WRITE, SET_XATTR), so it can do CMPXATTR. But at this situation, the func getattr_maybe_cache return -ENOENT. For optimization, we first check obs.exists. Signed-off-by: Jianpeng Ma --- diff --git a/src/osd/ReplicatedPG.cc b/src/osd/ReplicatedPG.cc index 52340caa51a2..c631c847cbbd 100644 --- a/src/osd/ReplicatedPG.cc +++ b/src/osd/ReplicatedPG.cc @@ -4498,21 +4498,23 @@ int ReplicatedPG::do_osd_ops(OpContext *ctx, vector& ops) name[op.xattr.name_len + 1] = 0; bufferlist xattr; - if (op.op == CEPH_OSD_OP_CMPXATTR) - result = getattr_maybe_cache( - ctx->obc, - name, - &xattr); - else - result = getattr_maybe_cache( - src_obc, - name, - &xattr); - if (result < 0 && result != -ENODATA) - break; - - ctx->delta_stats.num_rd++; - ctx->delta_stats.num_rd_kb += SHIFT_ROUND_UP(xattr.length(), 10); + if (obs.exists) { + if (op.op == CEPH_OSD_OP_CMPXATTR) + result = getattr_maybe_cache( + ctx->obc, + name, + &xattr); + else + result = getattr_maybe_cache( + src_obc, + name, + &xattr); + if (result < 0 && result != -ENODATA) + break; + + ctx->delta_stats.num_rd++; + ctx->delta_stats.num_rd_kb += SHIFT_ROUND_UP(xattr.length(), 10); + } switch (op.xattr.cmp_mode) { case CEPH_OSD_CMPXATTR_MODE_STRING: