@@ -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