mirror of
https://github.com/ceph/ceph
synced 2025-02-01 16:03:43 +00:00
osd: simplify dup/resent logic
No need to special ack path. Signed-off-by: Sage Weil <sage@redhat.com>
This commit is contained in:
parent
3269c52128
commit
abb29b35b0
@ -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()
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user