]> git.proxmox.com Git - ceph.git/blob - ceph/src/crimson/os/seastore/collection_manager/collection_flat_node.cc
add stop-gap to fix compat with CPUs not supporting SSE 4.1
[ceph.git] / ceph / src / crimson / os / seastore / collection_manager / collection_flat_node.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 "include/buffer.h"
5 #include "osd/osd_types.h"
6 #include "crimson/os/seastore/transaction_manager.h"
7 #include "crimson/os/seastore/collection_manager/collection_flat_node.h"
8
9 namespace {
10 seastar::logger& logger() {
11 return crimson::get_logger(ceph_subsys_seastore);
12 }
13 }
14
15 namespace crimson::os::seastore::collection_manager {
16
17 void delta_t::replay(coll_map_t &l) const
18 {
19 switch (op) {
20 case op_t::INSERT: {
21 l.insert(coll, bits);
22 break;
23 }
24 case op_t::UPDATE: {
25 l.update(coll, bits);
26 break;
27 }
28 case op_t::REMOVE: {
29 l.erase(coll);
30 break;
31 }
32 case op_t::INVALID: {
33 assert(0 == "impossible");
34 break;
35 }
36 __builtin_unreachable();
37 }
38 }
39
40
41 std::ostream &CollectionNode::print_detail_l(std::ostream &out) const
42 {
43 return out;
44 }
45
46 CollectionNode::list_ret
47 CollectionNode::list()
48 {
49 read_to_local();
50 logger().debug("CollectionNode:{}, {}", __func__, *this);
51 CollectionManager::list_ret_bare list_result;
52 for (auto &[coll, bits] : decoded) {
53 list_result.emplace_back(coll, bits);
54 }
55 return list_ret(
56 interruptible::ready_future_marker{},
57 std::move(list_result));
58 }
59
60 CollectionNode::create_ret
61 CollectionNode::create(coll_context_t cc, coll_t coll, unsigned bits)
62 {
63 read_to_local();
64 logger().debug("CollectionNode:{}", __func__);
65 if (!is_mutable()) {
66 auto mut = cc.tm.get_mutable_extent(cc.t, this)->cast<CollectionNode>();
67 return mut->create(cc, coll, bits);
68 }
69 logger().debug("CollectionNode::create {} {} {}", coll, bits, *this);
70 auto [iter, inserted] = decoded.insert(coll, bits);
71 assert(inserted);
72 if (encoded_sizeof((base_coll_map_t&)decoded) > get_bptr().length()) {
73 decoded.erase(iter);
74 return create_ret(
75 interruptible::ready_future_marker{},
76 create_result_t::OVERFLOW);
77 } else {
78 if (auto buffer = maybe_get_delta_buffer(); buffer) {
79 buffer->insert(coll, bits);
80 }
81 copy_to_node();
82 return create_ret(
83 interruptible::ready_future_marker{},
84 create_result_t::SUCCESS);
85 }
86 }
87
88 CollectionNode::update_ret
89 CollectionNode::update(coll_context_t cc, coll_t coll, unsigned bits)
90 {
91 read_to_local();
92 logger().debug("CollectionNode:{}", __func__);
93 if (!is_mutable()) {
94 auto mut = cc.tm.get_mutable_extent(cc.t, this)->cast<CollectionNode>();
95 return mut->update(cc, coll, bits);
96 }
97 if (auto buffer = maybe_get_delta_buffer(); buffer) {
98 buffer->update(coll, bits);
99 }
100 decoded.update(coll, bits);
101 copy_to_node();
102 return seastar::now();
103 }
104
105 CollectionNode::remove_ret
106 CollectionNode::remove(coll_context_t cc, coll_t coll)
107 {
108 read_to_local();
109 logger().debug("CollectionNode:{}", __func__);
110 if (!is_mutable()) {
111 auto mut = cc.tm.get_mutable_extent(cc.t, this)->cast<CollectionNode>();
112 return mut->remove(cc, coll);
113 }
114 if (auto buffer = maybe_get_delta_buffer(); buffer) {
115 buffer->remove(coll);
116 }
117 decoded.remove(coll);
118 copy_to_node();
119 return seastar::now();
120 }
121
122 }