]> git.proxmox.com Git - ceph.git/blob - ceph/src/crimson/os/seastore/segment_manager.cc
update ceph source to reef 18.1.2
[ceph.git] / 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
3
4 #include "crimson/os/seastore/segment_manager.h"
5 #include "crimson/os/seastore/segment_manager/block.h"
6 #include "crimson/os/seastore/logging.h"
7
8 #ifdef HAVE_ZNS
9 #include "crimson/os/seastore/segment_manager/zns.h"
10 SET_SUBSYS(seastore_device);
11 #endif
12
13
14 namespace crimson::os::seastore {
15
16 std::ostream& operator<<(std::ostream& out, const block_shard_info_t& sf)
17 {
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;
25 }
26
27 std::ostream& operator<<(std::ostream& out, const block_sm_superblock_t& sb)
28 {
29 out << "superblock("
30 << "shard_num=" << sb.shard_num
31 << ", segment_size=" << sb.segment_size
32 << ", block_size=" << sb.block_size
33 << ", shard_info:";
34 for (auto &sf : sb.shard_infos) {
35 out << sf
36 << ",";
37 }
38 out << "config=" << sb.config
39 << ")";
40 return out;
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(
60 const std::string &device, device_type_t dtype)
61 {
62 #ifdef HAVE_ZNS
63 LOG_PREFIX(SegmentManager::get_segment_manager);
64 return seastar::do_with(
65 static_cast<size_t>(0),
66 [&](auto &nr_zones) {
67 return seastar::open_file_dma(
68 device + "/block",
69 seastar::open_flags::rw
70 ).then([&](auto file) {
71 return seastar::do_with(
72 file,
73 [=, &nr_zones](auto &f) -> seastar::future<int> {
74 ceph_assert(f);
75 return f.ioctl(BLKGETNRZONES, (void *)&nr_zones);
76 });
77 }).then([&](auto ret) -> crimson::os::seastore::SegmentManagerRef {
78 crimson::os::seastore::SegmentManagerRef sm;
79 INFO("Found {} zones.", nr_zones);
80 if (nr_zones != 0) {
81 return std::make_unique<
82 segment_manager::zns::ZNSSegmentManager
83 >(device + "/block");
84 } else {
85 return std::make_unique<
86 segment_manager::block::BlockSegmentManager
87 >(device + "/block", dtype);
88 }
89 });
90 });
91 #else
92 return seastar::make_ready_future<crimson::os::seastore::SegmentManagerRef>(
93 std::make_unique<
94 segment_manager::block::BlockSegmentManager
95 >(device + "/block", dtype));
96 #endif
97 }
98
99 }