]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
os/bluestore: use normal Context for async deferred_try_submit 18118/head
authorSage Weil <sage@redhat.com>
Tue, 3 Oct 2017 21:48:37 +0000 (16:48 -0500)
committerSage Weil <sage@redhat.com>
Wed, 4 Oct 2017 21:54:02 +0000 (16:54 -0500)
I'm not quite sure why the FunctionContext did not ever execute on the
finisher thread (perhaps the [&] captured some state on the stack that it
shouldn't have?).  In any case, using a traditional Context here appears
to resolve the problem (of the async deferred_try_submit() never executing,
leading to a bluestore stall/deadlock).

Fixes: http://tracker.ceph.com/issues/21470
Signed-off-by: Sage Weil <sage@redhat.com>
src/os/bluestore/BlueStore.cc
src/os/bluestore/BlueStore.h

index f5a198a4de420f52a5433dba738a9c518ad0934c..fa12ddf826bdc13f2654d36c9f450dd1a36b26c8 100644 (file)
@@ -8792,6 +8792,14 @@ void BlueStore::_deferred_submit_unlock(OpSequencer *osr)
   bdev->aio_submit(&b->ioc);
 }
 
+struct C_DeferredTrySubmit : public Context {
+  BlueStore *store;
+  C_DeferredTrySubmit(BlueStore *s) : store(s) {}
+  void finish(int r) {
+    store->deferred_try_submit();
+  }
+};
+
 void BlueStore::_deferred_aio_finish(OpSequencer *osr)
 {
   dout(10) << __func__ << " osr " << osr << dendl;
@@ -8808,9 +8816,7 @@ void BlueStore::_deferred_aio_finish(OpSequencer *osr)
       deferred_queue.erase(q);
     } else if (deferred_aggressive) {
       dout(20) << __func__ << " queuing async deferred_try_submit" << dendl;
-      deferred_finisher.queue(new FunctionContext([&](int) {
-           deferred_try_submit();
-         }));
+      deferred_finisher.queue(new C_DeferredTrySubmit(this));
     } else {
       dout(20) << __func__ << " leaving queued, more pending" << dendl;
     }
index 0354454bc98dd49230ce550d8e7f2ecbcf864189..7d4bbc95bb7de49f16a8ce2aa3e1de4359451a8c 100644 (file)
@@ -2041,7 +2041,9 @@ private:
 
   bluestore_deferred_op_t *_get_deferred_op(TransContext *txc, OnodeRef o);
   void _deferred_queue(TransContext *txc);
+public:
   void deferred_try_submit();
+private:
   void _deferred_submit_unlock(OpSequencer *osr);
   void _deferred_aio_finish(OpSequencer *osr);
   int _deferred_replay();