diff options
author | Greg Farnum <greg@inktank.com> | 2013-10-08 15:32:26 -0700 |
---|---|---|
committer | Greg Farnum <greg@inktank.com> | 2013-10-17 13:11:44 -0700 |
commit | 06c12accd21b2a7b4813501b8278435ae1750c2f (patch) | |
tree | 4153584f76abdfa601882e0c12d25f263d18f878 | |
parent | 649efe5291de436b49958b98faac42f71db3a4fe (diff) | |
download | ceph-06c12accd21b2a7b4813501b8278435ae1750c2f.tar.gz |
ReplicatedPG: copy: move the COPY_GET implementation into its own function
It was getting long, isn't terribly dependent on access to do_osd_ops()
state, and will be easier to make generic as its own function.
Signed-off-by: Greg Farnum <greg@inktank.com>
-rw-r--r-- | src/osd/ReplicatedPG.cc | 159 | ||||
-rw-r--r-- | src/osd/ReplicatedPG.h | 1 |
2 files changed, 85 insertions, 75 deletions
diff --git a/src/osd/ReplicatedPG.cc b/src/osd/ReplicatedPG.cc index 3c7f1103774..b09b8065720 100644 --- a/src/osd/ReplicatedPG.cc +++ b/src/osd/ReplicatedPG.cc @@ -3603,81 +3603,9 @@ int ReplicatedPG::do_osd_ops(OpContext *ctx, vector<OSDOp>& ops) case CEPH_OSD_OP_COPY_GET: ++ctx->num_read; - { - object_copy_cursor_t cursor; - uint64_t out_max; - try { - ::decode(cursor, bp); - ::decode(out_max, bp); - } - catch (buffer::error& e) { - result = -EINVAL; - goto fail; - } - - object_copy_data_t reply_obj; - // size, mtime - reply_obj.size = oi.size; - reply_obj.mtime = oi.mtime; - - // attrs - map<string,bufferptr>& out_attrs = reply_obj.in_attrs; - if (!cursor.attr_complete) { - result = osd->store->getattrs(coll, soid, out_attrs, true); - if (result < 0) - break; - cursor.attr_complete = true; - dout(20) << " got attrs" << dendl; - } - - int64_t left = out_max - osd_op.outdata.length(); - - // data - bufferlist& bl = reply_obj.data; - if (left > 0 && !cursor.data_complete) { - if (cursor.data_offset < oi.size) { - result = osd->store->read(coll, oi.soid, cursor.data_offset, left, bl); - if (result < 0) - return result; - assert(result <= left); - left -= result; - cursor.data_offset += result; - } - if (cursor.data_offset == oi.size) { - cursor.data_complete = true; - dout(20) << " got data" << dendl; - } - } - - // omap - std::map<std::string,bufferlist>& out_omap = reply_obj.omap; - if (left > 0 && !cursor.omap_complete) { - ObjectMap::ObjectMapIterator iter = osd->store->get_omap_iterator(coll, oi.soid); - assert(iter); - if (iter->valid()) { - iter->upper_bound(cursor.omap_offset); - for (; left > 0 && iter->valid(); iter->next()) { - out_omap.insert(make_pair(iter->key(), iter->value())); - left -= iter->key().length() + 4 + iter->value().length() + 4; - } - } - if (iter->valid()) { - cursor.omap_offset = iter->key(); - } else { - cursor.omap_complete = true; - dout(20) << " got omap" << dendl; - } - } - - dout(20) << " cursor.is_complete=" << cursor.is_complete() - << " " << out_attrs.size() << " attrs" - << " " << bl.length() << " bytes" - << " " << out_omap.size() << " keys" - << dendl; - reply_obj.cursor = cursor; - ::encode(reply_obj, osd_op.outdata); - result = 0; - } + result = fill_in_copy_get(bp, osd_op, oi); + if (result == -EINVAL) + goto fail; break; case CEPH_OSD_OP_COPY_FROM: @@ -4313,6 +4241,87 @@ struct C_Copyfrom : public Context { } }; +int ReplicatedPG::fill_in_copy_get(bufferlist::iterator& bp, OSDOp& osd_op, + object_info_t& oi) +{ + hobject_t& soid = oi.soid; + int result = 0; + object_copy_cursor_t cursor; + uint64_t out_max; + try { + ::decode(cursor, bp); + ::decode(out_max, bp); + } + catch (buffer::error& e) { + result = -EINVAL; + return result; + } + + object_copy_data_t reply_obj; + // size, mtime + reply_obj.size = oi.size; + reply_obj.mtime = oi.mtime; + + // attrs + map<string,bufferptr>& out_attrs = reply_obj.in_attrs; + if (!cursor.attr_complete) { + result = osd->store->getattrs(coll, soid, out_attrs, true); + if (result < 0) + return result; + cursor.attr_complete = true; + dout(20) << " got attrs" << dendl; + } + + int64_t left = out_max - osd_op.outdata.length(); + + // data + bufferlist& bl = reply_obj.data; + if (left > 0 && !cursor.data_complete) { + if (cursor.data_offset < oi.size) { + result = osd->store->read(coll, oi.soid, cursor.data_offset, left, bl); + if (result < 0) + return result; + assert(result <= left); + left -= result; + cursor.data_offset += result; + } + if (cursor.data_offset == oi.size) { + cursor.data_complete = true; + dout(20) << " got data" << dendl; + } + } + + // omap + std::map<std::string,bufferlist>& out_omap = reply_obj.omap; + if (left > 0 && !cursor.omap_complete) { + ObjectMap::ObjectMapIterator iter = osd->store->get_omap_iterator(coll, oi.soid); + assert(iter); + if (iter->valid()) { + iter->upper_bound(cursor.omap_offset); + for (; left > 0 && iter->valid(); iter->next()) { + out_omap.insert(make_pair(iter->key(), iter->value())); + left -= iter->key().length() + 4 + iter->value().length() + 4; + } + } + if (iter->valid()) { + cursor.omap_offset = iter->key(); + } else { + cursor.omap_complete = true; + dout(20) << " got omap" << dendl; + } + } + + dout(20) << " cursor.is_complete=" << cursor.is_complete() + << " " << out_attrs.size() << " attrs" + << " " << bl.length() << " bytes" + << " " << out_omap.size() << " keys" + << dendl; + reply_obj.cursor = cursor; + ::encode(reply_obj, osd_op.outdata); + result = 0; + return result; +} + void ReplicatedPG::start_copy(CopyCallback *cb, ObjectContextRef obc, hobject_t src, object_locator_t oloc, version_t version, const hobject_t& temp_dest_oid) diff --git a/src/osd/ReplicatedPG.h b/src/osd/ReplicatedPG.h index 76628e7c122..4255bd9f012 100644 --- a/src/osd/ReplicatedPG.h +++ b/src/osd/ReplicatedPG.h @@ -821,6 +821,7 @@ protected: // -- copyfrom -- map<hobject_t, CopyOpRef> copy_ops; + int fill_in_copy_get(bufferlist::iterator& bp, OSDOp& op, object_info_t& oi); /** * To copy an object, call start_copy. * |