osd: simplify dup/resent logic

No need to special ack path.

Signed-off-by: Sage Weil <sage@redhat.com>
This commit is contained in:
Sage Weil 2016-12-20 15:54:18 -05:00
parent 3269c52128
commit abb29b35b0
4 changed files with 16 additions and 27 deletions

View File

@ -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()

View File

@ -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;

View File

@ -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<osd_reqid_t,pg_log_entry_t*>::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;

View File

@ -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;