#include "crimson/common/errorator.h"
#include "crimson/os/seastore/seastore_types.h"
#include "crimson/os/seastore/segment_manager.h"
+#include "crimson/os/seastore/record_scanner.h"
namespace crimson::os::seastore {
-class SegmentManagerGroup {
+class SegmentManagerGroup : public RecordScanner {
public:
SegmentManagerGroup() {
segment_managers.resize(DEVICE_ID_MAX, nullptr);
segment_tail_t>;
read_segment_tail_ret read_segment_tail(segment_id_t segment);
- using read_ertr = SegmentManager::read_ertr;
- using scan_valid_records_ertr = read_ertr;
- using scan_valid_records_ret = scan_valid_records_ertr::future<
- size_t>;
- using found_record_handler_t = std::function<
- scan_valid_records_ertr::future<>(
- record_locator_t record_locator,
- // callee may assume header and bl will remain valid until
- // returned future resolves
- const record_group_header_t &header,
- const bufferlist &mdbuf)>;
- scan_valid_records_ret scan_valid_records(
- scan_valid_records_cursor &cursor, ///< [in, out] cursor, updated during call
- segment_nonce_t nonce, ///< [in] nonce for segment
- size_t budget, ///< [in] max budget to use
- found_record_handler_t &handler ///< [in] handler for records
- ); ///< @return used budget
-
/*
* read journal segment headers
*/
return device_ids.count(id) >= 1;
}
- /// read record metadata for record starting at start
- using read_validate_record_metadata_ertr = read_ertr;
- using read_validate_record_metadata_ret =
- read_validate_record_metadata_ertr::future<
- std::optional<std::pair<record_group_header_t, bufferlist>>
- >;
- read_validate_record_metadata_ret read_validate_record_metadata(
- paddr_t start,
- segment_nonce_t nonce);
-
- /// read and validate data
- using read_validate_data_ertr = read_ertr;
- using read_validate_data_ret = read_validate_data_ertr::future<bool>;
- read_validate_data_ret read_validate_data(
- paddr_t record_base,
- const record_group_header_t &header ///< caller must ensure lifetime through
- /// future resolution
- );
-
- using consume_record_group_ertr = scan_valid_records_ertr;
- consume_record_group_ertr::future<> consume_next_records(
- scan_valid_records_cursor& cursor,
- found_record_handler_t& handler,
- std::size_t& budget_used);
+ void initialize_cursor(scan_valid_records_cursor &cursor) final;
+
+ read_ret read(paddr_t start, size_t len) final;
+
+ bool is_record_segment_seq_invalid(scan_valid_records_cursor &cursor,
+ record_group_header_t &header) final {
+ return false;
+ }
+
+ int64_t get_segment_end_offset(paddr_t addr) final {
+ auto& seg_addr = addr.as_seg_paddr();
+ auto& segment_manager = *segment_managers[seg_addr.get_segment_id().device_id()];
+ return static_cast<int64_t>(segment_manager.get_segment_size());
+ }
std::vector<SegmentManager*> segment_managers;
std::set<device_id_t> device_ids;