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/64513 was a more dangerous variant because *phase was part of the operation itself.