SegmentedAllocator::SegmentedAllocator(
SegmentProvider& sp,
SegmentManager& sm)
- : rewriter(sp, sm)
+ : cold_writer{"COLD", sp, sm},
+ rewrite_writer{"REWRITE", sp, sm}
{
- std::generate_n(
- std::back_inserter(writers),
- crimson::common::get_conf<uint64_t>(
- "seastore_init_write_segments_num_per_device"),
- [&] {
- return Writer{sp, sm};
- }
- );
}
SegmentedAllocator::Writer::Writer(
+ std::string name,
SegmentProvider& sp,
SegmentManager& sm)
- : segment_allocator("OOL", segment_type_t::OOL, sp, sm),
+ : segment_allocator(name, segment_type_t::OOL, sp, sm),
record_submitter(crimson::common::get_conf<uint64_t>(
"seastore_journal_iodepth_limit"),
crimson::common::get_conf<uint64_t>(
class SegmentedAllocator : public ExtentAllocator {
class Writer : public ExtentOolWriter {
public:
- Writer(SegmentProvider& sp, SegmentManager& sm);
+ Writer(std::string name, SegmentProvider& sp, SegmentManager& sm);
Writer(Writer &&) = default;
open_ertr::future<> open() final;
SegmentManager& sm);
Writer &get_writer(placement_hint_t hint) {
- if (hint == placement_hint_t::REWRITE) {
- return rewriter;
+ assert(hint >= placement_hint_t::COLD);
+ assert(hint < placement_hint_t::NUM_HINTS);
+ if (hint == placement_hint_t::COLD) {
+ return cold_writer;
} else {
- return writers[std::rand() % writers.size()];
+ assert(hint == placement_hint_t::REWRITE);
+ return rewrite_writer;
}
}
open_ertr::future<> open() {
- return crimson::do_for_each(writers, [](auto& writer) {
- return writer.open();
+ return cold_writer.open(
+ ).safe_then([this] {
+ return rewrite_writer.open();
});
}
}
stop_ertr::future<> stop() {
- return crimson::do_for_each(writers, [](auto& writer) {
- return writer.stop();
+ return cold_writer.stop(
+ ).safe_then([this] {
+ return rewrite_writer.stop();
});
}
private:
- Writer rewriter;
- std::vector<Writer> writers;
+ // TODO:
+ // - hot_writer
+ // - a map of hint -> writer
+ Writer cold_writer;
+ Writer rewrite_writer;
};
class ExtentPlacementManager {
std::move(bp)};
}
- // FIXME: set delay for COLD extent when the record overhead is low
+ // FIXME: set delay for COLD extent and improve GC
// NOTE: delay means to delay the decision about whether to write the
// extent as inline or out-of-line extents.
bool delay = (hint > placement_hint_t::COLD &&