}
public:
SpaceTrackerSimple(const SpaceTrackerSimple &) = default;
- SpaceTrackerSimple(std::vector<SegmentManager*> sms) {
+ SpaceTrackerSimple(const std::vector<SegmentManager*> &sms) {
for (auto sm : sms) {
- if (!sm) {
- // sms is a vector that is indexed by device id and
- // always has "max_device" elements, some of which
- // may be null.
- continue;
- }
live_bytes_by_segment.add_device(
sm->get_device_id(),
sm->get_num_segments(),
public:
SpaceTrackerDetailed(const SpaceTrackerDetailed &) = default;
- SpaceTrackerDetailed(std::vector<SegmentManager*> sms)
+ SpaceTrackerDetailed(const std::vector<SegmentManager*> &sms)
{
block_size_by_segment_manager.resize(DEVICE_ID_MAX, 0);
for (auto sm : sms) {
- // sms is a vector that is indexed by device id and
- // always has "max_device" elements, some of which
- // may be null.
- if (!sm) {
- continue;
- }
segment_usage.add_device(
sm->get_device_id(),
sm->get_num_segments(),
SegmentManagerGroup::read_segment_tail_ret
SegmentManagerGroup::read_segment_tail(segment_id_t segment)
{
+ assert(has_device(segment.device_id()));
auto& segment_manager = *segment_managers[segment.device_id()];
return segment_manager.read(
paddr_t::make_seg_paddr(
SegmentManagerGroup::read_segment_header_ret
SegmentManagerGroup::read_segment_header(segment_id_t segment)
{
+ assert(has_device(segment.device_id()));
auto& segment_manager = *segment_managers[segment.device_id()];
return segment_manager.read(
paddr_t::make_seg_paddr(segment, 0),
found_record_handler_t &handler)
{
LOG_PREFIX(SegmentManagerGroup::scan_valid_records);
+ assert(has_device(cursor.get_segment_id().device_id()));
auto& segment_manager =
*segment_managers[cursor.get_segment_id().device_id()];
if (cursor.get_segment_offset() == 0) {
{
LOG_PREFIX(SegmentManagerGroup::read_validate_record_metadata);
auto& seg_addr = start.as_seg_paddr();
+ assert(has_device(seg_addr.get_segment_id().device_id()));
auto& segment_manager = *segment_managers[seg_addr.get_segment_id().device_id()];
auto block_size = segment_manager.get_block_size();
auto segment_size = static_cast<int64_t>(segment_manager.get_segment_size());
const record_group_header_t &header)
{
LOG_PREFIX(SegmentManagerGroup::read_validate_data);
+ assert(has_device(record_base.get_device_id()));
auto& segment_manager = *segment_managers[record_base.get_device_id()];
auto data_addr = record_base.add_offset(header.mdlength);
TRACE("reading record group data blocks {}~{}", data_addr, header.dlength);
#pragma once
+#include <set>
+
#include "crimson/common/errorator.h"
#include "crimson/os/seastore/seastore_types.h"
#include "crimson/os/seastore/segment_manager.h"
class SegmentManagerGroup {
public:
- std::vector<SegmentManager*>& get_segment_managers() {
- return segment_managers;
+ SegmentManagerGroup() {
+ segment_managers.resize(DEVICE_ID_MAX, nullptr);
}
- using read_ertr = SegmentManager::read_ertr;
- SegmentManagerGroup() {
+ const std::set<device_id_t>& get_device_ids() const {
+ return device_ids;
+ }
+
+ std::vector<SegmentManager*> get_segment_managers() const {
+ assert(device_ids.size());
+ std::vector<SegmentManager*> ret;
+ for (auto& device_id : device_ids) {
+ auto segment_manager = segment_managers[device_id];
+ assert(segment_manager->get_device_id() == device_id);
+ ret.emplace_back(segment_manager);
+ }
+ return ret;
+ }
+
+ void add_segment_manager(SegmentManager* segment_manager) {
+ auto device_id = segment_manager->get_device_id();
+ ceph_assert(!has_device(device_id));
+ segment_managers[device_id] = segment_manager;
+ device_ids.insert(device_id);
+ }
+
+ void reset() {
+ segment_managers.clear();
segment_managers.resize(DEVICE_ID_MAX, nullptr);
+ device_ids.clear();
}
+
using read_segment_header_ertr = crimson::errorator<
crimson::ct_error::enoent,
crimson::ct_error::enodata,
* Returns list<extent, extent_info>
* cursor.is_complete() will be true when no further extents exist in segment.
*/
+ using read_ertr = SegmentManager::read_ertr;
using scan_extents_cursor = scan_valid_records_cursor;
using scan_extents_ertr = read_ertr::extend<crimson::ct_error::enodata>;
using scan_extents_ret_bare =
using release_ertr = SegmentManager::release_ertr;
release_ertr::future<> release_segment(segment_id_t id) {
- assert(segment_managers[id.device_id()] != nullptr);
+ assert(has_device(id.device_id()));
return segment_managers[id.device_id()]->release(id);
}
- void add_segment_manager(SegmentManager* segment_manager) {
- ceph_assert(!segment_managers[segment_manager->get_device_id()]);
- segment_managers[segment_manager->get_device_id()] = segment_manager;
- }
-
- void reset() {
- segment_managers.clear();
- segment_managers.resize(DEVICE_ID_MAX, nullptr);
+private:
+ bool has_device(device_id_t id) const {
+ assert(id <= DEVICE_ID_MAX_VALID);
+ return device_ids.count(id) >= 1;
}
-private:
- std::vector<SegmentManager*> segment_managers;
/// read record metadata for record starting at start
using read_validate_record_metadata_ertr = read_ertr;
using read_validate_record_metadata_ret =
scan_valid_records_cursor& cursor,
found_record_handler_t& handler,
std::size_t& budget_used);
+
+ std::vector<SegmentManager*> segment_managers;
+ std::set<device_id_t> device_ids;
};
using SegmentManagerGroupRef = std::unique_ptr<SegmentManagerGroup>;