diff options
author | Sage Weil <sage@inktank.com> | 2013-09-09 12:47:03 -0700 |
---|---|---|
committer | Sage Weil <sage@inktank.com> | 2013-09-17 11:06:27 -0700 |
commit | df7c36ac08ec59b5435e758713dd65598410d763 (patch) | |
tree | 25fa7565f9bb103a604adf2b3ca7e256e81222a3 | |
parent | 5921703eb569eb4d865e308e48fa0a2d399a7811 (diff) | |
download | ceph-df7c36ac08ec59b5435e758713dd65598410d763.tar.gz |
osd/ReplicatedPG: factor some bits into finish_copy
This is a bit cleaner and hopefully more usable for osd-driven cache
promotion.
Signed-off-by: Sage Weil <sage@inktank.com>
-rw-r--r-- | src/osd/ReplicatedPG.cc | 87 | ||||
-rw-r--r-- | src/osd/ReplicatedPG.h | 1 |
2 files changed, 49 insertions, 39 deletions
diff --git a/src/osd/ReplicatedPG.cc b/src/osd/ReplicatedPG.cc index 2318aba6f7a..c42825259b6 100644 --- a/src/osd/ReplicatedPG.cc +++ b/src/osd/ReplicatedPG.cc @@ -3460,53 +3460,20 @@ int ReplicatedPG::do_osd_ops(OpContext *ctx, vector<OSDOp>& ops) result = -EINVAL; goto fail; } - pg_t raw_pg; - get_osdmap()->object_locator_to_pg(src_name, src_oloc, raw_pg); - hobject_t src(src_name, src_oloc.key, src_snapid, - raw_pg.ps(), raw_pg.pool(), - src_oloc.nspace); if (!ctx->copy_op) { // start + pg_t raw_pg; + get_osdmap()->object_locator_to_pg(src_name, src_oloc, raw_pg); + hobject_t src(src_name, src_oloc.key, src_snapid, + raw_pg.ps(), raw_pg.pool(), + src_oloc.nspace); result = start_copy(ctx, src, src_oloc, src_version, &ctx->copy_op); if (result < 0) goto fail; result = -EINPROGRESS; } else { // finish - CopyOpRef cop = ctx->copy_op; - - if (!obs.exists) { - ctx->delta_stats.num_objects++; - obs.exists = true; - } else { - t.remove(coll, soid); - } - - if (cop->temp_cursor.is_initial()) { - // write directly to final object - cop->temp_coll = coll; - cop->temp_oid = soid; - _write_copy_chunk(cop, &t); - } else { - // finish writing to temp object, then move into place - _write_copy_chunk(cop, &t); - t.collection_move_rename(cop->temp_coll, cop->temp_oid, coll, soid); - temp_contents.erase(cop->temp_oid); - ctx->old_temp_oid = cop->temp_oid; - } - - interval_set<uint64_t> ch; - if (oi.size > 0) - ch.insert(0, oi.size); - ctx->modified_ranges.union_of(ch); - - if (cop->cursor.data_offset != oi.size) { - ctx->delta_stats.num_bytes -= oi.size; - ctx->delta_stats.num_bytes += oi.size; - oi.size = cop->cursor.data_offset; - } - ctx->delta_stats.num_wr++; - ctx->delta_stats.num_wr_kb += SHIFT_ROUND_UP(cop->data.length(), 10); + result = finish_copy(ctx); } } break; @@ -4253,6 +4220,48 @@ void ReplicatedPG::_write_copy_chunk(CopyOpRef cop, ObjectStore::Transaction *t) cop->temp_cursor = cop->cursor; } +int ReplicatedPG::finish_copy(OpContext *ctx) +{ + CopyOpRef cop = ctx->copy_op; + ObjectState& obs = ctx->new_obs; + ObjectStore::Transaction& t = ctx->op_t; + + if (!obs.exists) { + ctx->delta_stats.num_objects++; + obs.exists = true; + } else { + t.remove(coll, obs.oi.soid); + } + + if (cop->temp_cursor.is_initial()) { + // write directly to final object + cop->temp_coll = coll; + cop->temp_oid = obs.oi.soid; + _write_copy_chunk(cop, &t); + } else { + // finish writing to temp object, then move into place + _write_copy_chunk(cop, &t); + t.collection_move_rename(cop->temp_coll, cop->temp_oid, coll, obs.oi.soid); + temp_contents.erase(cop->temp_oid); + ctx->discard_temp_oid = cop->temp_oid; + } + + interval_set<uint64_t> ch; + if (obs.oi.size > 0) + ch.insert(0, obs.oi.size); + ctx->modified_ranges.union_of(ch); + + if (cop->cursor.data_offset != obs.oi.size) { + ctx->delta_stats.num_bytes -= obs.oi.size; + ctx->delta_stats.num_bytes += obs.oi.size; + obs.oi.size = cop->cursor.data_offset; + } + ctx->delta_stats.num_wr++; + ctx->delta_stats.num_wr_kb += SHIFT_ROUND_UP(obs.oi.size, 10); + + return 0; +} + void ReplicatedPG::cancel_copy(CopyOpRef cop) { OpContext *ctx = cop->ctx; diff --git a/src/osd/ReplicatedPG.h b/src/osd/ReplicatedPG.h index ab874351274..80ee9cf8d29 100644 --- a/src/osd/ReplicatedPG.h +++ b/src/osd/ReplicatedPG.h @@ -794,6 +794,7 @@ protected: void process_copy_chunk(hobject_t oid, tid_t tid, int r); void _write_copy_chunk(CopyOpRef cop, ObjectStore::Transaction *t); void _copy_some(OpContext *ctx, CopyOpRef cop); + int finish_copy(OpContext *ctx); void cancel_copy(CopyOpRef cop); void requeue_cancel_copy_ops(bool requeue=true); |