From abb29b35b000e394a441d6796adf0027d0ec08ae Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Tue, 20 Dec 2016 15:54:18 -0500 Subject: [PATCH] osd: simplify dup/resent logic No need to special ack path. Signed-off-by: Sage Weil --- src/osd/PG.cc | 6 +++--- src/osd/PG.h | 2 +- src/osd/PGLog.h | 8 ++++---- src/osd/PrimaryLogPG.cc | 27 ++++++++------------------- 4 files changed, 16 insertions(+), 27 deletions(-) diff --git a/src/osd/PG.cc b/src/osd/PG.cc index 6ae86eb2a95..7e60d7dea42 100644 --- a/src/osd/PG.cc +++ b/src/osd/PG.cc @@ -2435,13 +2435,13 @@ void PG::update_heartbeat_peers() bool PG::check_in_progress_op( const osd_reqid_t &r, - eversion_t *replay_version, + eversion_t *version, version_t *user_version, int *return_code) const { return ( - projected_log.get_request(r, replay_version, user_version, return_code) || - pg_log.get_log().get_request(r, replay_version, user_version, return_code)); + projected_log.get_request(r, version, user_version, return_code) || + pg_log.get_log().get_request(r, version, user_version, return_code)); } void PG::_update_calc_stats() diff --git a/src/osd/PG.h b/src/osd/PG.h index 5c5c4aea79c..0e377deeb2a 100644 --- a/src/osd/PG.h +++ b/src/osd/PG.h @@ -2217,7 +2217,7 @@ public: PGLog::IndexedLog projected_log; bool check_in_progress_op( const osd_reqid_t &r, - eversion_t *replay_version, + eversion_t *version, version_t *user_version, int *return_code) const; eversion_t projected_last_update; diff --git a/src/osd/PGLog.h b/src/osd/PGLog.h index 17fb39d405a..713d3d8ce35 100644 --- a/src/osd/PGLog.h +++ b/src/osd/PGLog.h @@ -258,10 +258,10 @@ public: bool get_request( const osd_reqid_t &r, - eversion_t *replay_version, + eversion_t *version, version_t *user_version, int *return_code) const { - assert(replay_version); + assert(version); assert(user_version); assert(return_code); ceph::unordered_map::const_iterator p; @@ -270,7 +270,7 @@ public: } p = caller_ops.find(r); if (p != caller_ops.end()) { - *replay_version = p->second->version; + *version = p->second->version; *user_version = p->second->user_version; *return_code = p->second->return_code; return true; @@ -288,7 +288,7 @@ public: i != p->second->extra_reqids.end(); ++i) { if (i->first == r) { - *replay_version = p->second->version; + *version = p->second->version; *user_version = i->second; *return_code = p->second->return_code; return true; diff --git a/src/osd/PrimaryLogPG.cc b/src/osd/PrimaryLogPG.cc index e0ed6192dd1..87f6cb5a51c 100644 --- a/src/osd/PrimaryLogPG.cc +++ b/src/osd/PrimaryLogPG.cc @@ -1949,38 +1949,27 @@ void PrimaryLogPG::do_op(OpRequestRef& op) return; } - // dup/replay? + // dup/resent? if (op->may_write() || op->may_cache()) { // warning: we will get back *a* request for this reqid, but not // necessarily the most recent. this happens with flush and // promote ops, but we can't possible have both in our log where // the original request is still not stable on disk, so for our // purposes here it doesn't matter which one we get. - eversion_t replay_version; + eversion_t version; version_t user_version; int return_code = 0; bool got = check_in_progress_op( - m->get_reqid(), &replay_version, &user_version, &return_code); + m->get_reqid(), &version, &user_version, &return_code); if (got) { dout(3) << __func__ << " dup " << m->get_reqid() - << " was " << replay_version << dendl; - if (already_complete(replay_version)) { - osd->reply_op_error(op, return_code, replay_version, user_version); + << " version " << version << dendl; + if (already_complete(version)) { + osd->reply_op_error(op, return_code, version, user_version); } else { - if (m->wants_ack()) { - if (already_ack(replay_version)) { - MOSDOpReply *reply = new MOSDOpReply(m, 0, get_osdmap()->get_epoch(), 0, false); - reply->add_flags(CEPH_OSD_FLAG_ACK); - reply->set_reply_versions(replay_version, user_version); - osd->send_message_osd_client(reply, m->get_connection()); - } else { - dout(10) << " waiting for " << replay_version << " to ack" << dendl; - waiting_for_ack[replay_version].push_back(make_pair(op, user_version)); - } - } - dout(10) << " waiting for " << replay_version << " to commit" << dendl; + dout(10) << " waiting for " << version << " to commit" << dendl; // always queue ondisk waiters, so that we can requeue if needed - waiting_for_ondisk[replay_version].push_back(make_pair(op, user_version)); + waiting_for_ondisk[version].push_back(make_pair(op, user_version)); op->mark_delayed("waiting for ondisk"); } return;