Skip to content

Commit

Permalink
rgw: Don't hold mutex over yield in LazyFIFO
Browse files Browse the repository at this point in the history
If the FIFO doesn't exist, let clients race to create it, then stash
and use whoever wins.

Signed-off-by: Adam Emerson <aemerson@redhat.com>
  • Loading branch information
adamemerson committed Dec 21, 2023
1 parent 86bb77e commit f8ef9c2
Showing 1 changed file with 17 additions and 5 deletions.
22 changes: 17 additions & 5 deletions src/rgw/driver/rados/rgw_log_backing.h
Expand Up @@ -262,12 +262,24 @@ class LazyFIFO {

int lazy_init(const DoutPrefixProvider *dpp, optional_yield y) {
std::unique_lock l(m);
if (fifo) return 0;
auto r = rgw::cls::fifo::FIFO::create(dpp, ioctx, oid, &fifo, y);
if (r) {
fifo.reset();
if (fifo) {
return 0;
} else {
l.unlock();
// FIFO supports multiple clients by design, so it's safe to
// race to create them.
std::unique_ptr<rgw::cls::fifo::FIFO> fifo_tmp;
auto r = rgw::cls::fifo::FIFO::create(dpp, ioctx, oid, &fifo, y);
if (r) {
return r;
}
l.lock();
if (!fifo) {
// We won the race
fifo = std::move(fifo_tmp);
}
}
return r;
return 0;
}

public:
Expand Down

0 comments on commit f8ef9c2

Please sign in to comment.