Skip to content

Commit 262ed46

Browse files
authored
Merge pull request ceph#57858 from adamemerson/wip-66340
rgw/multisite: Fix use-after-move in retry logic in logbacking Reviewed-by: Yuval Lifshitz <[email protected]> Reviewed-by: Suyash Dongre <[email protected]>
2 parents 4476126 + 80cf2ca commit 262ed46

File tree

1 file changed

+16
-10
lines changed

1 file changed

+16
-10
lines changed

src/rgw/driver/rados/rgw_log_backing.cc

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -444,13 +444,17 @@ bs::error_code logback_generations::write(const DoutPrefixProvider *dpp, entries
444444
encode(e, bl);
445445
op.write_full(bl);
446446
cls_version_inc(op);
447+
auto oldv = version;
448+
l.unlock();
447449
auto r = rgw_rados_operate(dpp, ioctx, oid, &op, y);
448450
if (r == 0) {
451+
if (oldv != version) {
452+
return { ECANCELED, bs::system_category() };
453+
}
449454
entries_ = std::move(e);
450455
version.inc();
451456
return {};
452457
}
453-
l.unlock();
454458
if (r < 0 && r != -ECANCELED) {
455459
ldpp_dout(dpp, -1) << __PRETTY_FUNCTION__ << ":" << __LINE__
456460
<< ": failed reading oid=" << oid
@@ -609,17 +613,19 @@ bs::error_code logback_generations::remove_empty(const DoutPrefixProvider *dpp,
609613
if (ec) return ec;
610614
auto tries = 0;
611615
entries_t new_entries;
612-
std::unique_lock l(m);
613-
ceph_assert(!entries_.empty());
616+
entries_t es;
617+
auto now = ceph::real_clock::now();
614618
{
615-
auto i = lowest_nomempty(entries_);
616-
if (i == entries_.begin()) {
617-
return {};
619+
std::unique_lock l(m);
620+
ceph_assert(!entries_.empty());
621+
{
622+
auto i = lowest_nomempty(entries_);
623+
if (i == entries_.begin()) {
624+
return {};
625+
}
618626
}
627+
l.unlock();
619628
}
620-
entries_t es;
621-
auto now = ceph::real_clock::now();
622-
l.unlock();
623629
do {
624630
std::copy_if(entries_.cbegin(), entries_.cend(),
625631
std::inserter(es, es.end()),
@@ -646,7 +652,7 @@ bs::error_code logback_generations::remove_empty(const DoutPrefixProvider *dpp,
646652
es2.erase(i);
647653
}
648654
}
649-
l.lock();
655+
std::unique_lock l(m);
650656
es.clear();
651657
ec = write(dpp, std::move(es2), std::move(l), y);
652658
++tries;

0 commit comments

Comments
 (0)