bool get_request(
const osd_reqid_t &r,
eversion_t *replay_version,
- version_t *user_version) const {
+ version_t *user_version,
+ int *return_code) const {
assert(replay_version);
assert(user_version);
+ assert(return_code);
ceph::unordered_map<osd_reqid_t,pg_log_entry_t*>::const_iterator p;
if (!(indexed_data & PGLOG_INDEXED_CALLER_OPS)) {
index_caller_ops();
if (p != caller_ops.end()) {
*replay_version = p->second->version;
*user_version = p->second->user_version;
+ *return_code = p->second->return_code;
return true;
}
if (i->first == r) {
*replay_version = p->second->version;
*user_version = i->second;
+ *return_code = p->second->return_code;
return true;
}
}
// purposes here it doesn't matter which one we get.
eversion_t replay_version;
version_t user_version;
+ int return_code = 0;
bool got = pg_log.get_log().get_request(
- m->get_reqid(), &replay_version, &user_version);
+ m->get_reqid(), &replay_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, 0, replay_version, user_version);
+ if (return_code < 0 || already_complete(replay_version)) {
+ osd->reply_op_error(op, return_code, replay_version, user_version);
} else {
if (m->wants_ack()) {
if (already_ack(replay_version)) {