]> git.proxmox.com Git - ceph.git/blame - ceph/src/crimson/os/seastore/collection_manager/collection_flat_node.cc
import quincy beta 17.1.0
[ceph.git] / ceph / src / crimson / os / seastore / collection_manager / collection_flat_node.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 "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
9namespace {
10 seastar::logger& logger() {
11 return crimson::get_logger(ceph_subsys_seastore);
12 }
13}
14
15namespace crimson::os::seastore::collection_manager {
16
17void 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
41std::ostream &CollectionNode::print_detail_l(std::ostream &out) const
42{
43 return out;
44}
45
46CollectionNode::list_ret
47CollectionNode::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
60CollectionNode::create_ret
61CollectionNode::create(coll_context_t cc, coll_t coll, unsigned bits)
62{
63 read_to_local();
64 logger().debug("CollectionNode:{}", __func__);
65 if (!is_pending()) {
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
88CollectionNode::update_ret
89CollectionNode::update(coll_context_t cc, coll_t coll, unsigned bits)
90{
91 read_to_local();
92 logger().debug("CollectionNode:{}", __func__);
93 if (!is_pending()) {
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
105CollectionNode::remove_ret
106CollectionNode::remove(coll_context_t cc, coll_t coll)
107{
108 read_to_local();
109 logger().debug("CollectionNode:{}", __func__);
110 if (!is_pending()) {
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}