});
}
+RandomBlockOolWriter::alloc_write_iertr::future<>
+RandomBlockOolWriter::alloc_write_ool_extents(
+ Transaction& t,
+ std::list<LogicalCachedExtentRef>& extents)
+{
+ if (extents.empty()) {
+ return alloc_write_iertr::now();
+ }
+ return seastar::with_gate(write_guard, [this, &t, &extents] {
+ return do_write(t, extents);
+ });
+}
+
+RandomBlockOolWriter::alloc_write_iertr::future<>
+RandomBlockOolWriter::do_write(
+ Transaction& t,
+ std::list<LogicalCachedExtentRef>& extents)
+{
+ LOG_PREFIX(RandomBlockOolWriter::do_write);
+ assert(!extents.empty());
+ DEBUGT("start with {} allocated extents",
+ t, extents.size());
+ return trans_intr::do_for_each(extents,
+ [this, &t, FNAME](auto& ex) {
+ auto paddr = ex->get_paddr();
+ assert(paddr.is_absolute());
+ RandomBlockManager * rbm = rb_cleaner->get_rbm(paddr);
+ assert(rbm);
+ TRACE("extent {}, allocated addr {}", ex, paddr);
+ auto& stats = t.get_ool_write_stats();
+ stats.extents.num += 1;
+ stats.extents.bytes += ex->get_length();
+ stats.num_records += 1;
+
+ return rbm->write(paddr,
+ ex->get_bptr()
+ ).handle_error(
+ alloc_write_iertr::pass_further{},
+ crimson::ct_error::assert_all{
+ "Invalid error when writing record"}
+ ).safe_then([&t, &ex, paddr, FNAME]() {
+ TRACET("ool extent written at {} -- {}",
+ t, paddr, *ex);
+ t.mark_extent_ool(ex, paddr);
+ return alloc_write_iertr::now();
+ });
+ });
+}
+
}
seastar::gate write_guard;
};
+
+class RandomBlockOolWriter : public ExtentOolWriter {
+public:
+ RandomBlockOolWriter(RBMCleaner* rb_cleaner) :
+ rb_cleaner(rb_cleaner) {}
+
+ using open_ertr = ExtentOolWriter::open_ertr;
+ open_ertr::future<> open() final {
+ return open_ertr::now();
+ }
+
+ alloc_write_iertr::future<> alloc_write_ool_extents(
+ Transaction &t,
+ std::list<LogicalCachedExtentRef> &extents) final;
+
+ close_ertr::future<> close() final {
+ return write_guard.close().then([this] {
+ write_guard = seastar::gate();
+ return close_ertr::now();
+ });
+ }
+private:
+ alloc_write_iertr::future<> do_write(
+ Transaction& t,
+ std::list<LogicalCachedExtentRef> &extent);
+
+ RBMCleaner* rb_cleaner;
+ seastar::gate write_guard;
+};
+
class ExtentPlacementManager {
public:
ExtentPlacementManager() {