From: Greg Farnum Date: Wed, 9 Oct 2013 17:39:19 +0000 (-0700) Subject: OSD: add back CEPH_OSD_OP_COPY_GET, and use it in the Objecter X-Git-Tag: v0.72-rc1~13^2~2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=61f2e5d99453bb6fadef424a748d6644b3ae344e;p=ceph.git OSD: add back CEPH_OSD_OP_COPY_GET, and use it in the Objecter This one is encoded with version information. We are not doing anything to control which op gets sent by the client, but after discussion with Sam we think this op isn't accessible enough to clients (right now it's only triggered by a client sending copy-from, which can only happen via ceph-test-rados) to require compatibility versioning. Signed-off-by: Greg Farnum --- diff --git a/src/common/ceph_strings.cc b/src/common/ceph_strings.cc index 8ffdc4143f2..3eb5e672d40 100644 --- a/src/common/ceph_strings.cc +++ b/src/common/ceph_strings.cc @@ -49,6 +49,7 @@ const char *ceph_osd_op_name(int op) case CEPH_OSD_OP_WATCH: return "watch"; case CEPH_OSD_OP_COPY_GET_CLASSIC: return "copy-get-classic"; + case CEPH_OSD_OP_COPY_GET: return "copy-get"; case CEPH_OSD_OP_COPY_FROM: return "copy-from"; case CEPH_OSD_OP_UNDIRTY: return "undirty"; case CEPH_OSD_OP_ISDIRTY: return "isdirty"; diff --git a/src/include/rados.h b/src/include/rados.h index 48374cd1af9..c410f801672 100644 --- a/src/include/rados.h +++ b/src/include/rados.h @@ -221,6 +221,7 @@ enum { CEPH_OSD_OP_COPY_GET_CLASSIC = CEPH_OSD_OP_MODE_RD | CEPH_OSD_OP_TYPE_DATA | 27, CEPH_OSD_OP_UNDIRTY = CEPH_OSD_OP_MODE_WR | CEPH_OSD_OP_TYPE_DATA | 28, CEPH_OSD_OP_ISDIRTY = CEPH_OSD_OP_MODE_RD | CEPH_OSD_OP_TYPE_DATA | 29, + CEPH_OSD_OP_COPY_GET = CEPH_OSD_OP_MODE_RD | CEPH_OSD_OP_TYPE_DATA | 30, /** multi **/ CEPH_OSD_OP_CLONERANGE = CEPH_OSD_OP_MODE_WR | CEPH_OSD_OP_TYPE_MULTI | 1, diff --git a/src/osd/ReplicatedPG.cc b/src/osd/ReplicatedPG.cc index ebc033daf7e..6d1bdbd0c31 100644 --- a/src/osd/ReplicatedPG.cc +++ b/src/osd/ReplicatedPG.cc @@ -3618,6 +3618,13 @@ int ReplicatedPG::do_osd_ops(OpContext *ctx, vector& ops) goto fail; break; + case CEPH_OSD_OP_COPY_GET: + ++ctx->num_read; + result = fill_in_copy_get(bp, osd_op, oi, false); + if (result == -EINVAL) + goto fail; + break; + case CEPH_OSD_OP_COPY_FROM: ++ctx->num_write; { @@ -4254,7 +4261,6 @@ struct C_Copyfrom : public Context { int ReplicatedPG::fill_in_copy_get(bufferlist::iterator& bp, OSDOp& osd_op, object_info_t& oi, bool classic) { - assert(classic); hobject_t& soid = oi.soid; int result = 0; object_copy_cursor_t cursor; @@ -4328,7 +4334,11 @@ int ReplicatedPG::fill_in_copy_get(bufferlist::iterator& bp, OSDOp& osd_op, << " " << out_omap.size() << " keys" << dendl; reply_obj.cursor = cursor; - ::encode(reply_obj, osd_op.outdata); + if (classic) { + reply_obj.encode_classic(osd_op.outdata); + } else { + ::encode(reply_obj, osd_op.outdata); + } result = 0; return result; } diff --git a/src/osd/osd_types.cc b/src/osd/osd_types.cc index 93ce65e81ee..e3867905dc7 100644 --- a/src/osd/osd_types.cc +++ b/src/osd/osd_types.cc @@ -2525,24 +2525,48 @@ void object_copy_cursor_t::generate_test_instances(list& // -- object_copy_data_t -- +void object_copy_data_t::encode_classic(bufferlist& bl) const +{ + ::encode(size, bl); + ::encode(mtime, bl); + ::encode(attrs, bl); + ::encode(data, bl); + ::encode(omap, bl); + ::encode(cursor, bl); +} + +void object_copy_data_t::decode_classic(bufferlist::iterator& bl) +{ + ::decode(size, bl); + ::decode(mtime, bl); + ::decode(attrs, bl); + ::decode(data, bl); + ::decode(omap, bl); + ::decode(cursor, bl); +} + void object_copy_data_t::encode(bufferlist& bl) const { + ENCODE_START(1, 1, bl); ::encode(size, bl); ::encode(mtime, bl); ::encode(attrs, bl); ::encode(data, bl); ::encode(omap, bl); ::encode(cursor, bl); + ENCODE_FINISH(bl); } void object_copy_data_t::decode(bufferlist::iterator& bl) { + DECODE_START(1, bl); ::decode(size, bl); ::decode(mtime, bl); ::decode(attrs, bl); ::decode(data, bl); ::decode(omap, bl); ::decode(cursor, bl); + DECODE_FINISH(bl); } void object_copy_data_t::generate_test_instances(list& o) diff --git a/src/osd/osd_types.h b/src/osd/osd_types.h index 419f9d05291..c9f518e638d 100644 --- a/src/osd/osd_types.h +++ b/src/osd/osd_types.h @@ -1882,6 +1882,8 @@ public: object_copy_data_t() : size((uint64_t)-1) {} static void generate_test_instances(list& o); + void encode_classic(bufferlist& bl) const; + void decode_classic(bufferlist::iterator& bl); void encode(bufferlist& bl) const; void decode(bufferlist::iterator& bl); void dump(Formatter *f) const; diff --git a/src/osdc/Objecter.h b/src/osdc/Objecter.h index 713c2a0bfd8..9b89f9586f4 100644 --- a/src/osdc/Objecter.h +++ b/src/osdc/Objecter.h @@ -616,7 +616,7 @@ struct ObjectOperation { bufferlist *out_data, std::map *out_omap, int *prval) { - OSDOp& osd_op = add_op(CEPH_OSD_OP_COPY_GET_CLASSIC); + OSDOp& osd_op = add_op(CEPH_OSD_OP_COPY_GET); osd_op.op.copy_get.max = max; ::encode(*cursor, osd_op.indata); ::encode(max, osd_op.indata);