]>
Commit | Line | Data |
---|---|---|
f67539c2 TL |
1 | // -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*- |
2 | // vim: ts=8 sw=2 smarttab | |
3 | /* | |
4 | * Ceph - scalable distributed file system | |
5 | * | |
6 | * Copyright (C) 2004-2012 Sage Weil <sage@newdream.net> | |
7 | * | |
8 | * This is free software; you can redistribute it and/or | |
9 | * modify it under the terms of the GNU Lesser General Public | |
10 | * License version 2.1, as published by the Free Software | |
11 | * Foundation. See file COPYING. | |
12 | * | |
13 | */ | |
14 | #ifndef CEPH_NEORADOS_RADOSIMPL_H | |
15 | #define CEPH_NEORADOS_RADOSIMPL_H | |
16 | ||
17 | #include <functional> | |
18 | #include <memory> | |
19 | #include <string> | |
20 | ||
21 | #include <boost/asio.hpp> | |
22 | #include <boost/intrusive_ptr.hpp> | |
23 | ||
24 | #include "common/ceph_context.h" | |
25 | #include "common/ceph_mutex.h" | |
26 | ||
27 | #include "librados/RadosClient.h" | |
28 | ||
29 | #include "mon/MonClient.h" | |
30 | ||
31 | #include "mgr/MgrClient.h" | |
32 | ||
33 | #include "osdc/Objecter.h" | |
34 | ||
35 | namespace neorados { | |
36 | ||
37 | class RADOS; | |
38 | ||
39 | namespace detail { | |
40 | ||
41 | class NeoClient; | |
42 | ||
43 | class RADOS : public Dispatcher | |
44 | { | |
45 | friend ::neorados::RADOS; | |
46 | friend NeoClient; | |
47 | ||
48 | boost::asio::io_context& ioctx; | |
49 | boost::intrusive_ptr<CephContext> cct; | |
50 | ||
51 | ceph::mutex lock = ceph::make_mutex("RADOS_unleashed::_::RADOSImpl"); | |
52 | int instance_id = -1; | |
53 | ||
54 | std::unique_ptr<Messenger> messenger; | |
55 | ||
56 | MonClient monclient; | |
57 | MgrClient mgrclient; | |
58 | ||
59 | std::unique_ptr<Objecter> objecter; | |
60 | ||
61 | public: | |
62 | ||
63 | RADOS(boost::asio::io_context& ioctx, boost::intrusive_ptr<CephContext> cct); | |
64 | ~RADOS(); | |
65 | bool ms_dispatch(Message *m) override; | |
66 | void ms_handle_connect(Connection *con) override; | |
67 | bool ms_handle_reset(Connection *con) override; | |
68 | void ms_handle_remote_reset(Connection *con) override; | |
69 | bool ms_handle_refused(Connection *con) override; | |
70 | mon_feature_t get_required_monitor_features() const { | |
71 | return monclient.with_monmap(std::mem_fn(&MonMap::get_required_features)); | |
72 | } | |
73 | }; | |
74 | ||
75 | class Client { | |
76 | public: | |
77 | Client(boost::asio::io_context& ioctx, | |
78 | boost::intrusive_ptr<CephContext> cct, | |
79 | MonClient& monclient, Objecter* objecter) | |
80 | : ioctx(ioctx), cct(cct), monclient(monclient), objecter(objecter) { | |
81 | } | |
82 | virtual ~Client() {} | |
83 | ||
84 | Client(const Client&) = delete; | |
85 | Client& operator=(const Client&) = delete; | |
86 | ||
87 | boost::asio::io_context& ioctx; | |
88 | ||
89 | boost::intrusive_ptr<CephContext> cct; | |
90 | MonClient& monclient; | |
91 | Objecter* objecter; | |
92 | ||
93 | mon_feature_t get_required_monitor_features() const { | |
94 | return monclient.with_monmap(std::mem_fn(&MonMap::get_required_features)); | |
95 | } | |
96 | ||
97 | virtual int get_instance_id() const = 0; | |
98 | }; | |
99 | ||
100 | class NeoClient : public Client { | |
101 | public: | |
102 | NeoClient(std::unique_ptr<RADOS>&& rados) | |
103 | : Client(rados->ioctx, rados->cct, rados->monclient, | |
104 | rados->objecter.get()), | |
105 | rados(std::move(rados)) { | |
106 | } | |
107 | ||
108 | int get_instance_id() const override { | |
109 | return rados->instance_id; | |
110 | } | |
111 | ||
112 | private: | |
113 | std::unique_ptr<RADOS> rados; | |
114 | }; | |
115 | ||
116 | class RadosClient : public Client { | |
117 | public: | |
118 | RadosClient(librados::RadosClient* rados_client) | |
119 | : Client(rados_client->poolctx, {rados_client->cct}, | |
120 | rados_client->monclient, rados_client->objecter), | |
121 | rados_client(rados_client) { | |
122 | } | |
123 | ||
124 | int get_instance_id() const override { | |
125 | return rados_client->instance_id; | |
126 | } | |
127 | ||
128 | public: | |
129 | librados::RadosClient* rados_client; | |
130 | }; | |
131 | ||
132 | } // namespace detail | |
133 | } // namespace neorados | |
134 | ||
135 | #endif |