From 61f2e5d99453bb6fadef424a748d6644b3ae344e Mon Sep 17 00:00:00 2001 From: Greg Farnum Date: Wed, 9 Oct 2013 10:39:19 -0700 Subject: [PATCH] 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 --- src/common/ceph_strings.cc | 1 + src/include/rados.h | 1 + src/osd/ReplicatedPG.cc | 14 ++++++++++++-- src/osd/osd_types.cc | 24 ++++++++++++++++++++++++ src/osd/osd_types.h | 2 ++ src/osdc/Objecter.h | 2 +- 6 files changed, 41 insertions(+), 3 deletions(-) diff --git a/src/common/ceph_strings.cc b/src/common/ceph_strings.cc index 8ffdc4143f285..3eb5e672d4070 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 48374cd1af99e..c410f80167201 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 ebc033daf7ea5..6d1bdbd0c31e0 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 93ce65e81eebb..e3867905dc767 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 419f9d05291ad..c9f518e638d28 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 713c2a0bfd8d6..9b89f9586f4c9 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); -- 2.39.5