}
for (auto i = es.begin(); i < ei; ++i) {
newtail = i->first;
- i->second.empty = true;
+ i->second.pruned = ceph::real_clock::now();
}
ec = write(std::move(es), std::move(l), y);
++tries;
entries_t new_entries;
std::unique_lock l(m);
ceph_assert(!entries_.empty());
- auto i = lowest_nomempty(entries_);
- if (i == entries_.begin()) {
- return {};
+ {
+ auto i = lowest_nomempty(entries_);
+ if (i == entries_.begin()) {
+ return {};
+ }
}
- auto ln = i->first;
entries_t es;
- std::copy(entries_.cbegin(), i,
- std::inserter(es, es.end()));
+ auto now = ceph::real_clock::now();
l.unlock();
do {
+ std::copy_if(entries_.cbegin(), entries_.cend(),
+ std::inserter(es, es.end()),
+ [now](const auto& e) {
+ if (!e.second.pruned)
+ return false;
+
+ auto pruned = *e.second.pruned;
+ return (now - pruned) >= 1h;
+ });
+ auto es2 = entries_;
for (const auto& [gen_id, e] : es) {
- ceph_assert(e.empty);
+ ceph_assert(e.pruned);
auto ec = log_remove(ioctx, shards,
[this, gen_id](int shard) {
return this->get_oid(gen_id, shard);
}, (gen_id == 0), y);
if (ec) {
- return ec;
+ lderr(cct) << __PRETTY_FUNCTION__ << ":" << __LINE__
+ << ": Error pruning: gen_id=" << gen_id
+ << " ec=" << ec.message() << dendl;
+ }
+ if (auto i = es2.find(gen_id); i != es2.end()) {
+ es2.erase(i);
}
}
l.lock();
- i = entries_.find(ln);
es.clear();
- std::copy(i, entries_.cend(), std::inserter(es, es.end()));
- ec = write(std::move(es), std::move(l), y);
+ ec = write(std::move(es2), std::move(l), y);
++tries;
} while (ec == bs::errc::operation_canceled &&
tries < max_tries);
ASSERT_EQ(0, lg->got_entries[0].gen_id);
ASSERT_EQ(log_type::fifo, lg->got_entries[0].type);
- ASSERT_FALSE(lg->got_entries[0].empty);
+ ASSERT_FALSE(lg->got_entries[0].pruned);
auto ec = lg->empty_to(0, null_yield);
ASSERT_TRUE(ec);
ASSERT_EQ(0, lg->got_entries[0].gen_id);
ASSERT_EQ(log_type::fifo, lg->got_entries[0].type);
- ASSERT_FALSE(lg->got_entries[0].empty);
+ ASSERT_FALSE(lg->got_entries[0].pruned);
lg->got_entries.clear();
ASSERT_EQ(1, lg->got_entries.size());
ASSERT_EQ(1, lg->got_entries[1].gen_id);
ASSERT_EQ(log_type::omap, lg->got_entries[1].type);
- ASSERT_FALSE(lg->got_entries[1].empty);
+ ASSERT_FALSE(lg->got_entries[1].pruned);
lg.reset();
ASSERT_EQ(2, lg->got_entries.size());
ASSERT_EQ(0, lg->got_entries[0].gen_id);
ASSERT_EQ(log_type::fifo, lg->got_entries[0].type);
- ASSERT_FALSE(lg->got_entries[0].empty);
+ ASSERT_FALSE(lg->got_entries[0].pruned);
ASSERT_EQ(1, lg->got_entries[1].gen_id);
ASSERT_EQ(log_type::omap, lg->got_entries[1].type);
- ASSERT_FALSE(lg->got_entries[1].empty);
+ ASSERT_FALSE(lg->got_entries[1].pruned);
ec = lg->empty_to(0, null_yield);
ASSERT_FALSE(ec);
ASSERT_EQ(1, lg->got_entries.size());
ASSERT_EQ(1, lg->got_entries[1].gen_id);
ASSERT_EQ(log_type::omap, lg->got_entries[1].type);
- ASSERT_FALSE(lg->got_entries[1].empty);
+ ASSERT_FALSE(lg->got_entries[1].pruned);
ec = lg->remove_empty(null_yield);
ASSERT_FALSE(ec);
ASSERT_EQ(1, entries[1].gen_id);
ASSERT_EQ(log_type::omap, entries[1].type);
- ASSERT_FALSE(entries[1].empty);
+ ASSERT_FALSE(entries[1].pruned);
lg.reset();
}
ASSERT_EQ(1, lg1->got_entries.size());
ASSERT_EQ(1, lg1->got_entries[1].gen_id);
ASSERT_EQ(log_type::omap, lg1->got_entries[1].type);
- ASSERT_FALSE(lg1->got_entries[1].empty);
+ ASSERT_FALSE(lg1->got_entries[1].pruned);
lg1->got_entries.clear();
ASSERT_EQ(0, lg2->got_entries[0].gen_id);
ASSERT_EQ(log_type::fifo, lg2->got_entries[0].type);
- ASSERT_FALSE(lg2->got_entries[0].empty);
+ ASSERT_FALSE(lg2->got_entries[0].pruned);
ASSERT_EQ(1, lg2->got_entries[1].gen_id);
ASSERT_EQ(log_type::omap, lg2->got_entries[1].type);
- ASSERT_FALSE(lg2->got_entries[1].empty);
+ ASSERT_FALSE(lg2->got_entries[1].pruned);
lg2->got_entries.clear();
ASSERT_EQ(1, lg1->got_entries.size());
ASSERT_EQ(2, lg1->got_entries[2].gen_id);
ASSERT_EQ(log_type::fifo, lg1->got_entries[2].type);
- ASSERT_FALSE(lg1->got_entries[2].empty);
+ ASSERT_FALSE(lg1->got_entries[2].pruned);
ASSERT_EQ(1, lg2->got_entries.size());
ASSERT_EQ(2, lg2->got_entries[2].gen_id);
ASSERT_EQ(log_type::fifo, lg2->got_entries[2].type);
- ASSERT_FALSE(lg2->got_entries[2].empty);
+ ASSERT_FALSE(lg2->got_entries[2].pruned);
lg1->got_entries.clear();
lg2->got_entries.clear();