]> git.proxmox.com Git - ceph.git/blame - ceph/src/crimson/os/seastore/segment_manager.cc
update ceph source to reef 18.2.1
[ceph.git] / ceph / src / crimson / os / seastore / segment_manager.cc
CommitLineData
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 10SET_SUBSYS(seastore_device);
20effc67
TL
11#endif
12
20effc67
TL
13
14namespace crimson::os::seastore {
15
1e59de90 16std::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
27std::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
43std::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
58seastar::future<crimson::os::seastore::SegmentManagerRef>
59SegmentManager::get_segment_manager(
1e59de90 60 const std::string &device, device_type_t dtype)
20effc67
TL
61{
62#ifdef HAVE_ZNS
1e59de90 63LOG_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}