From 474f4c9c142da35bf3366851cac5e7e80a6965c8 Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Fri, 22 May 2009 12:16:08 -0700 Subject: [PATCH] osd: unify ReadOpContext and WriteOpContext -> OpContext --- src/osd/ReplicatedPG.cc | 38 ++++++++++++++++----------------- src/osd/ReplicatedPG.h | 47 ++++++++++++++--------------------------- 2 files changed, 34 insertions(+), 51 deletions(-) diff --git a/src/osd/ReplicatedPG.cc b/src/osd/ReplicatedPG.cc index c22f13836496f..daff018d28aa7 100644 --- a/src/osd/ReplicatedPG.cc +++ b/src/osd/ReplicatedPG.cc @@ -602,7 +602,7 @@ bool ReplicatedPG::snap_trimmer() // ======================================================================== // READS -int ReplicatedPG::do_read_ops(ReadOpContext *ctx, +int ReplicatedPG::do_read_ops(OpContext *ctx, bufferlist::iterator& bp, bufferlist& data) { int result = 0; @@ -775,11 +775,11 @@ int ReplicatedPG::do_read_ops(ReadOpContext *ctx, void ReplicatedPG::op_read(MOSDOp *op, ObjectContext *obc) { const sobject_t& soid = obc->soid; - ReadOpContext ctx(op, op->ops, &obc->oi); + OpContext ctx(op, op->get_reqid(), op->ops, op->get_data(), &obc->oi); dout(10) << "op_read " << soid << " " << ctx.ops << dendl; - bufferlist::iterator bp = op->get_data().begin(); + bufferlist::iterator bp = ctx.data.begin(); bufferlist data; int result = 0; @@ -1272,7 +1272,7 @@ int ReplicatedPG::prepare_simple_op(ObjectStore::Transaction& t, osd_reqid_t req return 0; } -void ReplicatedPG::prepare_transaction(WriteOpContext *ctx, bool& exists, __u64& size, eversion_t trim_to) +void ReplicatedPG::prepare_transaction(OpContext *ctx, bool& exists, __u64& size, eversion_t trim_to) { bufferlist log_bl; eversion_t log_version = ctx->at_version; @@ -1280,7 +1280,7 @@ void ReplicatedPG::prepare_transaction(WriteOpContext *ctx, bool& exists, __u64& eversion_t old_version = ctx->poi->version; - sobject_t& soid = ctx->soid; + const sobject_t& soid = ctx->poi->soid; vector& ops = ctx->ops; object_info_t *poi = ctx->poi; @@ -1400,7 +1400,7 @@ void ReplicatedPG::apply_repop(RepGather *repop) update_stats(); // any completion stuff to do here? - sobject_t& soid = repop->ctx->soid; + const sobject_t& soid = repop->ctx->poi->soid; ceph_osd_op& first = repop->ctx->ops[0]; switch (first.op) { @@ -1514,7 +1514,7 @@ void ReplicatedPG::eval_repop(RepGather *repop) void ReplicatedPG::issue_repop(RepGather *repop, int dest, utime_t now) { - sobject_t& soid = repop->ctx->soid; + const sobject_t& soid = repop->ctx->poi->soid; dout(7) << " issue_repop rep_tid " << repop->rep_tid << " o " << soid << " to osd" << dest @@ -1539,13 +1539,16 @@ void ReplicatedPG::issue_repop(RepGather *repop, int dest, utime_t now) osd->messenger->send_message(wr, osd->osdmap->get_inst(dest)); } -ReplicatedPG::RepGather *ReplicatedPG::new_repop(WriteOpContext *ctx, ObjectContext *obc, +ReplicatedPG::RepGather *ReplicatedPG::new_repop(OpContext *ctx, ObjectContext *obc, bool noop, tid_t rep_tid) { dout(10) << "new_repop rep_tid " << rep_tid << " on " << *ctx->op << dendl; RepGather *repop = new RepGather(ctx, obc, noop, rep_tid, info.last_complete); + obc->start_write(); + obc->get(); // we take a ref + // initialize gather sets for (unsigned i=0; iget_nodeid(); - WriteOpContext *ctx = new WriteOpContext(op, op->ops, op->get_data(), - sobject_t(op->get_oid(), CEPH_NOSNAP), - op->get_reqid(), op->get_mtime()); - sobject_t& soid = ctx->soid; + OpContext *ctx = new OpContext(op, op->get_reqid(), op->ops, op->get_data(), &obc->oi); + + const sobject_t& soid = ctx->poi->soid; // balance-reads set? #if 0 @@ -1769,10 +1771,6 @@ void ReplicatedPG::op_modify(MOSDOp *op, ObjectContext *obc) } #endif - // get existing object info - obc->get(); - ctx->poi = &obc->oi; - // --- locking --- // wrlock? @@ -1798,6 +1796,8 @@ void ReplicatedPG::op_modify(MOSDOp *op, ObjectContext *obc) opname = ceph_osd_op_name(ctx->ops[0].op); + ctx->mtime = op->get_mtime(); + // version ctx->at_version = log.top; if (!noop) { @@ -1853,8 +1853,6 @@ void ReplicatedPG::op_modify(MOSDOp *op, ObjectContext *obc) // note my stats utime_t now = g_clock.now(); - obc->start_write(); - // issue replica writes tid_t rep_tid = osd->get_tid(); RepGather *repop = new_repop(ctx, obc, noop, rep_tid); @@ -1986,8 +1984,8 @@ void ReplicatedPG::sub_op_modify(MOSDSubOp *op) oi.version = op->old_version; oi.snapset = op->snapset; - WriteOpContext ctx(op, op->ops, op->get_data(), op->poid, op->reqid, op->mtime); - ctx.poi = &oi; + OpContext ctx(op, op->reqid, op->ops, op->get_data(), &oi); + ctx.mtime = op->mtime; ctx.at_version = op->version; ctx.snapc = op->snapc; diff --git a/src/osd/ReplicatedPG.h b/src/osd/ReplicatedPG.h index 944d48486ee1e..1da5309fccadf 100644 --- a/src/osd/ReplicatedPG.h +++ b/src/osd/ReplicatedPG.h @@ -211,42 +211,27 @@ public: /* - * Capture all object state associated with an in-progress read. + * Capture all object state associated with an in-progress read or write. */ - struct ReadOpContext { - MOSDOp *op; - vector& ops; - - object_info_t *poi; - int data_off; // FIXME: we may want to kill this msgr hint off at some point! - - ReadOpContext(MOSDOp *_op, vector& _ops, object_info_t *_poi) : - op(_op), ops(_ops), poi(_poi), data_off(0) {} - }; - - /* - * Capture all state associated with a write operation being processed - * on the current OSD. - */ - struct WriteOpContext { + struct OpContext { Message *op; + osd_reqid_t reqid; vector& ops; bufferlist& data; - sobject_t soid; - osd_reqid_t reqid; - utime_t mtime; - - SnapContext snapc; // writer snap context object_info_t *poi; + utime_t mtime; + SnapContext snapc; // writer snap context eversion_t at_version; // pg's current version pointer ObjectStore::Transaction t; - WriteOpContext(Message *_op, vector& _ops, bufferlist& _data, - sobject_t _soid, osd_reqid_t _reqid, utime_t _mtime) : - op(_op), ops(_ops), data(_data), soid(_soid), reqid(_reqid), mtime(_mtime), - poi(0) {} + int data_off; // FIXME: we may want to kill this msgr hint off at some point! + + OpContext(Message *_op, osd_reqid_t _reqid, vector& _ops, bufferlist& _data, + object_info_t *_poi) : + op(_op), reqid(_reqid), ops(_ops), data(_data), poi(_poi), + data_off(0) {} }; /* @@ -257,7 +242,7 @@ public: xlist::item queue_item; int nref; - WriteOpContext *ctx; + OpContext *ctx; ObjectContext *obc; tid_t rep_tid; @@ -275,7 +260,7 @@ public: eversion_t pg_local_last_complete; map pg_complete_thru; - RepGather(WriteOpContext *c, ObjectContext *pi, bool noop_, tid_t rt, + RepGather(OpContext *c, ObjectContext *pi, bool noop_, tid_t rt, eversion_t lc) : queue_item(this), nref(1), @@ -330,7 +315,7 @@ protected: void apply_repop(RepGather *repop); void eval_repop(RepGather*); void issue_repop(RepGather *repop, int dest, utime_t now); - RepGather *new_repop(WriteOpContext *ctx, ObjectContext *obc, bool noop, tid_t rep_tid); + RepGather *new_repop(OpContext *ctx, ObjectContext *obc, bool noop, tid_t rep_tid); void repop_ack(RepGather *repop, int result, int ack_type, int fromosd, eversion_t pg_complete_thru=eversion_t(0,0)); @@ -385,7 +370,7 @@ protected: int prepare_simple_op(ObjectStore::Transaction& t, osd_reqid_t reqid, pg_stat_t& st, sobject_t poid, __u64& old_size, bool& exists, object_info_t& oi, vector& ops, int opn, bufferlist::iterator& bp, SnapContext& snapc); - void prepare_transaction(WriteOpContext *ctx, bool& exists, __u64& size, eversion_t trim_to); + void prepare_transaction(OpContext *ctx, bool& exists, __u64& size, eversion_t trim_to); friend class C_OSD_ModifyCommit; friend class C_OSD_RepModifyCommit; @@ -405,7 +390,7 @@ protected: void op_read(MOSDOp *op, ObjectContext *obc); void op_modify(MOSDOp *op, ObjectContext *obc); - int do_read_ops(ReadOpContext *ctx, bufferlist::iterator& bp, bufferlist& data); + int do_read_ops(OpContext *ctx, bufferlist::iterator& bp, bufferlist& data); void sub_op_modify(MOSDSubOp *op); void sub_op_modify_reply(MOSDSubOpReply *reply); -- 2.39.5