]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
Revert "osd/ECBackend: fix on_write ordering w/ sync onreadable callbacks" 20169/head
authorSage Weil <sage@redhat.com>
Mon, 29 Jan 2018 21:24:19 +0000 (15:24 -0600)
committerSage Weil <sage@redhat.com>
Mon, 29 Jan 2018 21:24:19 +0000 (15:24 -0600)
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 <sage@redhat.com>
src/osd/ECBackend.cc
src/osd/ECBackend.h

index a5d9736b88176f86e743a346240ea50ed378a5ac..c7b3b0406446d015f6124a84e6e1b6cd5b250168 100644 (file)
@@ -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<void(void)> &&cb)
-{
-  if (waiting_state.empty() &&
-      waiting_reads.empty()) {
-    dout(10) << __func__ << " sync" << dendl;
-    cb();
+void ECBackend::call_write_ordered(std::function<void(void)> &&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;
 }
 
index ebd0ca6d8d9a27029f2f0e5785e4c8d654b14a14..c0efe32f51508ca5cbadb3243f5ccd09116ae07e 100644 (file)
@@ -469,7 +469,7 @@ public:
     map<hobject_t, ObjectContextRef> obc_map;
 
     /// see call_write_ordered
-    std::function<void(void)> on_write;
+    std::list<std::function<void(void)> > on_write;
 
     /// Generated internally
     set<hobject_t> 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<void(void)>&& cb)
-      : tid(t), on_write(cb) { }
     ~Op() {
       delete on_local_applied_sync;
       delete on_all_applied;