}
Cache::get_next_dirty_extents_ret Cache::get_next_dirty_extents(
- journal_seq_t seq)
+ journal_seq_t seq,
+ size_t max_bytes)
{
std::vector<CachedExtentRef> ret;
- for (auto i = dirty.begin(); i != dirty.end(); ++i) {
+ size_t bytes_so_far = 0;
+ for (auto i = dirty.begin();
+ i != dirty.end() && bytes_so_far < max_bytes;
+ ++i) {
CachedExtentRef cand;
if (i->dirty_from != journal_seq_t() && i->dirty_from < seq) {
logger().debug(
*i);
}
assert(ret.empty() || ret.back()->dirty_from <= i->dirty_from);
+ bytes_so_far += i->get_length();
ret.push_back(&*i);
} else {
break;
using get_next_dirty_extents_ret = get_next_dirty_extents_ertr::future<
std::vector<CachedExtentRef>>;
get_next_dirty_extents_ret get_next_dirty_extents(
- journal_seq_t seq);
+ journal_seq_t seq,
+ size_t max_bytes);
/// returns std::nullopt if no dirty extents or dirty_from for oldest
std::optional<journal_seq_t> get_oldest_dirty_from() const {
journal_seq_t limit)
{
return ecb->get_next_dirty_extents(
- limit
+ limit,
+ config.journal_rewrite_per_cycle
).then([=, &t](auto dirty_list) {
return seastar::do_with(
std::move(dirty_list),
double available_ratio_hard_limit = 0;
- size_t reclaim_bytes_stride = 0; // Number of bytes to reclaim on each cycle
+ /// Number of bytes to reclaim on each cycle
+ size_t reclaim_bytes_stride = 0;
+
+ /// Number of bytes of journal entries to rewrite per cycle
+ size_t journal_rewrite_per_cycle = 0;
static config_t default_from_segment_manager(
SegmentManager &manager) {
.6, // reclaim_ratio_hard_limit
.3, // reclaim_ratio_gc_threshhold
.1, // available_ratio_hard_limit
- 1<<20 // reclaim 1MB per gc cycle
+ 1<<20,// reclaim 1MB per gc cycle
+ 1<<20 // rewrite 1MB of journal entries per gc cycle
};
}
};
using get_next_dirty_extents_ret = get_next_dirty_extents_ertr::future<
std::vector<CachedExtentRef>>;
virtual get_next_dirty_extents_ret get_next_dirty_extents(
- journal_seq_t bound ///< [in] return extents with dirty_from < bound
+ journal_seq_t bound,///< [in] return extents with dirty_from < bound
+ size_t max_bytes ///< [in] return up to max_bytes of extents
) = 0;
using extent_mapping_ertr = crimson::errorator<
}
TransactionManager::get_next_dirty_extents_ret
-TransactionManager::get_next_dirty_extents(journal_seq_t seq)
+TransactionManager::get_next_dirty_extents(
+ journal_seq_t seq,
+ size_t max_bytes)
{
- return cache->get_next_dirty_extents(seq);
+ return cache->get_next_dirty_extents(seq, max_bytes);
}
TransactionManager::rewrite_extent_ret TransactionManager::rewrite_extent(
using SegmentCleaner::ExtentCallbackInterface::get_next_dirty_extents_ret;
get_next_dirty_extents_ret get_next_dirty_extents(
- journal_seq_t seq) final;
+ journal_seq_t seq,
+ size_t max_bytes) final;
using SegmentCleaner::ExtentCallbackInterface::rewrite_extent_ret;
rewrite_extent_ret rewrite_extent(