From 67ec75805787ed63b35f8d70478a7a2cd785df06 Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Tue, 3 Oct 2017 16:48:37 -0500 Subject: [PATCH] os/bluestore: use normal Context for async deferred_try_submit 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 --- src/os/bluestore/BlueStore.cc | 12 +++++++++--- src/os/bluestore/BlueStore.h | 2 ++ 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/src/os/bluestore/BlueStore.cc b/src/os/bluestore/BlueStore.cc index f5a198a4de420..fa12ddf826bdc 100644 --- a/src/os/bluestore/BlueStore.cc +++ b/src/os/bluestore/BlueStore.cc @@ -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; } diff --git a/src/os/bluestore/BlueStore.h b/src/os/bluestore/BlueStore.h index 0354454bc98dd..7d4bbc95bb7de 100644 --- a/src/os/bluestore/BlueStore.h +++ b/src/os/bluestore/BlueStore.h @@ -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(); -- 2.39.5