]>
Commit | Line | Data |
---|---|---|
20effc67 TL |
1 | // -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*- |
2 | // vim: ts=8 sw=2 smarttab | |
3 | ||
4 | #include "crimson/os/seastore/segment_manager.h" | |
5 | #include "crimson/os/seastore/segment_manager/block.h" | |
1e59de90 | 6 | #include "crimson/os/seastore/logging.h" |
20effc67 TL |
7 | |
8 | #ifdef HAVE_ZNS | |
aee94f69 | 9 | #include "crimson/os/seastore/segment_manager/zbd.h" |
1e59de90 | 10 | SET_SUBSYS(seastore_device); |
20effc67 TL |
11 | #endif |
12 | ||
20effc67 TL |
13 | |
14 | namespace crimson::os::seastore { | |
15 | ||
1e59de90 | 16 | std::ostream& operator<<(std::ostream& out, const block_shard_info_t& sf) |
20effc67 | 17 | { |
1e59de90 TL |
18 | out << "(" |
19 | << "size=" << sf.size | |
20 | << ", segments=" <<sf.segments | |
21 | << ", tracker_offset=" <<sf.tracker_offset | |
22 | << ", first_segment_offset=" <<sf.first_segment_offset | |
23 | <<")"; | |
24 | return out; | |
20effc67 TL |
25 | } |
26 | ||
27 | std::ostream& operator<<(std::ostream& out, const block_sm_superblock_t& sb) | |
28 | { | |
29 | out << "superblock(" | |
1e59de90 | 30 | << "shard_num=" << sb.shard_num |
20effc67 TL |
31 | << ", segment_size=" << sb.segment_size |
32 | << ", block_size=" << sb.block_size | |
1e59de90 TL |
33 | << ", shard_info:"; |
34 | for (auto &sf : sb.shard_infos) { | |
35 | out << sf | |
36 | << ","; | |
20effc67 | 37 | } |
1e59de90 TL |
38 | out << "config=" << sb.config |
39 | << ")"; | |
40 | return out; | |
20effc67 TL |
41 | } |
42 | ||
43 | std::ostream& operator<<(std::ostream &out, Segment::segment_state_t s) | |
44 | { | |
45 | using state_t = Segment::segment_state_t; | |
46 | switch (s) { | |
47 | case state_t::EMPTY: | |
48 | return out << "EMPTY"; | |
49 | case state_t::OPEN: | |
50 | return out << "OPEN"; | |
51 | case state_t::CLOSED: | |
52 | return out << "CLOSED"; | |
53 | default: | |
54 | return out << "INVALID_SEGMENT_STATE!"; | |
55 | } | |
56 | } | |
57 | ||
58 | seastar::future<crimson::os::seastore::SegmentManagerRef> | |
59 | SegmentManager::get_segment_manager( | |
1e59de90 | 60 | const std::string &device, device_type_t dtype) |
20effc67 TL |
61 | { |
62 | #ifdef HAVE_ZNS | |
1e59de90 | 63 | LOG_PREFIX(SegmentManager::get_segment_manager); |
20effc67 TL |
64 | return seastar::do_with( |
65 | static_cast<size_t>(0), | |
aee94f69 TL |
66 | [FNAME, |
67 | dtype, | |
68 | device](auto &nr_zones) { | |
20effc67 TL |
69 | return seastar::open_file_dma( |
70 | device + "/block", | |
71 | seastar::open_flags::rw | |
aee94f69 TL |
72 | ).then([FNAME, |
73 | dtype, | |
74 | device, | |
75 | &nr_zones](auto file) { | |
20effc67 TL |
76 | return seastar::do_with( |
77 | file, | |
aee94f69 | 78 | [&nr_zones](auto &f) -> seastar::future<int> { |
20effc67 TL |
79 | ceph_assert(f); |
80 | return f.ioctl(BLKGETNRZONES, (void *)&nr_zones); | |
81 | }); | |
aee94f69 TL |
82 | }).then([FNAME, |
83 | dtype, | |
84 | device, | |
85 | &nr_zones](auto ret) -> crimson::os::seastore::SegmentManagerRef { | |
20effc67 | 86 | crimson::os::seastore::SegmentManagerRef sm; |
1e59de90 | 87 | INFO("Found {} zones.", nr_zones); |
20effc67 TL |
88 | if (nr_zones != 0) { |
89 | return std::make_unique< | |
aee94f69 | 90 | segment_manager::zbd::ZBDSegmentManager |
20effc67 TL |
91 | >(device + "/block"); |
92 | } else { | |
93 | return std::make_unique< | |
94 | segment_manager::block::BlockSegmentManager | |
1e59de90 | 95 | >(device + "/block", dtype); |
20effc67 TL |
96 | } |
97 | }); | |
98 | }); | |
99 | #else | |
100 | return seastar::make_ready_future<crimson::os::seastore::SegmentManagerRef>( | |
101 | std::make_unique< | |
102 | segment_manager::block::BlockSegmentManager | |
1e59de90 | 103 | >(device + "/block", dtype)); |
20effc67 TL |
104 | #endif |
105 | } | |
106 | ||
107 | } |