}).safe_then([&t, this] {
if (scan_cursor->is_complete()) {
t.mark_segment_to_release(scan_cursor->get_offset().segment);
+ mark_releasing(scan_cursor->get_offset().segment);
scan_cursor.reset();
}
return ExtentCallbackInterface::release_segment_ertr::now();
return state == Segment::segment_state_t::CLOSED;
}
+ bool is_releasing() const {
+ return state == Segment::segment_state_t::RELEASING;
+ }
+
bool is_open() const {
return state == Segment::segment_state_t::OPEN;
}
segments[segment].state = Segment::segment_state_t::CLOSED;
}
- void mark_empty(segment_id_t segment) {
+ void mark_releasing(segment_id_t segment) {
assert(segments.size() > segment);
assert(segments[segment].is_closed());
+ segments[segment].state = Segment::segment_state_t::RELEASING;
+ }
+
+
+ void mark_empty(segment_id_t segment) {
+ assert(segments.size() > segment);
+ assert(segments[segment].is_releasing());
assert(segments.size() > empty_segments);
++empty_segments;
if (space_tracker->get_usage(segment) != 0) {
lba_manager->complete_transaction(tref);
auto to_release = tref.get_segment_to_release();
if (to_release != NULL_SEG_ID) {
- segment_cleaner->mark_segment_released(to_release);
- return segment_manager.release(to_release);
+ return segment_manager.release(to_release
+ ).safe_then([this, to_release] {
+ segment_cleaner->mark_segment_released(to_release);
+ return SegmentManager::release_ertr::now();
+ });
} else {
return SegmentManager::release_ertr::now();
}