Bug #64545
Updated by Samuel Just 3 months ago
<pre> void exit() final { if (barrier) { assert(phase); assert(phase->core == seastar::this_shard_id()); std::ignore = std::move(*barrier ).then([phase=this->phase] { phase->mutex.unlock(); }); barrier = std::nullopt; phase = nullptr; } else if (phase) { assert(phase->core == seastar::this_shard_id()); phase->mutex.unlock(); phase = nullptr; } } </pre> phase->mutex.unlock() can occur significantly after exit() finishes. *phase will generally be embedded in a PG or a Connection, so it's often but not always safe. https://tracker.ceph.com/issues/63647 https://tracker.ceph.com/issues/64513 was a more dangerous variant because *phase was part of the operation itself.