summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGreg Farnum <greg@inktank.com>2013-10-08 15:32:26 -0700
committerGreg Farnum <greg@inktank.com>2013-10-17 13:11:44 -0700
commit06c12accd21b2a7b4813501b8278435ae1750c2f (patch)
tree4153584f76abdfa601882e0c12d25f263d18f878
parent649efe5291de436b49958b98faac42f71db3a4fe (diff)
downloadceph-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.cc159
-rw-r--r--src/osd/ReplicatedPG.h1
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.
*