});
}
- return segment_provider.get_segment(
- segment_manager.get_device_id(), OOL_SEG_SEQ
- ).safe_then([this](auto segment) {
- return segment_manager.open(segment);
- }).safe_then([this](auto segref) {
+ auto new_segment_id = segment_provider.get_segment(
+ segment_manager.get_device_id(), OOL_SEG_SEQ);
+ return segment_manager.open(new_segment_id
+ ).safe_then([this](auto segref) {
LOG_PREFIX(SegmentedAllocator::Writer::roll_segment);
DEBUG("opened new segment: {}", segref->get_segment_id());
return init_segment(*segref).safe_then([segref=std::move(segref), this] {
current_journal_segment->close() :
Segment::close_ertr::now()
).safe_then([this] {
- return segment_provider.get_segment(
+ auto new_segment_id = segment_provider->get_segment(
get_device_id(), next_journal_segment_seq);
- }).safe_then([this](auto segment) {
- return segment_manager.open(segment);
+ return segment_manager.open(new_segment_id);
}).safe_then([this](auto sref) {
current_journal_segment = sref;
return initialize_segment(*current_journal_segment);
});
}
-SegmentCleaner::get_segment_ret SegmentCleaner::get_segment(
- device_id_t id, segment_seq_t seq)
+segment_id_t SegmentCleaner::get_segment(
+ device_id_t device_id, segment_seq_t seq)
{
+ LOG_PREFIX(SegmentCleaner::get_segment);
assert(segment_seq_to_type(seq) != segment_type_t::NULL_SEG);
- for (auto it = segments.device_begin(id);
- it != segments.device_end(id);
+ for (auto it = segments.device_begin(device_id);
+ it != segments.device_end(device_id);
++it) {
- auto id = it->first;
+ auto seg_id = it->first;
auto& segment_info = it->second;
if (segment_info.is_empty()) {
- logger().debug("{}: returning segment {} {}",
- __func__, id, segment_seq_printer_t{seq});
- mark_open(id, seq);
- return get_segment_ret(
- get_segment_ertr::ready_future_marker{},
- id);
+ DEBUG("returning segment {} {}", seg_id, segment_seq_printer_t{seq});
+ mark_open(seg_id, seq);
+ return seg_id;
}
}
- assert(0 == "out of space handling todo");
- return get_segment_ret(
- get_segment_ertr::ready_future_marker{},
- NULL_SEG_ID);
+ ERROR("(TODO) handle out of space from device {} with segment_seq={}",
+ device_id, segment_seq_printer_t{seq});
+ ceph_abort();
+ return NULL_SEG_ID;
}
void SegmentCleaner::update_journal_tail_target(journal_seq_t target)
*/
class SegmentProvider {
public:
- using get_segment_ertr = crimson::errorator<
- crimson::ct_error::input_output_error>;
- using get_segment_ret = get_segment_ertr::future<segment_id_t>;
- virtual get_segment_ret get_segment(
+ virtual segment_id_t get_segment(
device_id_t id, segment_seq_t seq) = 0;
virtual void close_segment(segment_id_t) {}
using mount_ret = mount_ertr::future<>;
mount_ret mount(device_id_t pdevice_id, std::vector<SegmentManager*>& sms);
- get_segment_ret get_segment(
+ segment_id_t get_segment(
device_id_t id, segment_seq_t seq) final;
void close_segment(segment_id_t segment) final;
void update_segment_avail_bytes(paddr_t offset) final {}
- get_segment_ret get_segment(device_id_t id, segment_seq_t seq) final {
+ segment_id_t get_segment(device_id_t id, segment_seq_t seq) final {
auto ret = next;
next = segment_id_t{
next.device_id(),
next.device_segment_id() + 1};
- return get_segment_ret(
- get_segment_ertr::ready_future_marker{},
- ret);
+ return ret;
}
journal_seq_t get_journal_tail_target() const final { return journal_seq_t{}; }
void update_segment_avail_bytes(paddr_t offset) final {}
- get_segment_ret get_segment(device_id_t id, segment_seq_t seq) final {
+ segment_id_t get_segment(device_id_t id, segment_seq_t seq) final {
auto ret = next;
next = segment_id_t{
next.device_id(),
next.device_segment_id() + 1};
- return get_segment_ret(
- get_segment_ertr::ready_future_marker{},
- ret);
+ return ret;
}
journal_seq_t get_journal_tail_target() const final { return journal_seq_t{}; }