From: Sage Weil Date: Mon, 29 Jan 2018 21:24:19 +0000 (-0600) Subject: Revert "osd/ECBackend: fix on_write ordering w/ sync onreadable callbacks" X-Git-Tag: v13.0.2~364^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=refs%2Fpull%2F20169%2Fhead;p=ceph.git Revert "osd/ECBackend: fix on_write ordering w/ sync onreadable callbacks" This reverts commit 1908c061496817ee6dbc483186a41a9b373be01c. Hoping this helps resolve the failed assertion src/osd/ExtentCache.h: 371: FAILED assert(tid == 0) Signed-off-by: Sage Weil --- diff --git a/src/osd/ECBackend.cc b/src/osd/ECBackend.cc index a5d9736b8817..c7b3b0406446 100644 --- a/src/osd/ECBackend.cc +++ b/src/osd/ECBackend.cc @@ -1497,26 +1497,14 @@ void ECBackend::submit_transaction( dout(10) << "onreadable_sync: " << op->on_local_applied_sync << dendl; } -void ECBackend::call_write_ordered(std::function &&cb) -{ - if (waiting_state.empty() && - waiting_reads.empty()) { - dout(10) << __func__ << " sync" << dendl; - cb(); +void ECBackend::call_write_ordered(std::function &&cb) { + if (!waiting_state.empty()) { + waiting_state.back().on_write.emplace_back(std::move(cb)); + } else if (!waiting_reads.empty()) { + waiting_reads.back().on_write.emplace_back(std::move(cb)); } else { - ceph_tid_t tid = parent->get_tid(); - Op& op = tid_to_op_map[tid]; - op.tid = tid; - op.on_write = std::move(cb); - if (!waiting_state.empty()) { - dout(10) << __func__ << " tid " << tid << " waiting_state" << dendl; - waiting_state.push_back(op); - } else if (!waiting_reads.empty()) { - dout(10) << __func__ << " tid " << tid << " waiting_reads" << dendl; - waiting_reads.push_back(op); - } else { - ceph_abort(); - } + // Nothing earlier in the pipeline, just call it + cb(); } } @@ -1897,12 +1885,6 @@ bool ECBackend::try_reads_to_commit() if (waiting_reads.empty()) return false; Op *op = &(waiting_reads.front()); - if (op->on_write) { - waiting_reads.pop_front(); - op->on_write(); - tid_to_op_map.erase(op->tid); - return true; - } if (op->read_in_progress()) return false; waiting_reads.pop_front(); @@ -2040,14 +2022,21 @@ bool ECBackend::try_reads_to_commit() } } if (should_write_local) { - handle_sub_write( - get_parent()->whoami_shard(), - op->client_op, - local_write_op, - op->trace, - op->on_local_applied_sync); - op->on_local_applied_sync = 0; + handle_sub_write( + get_parent()->whoami_shard(), + op->client_op, + local_write_op, + op->trace, + op->on_local_applied_sync); + op->on_local_applied_sync = 0; } + + for (auto i = op->on_write.begin(); + i != op->on_write.end(); + op->on_write.erase(i++)) { + (*i)(); + } + return true; } diff --git a/src/osd/ECBackend.h b/src/osd/ECBackend.h index ebd0ca6d8d9a..c0efe32f5150 100644 --- a/src/osd/ECBackend.h +++ b/src/osd/ECBackend.h @@ -469,7 +469,7 @@ public: map obc_map; /// see call_write_ordered - std::function on_write; + std::list > on_write; /// Generated internally set temp_added; @@ -507,10 +507,6 @@ public: Context *on_local_applied_sync = nullptr; Context *on_all_applied = nullptr; Context *on_all_commit = nullptr; - - Op() {} - Op(ceph_tid_t t, std::function&& cb) - : tid(t), on_write(cb) { } ~Op() { delete on_local_applied_sync; delete on_all_applied;