]> git.proxmox.com Git - ceph.git/blob - ceph/src/crimson/os/cyanstore/cyan_store.h
update ceph source to reef 18.1.2
[ceph.git] / ceph / src / crimson / os / cyanstore / cyan_store.h
1 // -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
2 // vim: ts=8 sw=2 smarttab
3
4 #pragma once
5
6 #include <string>
7 #include <unordered_map>
8 #include <map>
9 #include <typeinfo>
10 #include <vector>
11
12 #include <optional>
13 #include <seastar/core/future.hh>
14 #include <seastar/core/future-util.hh>
15
16 #include "osd/osd_types.h"
17 #include "include/uuid.h"
18
19 #include "crimson/os/cyanstore/cyan_object.h"
20 #include "crimson/os/cyanstore/cyan_collection.h"
21 #include "crimson/os/futurized_store.h"
22
23 namespace ceph::os {
24 class Transaction;
25 }
26
27 namespace crimson::os {
28 class CyanStore final : public FuturizedStore {
29 class Shard : public FuturizedStore::Shard {
30 public:
31 Shard(std::string path)
32 :path(path){}
33
34 seastar::future<struct stat> stat(
35 CollectionRef c,
36 const ghobject_t& oid) final;
37
38 read_errorator::future<ceph::bufferlist> read(
39 CollectionRef c,
40 const ghobject_t& oid,
41 uint64_t offset,
42 size_t len,
43 uint32_t op_flags = 0) final;
44
45 read_errorator::future<ceph::bufferlist> readv(
46 CollectionRef c,
47 const ghobject_t& oid,
48 interval_set<uint64_t>& m,
49 uint32_t op_flags = 0) final;
50
51 get_attr_errorator::future<ceph::bufferlist> get_attr(
52 CollectionRef c,
53 const ghobject_t& oid,
54 std::string_view name) const final;
55
56 get_attrs_ertr::future<attrs_t> get_attrs(
57 CollectionRef c,
58 const ghobject_t& oid) final;
59
60 read_errorator::future<omap_values_t> omap_get_values(
61 CollectionRef c,
62 const ghobject_t& oid,
63 const omap_keys_t& keys) final;
64
65 read_errorator::future<std::tuple<bool, omap_values_t>> omap_get_values(
66 CollectionRef c, ///< [in] collection
67 const ghobject_t &oid, ///< [in] oid
68 const std::optional<std::string> &start ///< [in] start, empty for begin
69 ) final;
70
71 get_attr_errorator::future<ceph::bufferlist> omap_get_header(
72 CollectionRef c,
73 const ghobject_t& oid) final;
74
75 seastar::future<std::tuple<std::vector<ghobject_t>, ghobject_t>>
76 list_objects(
77 CollectionRef c,
78 const ghobject_t& start,
79 const ghobject_t& end,
80 uint64_t limit) const final;
81
82 seastar::future<CollectionRef> create_new_collection(const coll_t& cid) final;
83
84 seastar::future<CollectionRef> open_collection(const coll_t& cid) final;
85
86 seastar::future<> do_transaction_no_callbacks(
87 CollectionRef ch,
88 ceph::os::Transaction&& txn) final;
89
90 read_errorator::future<std::map<uint64_t, uint64_t>>
91 fiemap(
92 CollectionRef c,
93 const ghobject_t& oid,
94 uint64_t off,
95 uint64_t len) final;
96
97 unsigned get_max_attr_name_length() const final;
98
99 public:
100 // only exposed to CyanStore
101 mount_ertr::future<> mount();
102
103 seastar::future<> umount();
104
105 seastar::future<> mkfs();
106
107 mkfs_ertr::future<> mkcoll(uuid_d new_osd_fsid);
108
109 using coll_core_t = FuturizedStore::coll_core_t;
110 seastar::future<std::vector<coll_core_t>> list_collections();
111
112 uint64_t get_used_bytes() const { return used_bytes; }
113
114 private:
115 int _remove(const coll_t& cid, const ghobject_t& oid);
116 int _touch(const coll_t& cid, const ghobject_t& oid);
117 int _write(const coll_t& cid, const ghobject_t& oid,
118 uint64_t offset, size_t len, const ceph::bufferlist& bl,
119 uint32_t fadvise_flags);
120 int _zero(const coll_t& cid, const ghobject_t& oid,
121 uint64_t offset, size_t len);
122 int _omap_clear(
123 const coll_t& cid,
124 const ghobject_t& oid);
125 int _omap_set_values(
126 const coll_t& cid,
127 const ghobject_t& oid,
128 std::map<std::string, ceph::bufferlist> &&aset);
129 int _omap_set_header(
130 const coll_t& cid,
131 const ghobject_t& oid,
132 const ceph::bufferlist &header);
133 int _omap_rmkeys(
134 const coll_t& cid,
135 const ghobject_t& oid,
136 const omap_keys_t& aset);
137 int _omap_rmkeyrange(
138 const coll_t& cid,
139 const ghobject_t& oid,
140 const std::string &first,
141 const std::string &last);
142 int _truncate(const coll_t& cid, const ghobject_t& oid, uint64_t size);
143 int _clone(const coll_t& cid, const ghobject_t& oid,
144 const ghobject_t& noid);
145 int _setattrs(const coll_t& cid, const ghobject_t& oid,
146 std::map<std::string,bufferlist>&& aset);
147 int _rm_attr(const coll_t& cid, const ghobject_t& oid,
148 std::string_view name);
149 int _rm_attrs(const coll_t& cid, const ghobject_t& oid);
150 int _create_collection(const coll_t& cid, int bits);
151 boost::intrusive_ptr<Collection> _get_collection(const coll_t& cid);
152
153 private:
154 uint64_t used_bytes = 0;
155 const std::string path;
156 std::unordered_map<coll_t, boost::intrusive_ptr<Collection>> coll_map;
157 std::map<coll_t, boost::intrusive_ptr<Collection>> new_coll_map;
158 };
159
160 public:
161 CyanStore(const std::string& path);
162 ~CyanStore() final;
163
164 seastar::future<> start() final {
165 ceph_assert(seastar::this_shard_id() == primary_core);
166 return shard_stores.start(path);
167 }
168
169 seastar::future<> stop() final {
170 ceph_assert(seastar::this_shard_id() == primary_core);
171 return shard_stores.stop();
172 }
173
174 mount_ertr::future<> mount() final {
175 ceph_assert(seastar::this_shard_id() == primary_core);
176 return shard_stores.invoke_on_all(
177 [](auto &local_store) {
178 return local_store.mount().handle_error(
179 crimson::stateful_ec::handle([](const auto& ec) {
180 crimson::get_logger(ceph_subsys_cyanstore).error(
181 "error mounting cyanstore: ({}) {}",
182 ec.value(), ec.message());
183 std::exit(EXIT_FAILURE);
184 }));
185 });
186 }
187
188 seastar::future<> umount() final {
189 ceph_assert(seastar::this_shard_id() == primary_core);
190 return shard_stores.invoke_on_all(
191 [](auto &local_store) {
192 return local_store.umount();
193 });
194 }
195
196 mkfs_ertr::future<> mkfs(uuid_d new_osd_fsid) final;
197
198 seastar::future<store_statfs_t> stat() const final;
199
200 uuid_d get_fsid() const final;
201
202 seastar::future<> write_meta(const std::string& key,
203 const std::string& value) final;
204
205 FuturizedStore::Shard& get_sharded_store() final{
206 return shard_stores.local();
207 }
208
209 seastar::future<std::tuple<int, std::string>>
210 read_meta(const std::string& key) final;
211
212 seastar::future<std::vector<coll_core_t>> list_collections() final;
213
214 private:
215 seastar::sharded<CyanStore::Shard> shard_stores;
216 const std::string path;
217 uuid_d osd_fsid;
218 };
219 }