]> git.proxmox.com Git - ceph.git/blame - ceph/src/neorados/RADOSImpl.h
import ceph 16.2.6
[ceph.git] / ceph / src / neorados / RADOSImpl.h
CommitLineData
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
35namespace neorados {
36
37class RADOS;
38
39namespace detail {
40
41class NeoClient;
42
43class 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
61public:
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
75class Client {
76public:
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
100class NeoClient : public Client {
101public:
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
112private:
113 std::unique_ptr<RADOS> rados;
114};
115
116class RadosClient : public Client {
117public:
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
128public:
129 librados::RadosClient* rados_client;
130};
131
132} // namespace detail
133} // namespace neorados
134
135#endif