diff --git a/src/crimson/osd/object_context.h b/src/crimson/osd/object_context.h index 7e14ac3e16f..335d26a21e9 100644 --- a/src/crimson/osd/object_context.h +++ b/src/crimson/osd/object_context.h @@ -111,18 +111,28 @@ private: make_blocking_future(std::forward(lockf))); } + template + auto _with_lock(Lock&& lock, Func&& func) { + Ref obc = this; + return lock.lock().then([&lock, func = std::forward(func), obc]() mutable { + return seastar::futurize_invoke(func).finally([&lock, obc] { + lock.unlock(); + }); + }); + } + public: template auto with_lock(Func&& func) { switch (Type) { case RWState::RWWRITE: - return seastar::with_lock(lock.for_write(), std::forward(func)); + return _with_lock(lock.for_write(), std::forward(func)); case RWState::RWREAD: - return seastar::with_lock(lock.for_read(), std::forward(func)); + return _with_lock(lock.for_read(), std::forward(func)); case RWState::RWEXCL: - return seastar::with_lock(lock.for_excl(), std::forward(func)); + return _with_lock(lock.for_excl(), std::forward(func)); case RWState::RWNONE: - return seastar::futurize_invoke(func); + return seastar::futurize_invoke(std::forward(func)); default: assert(0 == "noop"); } @@ -131,11 +141,11 @@ public: auto with_promoted_lock(Func&& func) { switch (Type) { case RWState::RWWRITE: - return seastar::with_lock(lock.excl_from_write(), std::forward(func)); + return _with_lock(lock.excl_from_write(), std::forward(func)); case RWState::RWREAD: - return seastar::with_lock(lock.excl_from_read(), std::forward(func)); + return _with_lock(lock.excl_from_read(), std::forward(func)); case RWState::RWEXCL: - return seastar::with_lock(lock.excl_from_excl(), std::forward(func)); + return _with_lock(lock.excl_from_excl(), std::forward(func)); default: assert(0 == "noop"); }