]>
git.proxmox.com Git - ceph.git/blob - ceph/src/crimson/os/seastore/segment_manager.cc
1 // -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
2 // vim: ts=8 sw=2 smarttab
4 #include "crimson/os/seastore/segment_manager.h"
5 #include "crimson/os/seastore/segment_manager/block.h"
6 #include "crimson/os/seastore/logging.h"
9 #include "crimson/os/seastore/segment_manager/zns.h"
10 SET_SUBSYS(seastore_device
);
14 namespace crimson::os::seastore
{
16 std::ostream
& operator<<(std::ostream
& out
, const block_shard_info_t
& sf
)
20 << ", segments=" <<sf
.segments
21 << ", tracker_offset=" <<sf
.tracker_offset
22 << ", first_segment_offset=" <<sf
.first_segment_offset
27 std::ostream
& operator<<(std::ostream
& out
, const block_sm_superblock_t
& sb
)
30 << "shard_num=" << sb
.shard_num
31 << ", segment_size=" << sb
.segment_size
32 << ", block_size=" << sb
.block_size
34 for (auto &sf
: sb
.shard_infos
) {
38 out
<< "config=" << sb
.config
43 std::ostream
& operator<<(std::ostream
&out
, Segment::segment_state_t s
)
45 using state_t
= Segment::segment_state_t
;
48 return out
<< "EMPTY";
52 return out
<< "CLOSED";
54 return out
<< "INVALID_SEGMENT_STATE!";
58 seastar::future
<crimson::os::seastore::SegmentManagerRef
>
59 SegmentManager::get_segment_manager(
60 const std::string
&device
, device_type_t dtype
)
63 LOG_PREFIX(SegmentManager::get_segment_manager
);
64 return seastar::do_with(
65 static_cast<size_t>(0),
67 return seastar::open_file_dma(
69 seastar::open_flags::rw
70 ).then([&](auto file
) {
71 return seastar::do_with(
73 [=, &nr_zones
](auto &f
) -> seastar::future
<int> {
75 return f
.ioctl(BLKGETNRZONES
, (void *)&nr_zones
);
77 }).then([&](auto ret
) -> crimson::os::seastore::SegmentManagerRef
{
78 crimson::os::seastore::SegmentManagerRef sm
;
79 INFO("Found {} zones.", nr_zones
);
81 return std::make_unique
<
82 segment_manager::zns::ZNSSegmentManager
85 return std::make_unique
<
86 segment_manager::block::BlockSegmentManager
87 >(device
+ "/block", dtype
);
92 return seastar::make_ready_future
<crimson::os::seastore::SegmentManagerRef
>(
94 segment_manager::block::BlockSegmentManager
95 >(device
+ "/block", dtype
));