encode(e, bl);
op.write_full(bl);
cls_version_inc(op);
+ auto oldv = version;
+ l.unlock();
auto r = rgw_rados_operate(dpp, ioctx, oid, &op, y);
if (r == 0) {
+ if (oldv != version) {
+ return { ECANCELED, bs::system_category() };
+ }
entries_ = std::move(e);
version.inc();
return {};
}
- l.unlock();
if (r < 0 && r != -ECANCELED) {
ldpp_dout(dpp, -1) << __PRETTY_FUNCTION__ << ":" << __LINE__
<< ": failed reading oid=" << oid
if (ec) return ec;
auto tries = 0;
entries_t new_entries;
- std::unique_lock l(m);
- ceph_assert(!entries_.empty());
+ entries_t es;
+ auto now = ceph::real_clock::now();
{
- auto i = lowest_nomempty(entries_);
- if (i == entries_.begin()) {
- return {};
+ std::unique_lock l(m);
+ ceph_assert(!entries_.empty());
+ {
+ auto i = lowest_nomempty(entries_);
+ if (i == entries_.begin()) {
+ return {};
+ }
}
+ l.unlock();
}
- entries_t es;
- auto now = ceph::real_clock::now();
- l.unlock();
do {
std::copy_if(entries_.cbegin(), entries_.cend(),
std::inserter(es, es.end()),
es2.erase(i);
}
}
- l.lock();
+ std::unique_lock l(m);
es.clear();
ec = write(dpp, std::move(es2), std::move(l), y);
++tries;