summaryrefslogtreecommitdiffstats
path: root/src/librados/RadosClient.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/librados/RadosClient.h')
-rw-r--r--src/librados/RadosClient.h198
1 files changed, 198 insertions, 0 deletions
diff --git a/src/librados/RadosClient.h b/src/librados/RadosClient.h
new file mode 100644
index 000000000..052249a76
--- /dev/null
+++ b/src/librados/RadosClient.h
@@ -0,0 +1,198 @@
+// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
+// vim: ts=8 sw=2 smarttab
+/*
+ * Ceph - scalable distributed file system
+ *
+ * Copyright (C) 2004-2012 Sage Weil <sage@newdream.net>
+ *
+ * This is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License version 2.1, as published by the Free Software
+ * Foundation. See file COPYING.
+ *
+ */
+#ifndef CEPH_LIBRADOS_RADOSCLIENT_H
+#define CEPH_LIBRADOS_RADOSCLIENT_H
+
+#include <functional>
+#include <memory>
+#include <string>
+
+#include "msg/Dispatcher.h"
+
+#include "common/async/context_pool.h"
+#include "common/config_fwd.h"
+#include "common/Cond.h"
+#include "common/ceph_mutex.h"
+#include "common/ceph_time.h"
+#include "common/config_obs.h"
+#include "include/common_fwd.h"
+#include "include/rados/librados.h"
+#include "include/rados/librados.hpp"
+#include "mon/MonClient.h"
+#include "mgr/MgrClient.h"
+
+#include "IoCtxImpl.h"
+
+struct Context;
+class Message;
+class MLog;
+class Messenger;
+class AioCompletionImpl;
+
+namespace neorados { namespace detail { class RadosClient; }}
+
+class librados::RadosClient : public Dispatcher,
+ public md_config_obs_t
+{
+ friend neorados::detail::RadosClient;
+public:
+ using Dispatcher::cct;
+private:
+ std::unique_ptr<CephContext,
+ std::function<void(CephContext*)>> cct_deleter;
+
+public:
+ const ConfigProxy& conf{cct->_conf};
+ ceph::async::io_context_pool poolctx;
+private:
+ enum {
+ DISCONNECTED,
+ CONNECTING,
+ CONNECTED,
+ } state{DISCONNECTED};
+
+ MonClient monclient{cct, poolctx};
+ MgrClient mgrclient{cct, nullptr, &monclient.monmap};
+ Messenger *messenger{nullptr};
+
+ uint64_t instance_id{0};
+
+ bool _dispatch(Message *m);
+ bool ms_dispatch(Message *m) override;
+
+ void ms_handle_connect(Connection *con) override;
+ bool ms_handle_reset(Connection *con) override;
+ void ms_handle_remote_reset(Connection *con) override;
+ bool ms_handle_refused(Connection *con) override;
+
+ Objecter *objecter{nullptr};
+
+ ceph::mutex lock = ceph::make_mutex("librados::RadosClient::lock");
+ ceph::condition_variable cond;
+ int refcnt{1};
+
+ version_t log_last_version{0};
+ rados_log_callback_t log_cb{nullptr};
+ rados_log_callback2_t log_cb2{nullptr};
+ void *log_cb_arg{nullptr};
+ std::string log_watch;
+
+ bool service_daemon = false;
+ std::string daemon_name, service_name;
+ std::map<std::string,std::string> daemon_metadata;
+ ceph::timespan rados_mon_op_timeout{};
+
+ int wait_for_osdmap();
+
+public:
+ boost::asio::io_context::strand finish_strand{poolctx.get_io_context()};
+
+ explicit RadosClient(CephContext *cct);
+ ~RadosClient() override;
+ int ping_monitor(std::string mon_id, std::string *result);
+ int connect();
+ void shutdown();
+
+ int watch_flush();
+ int async_watch_flush(AioCompletionImpl *c);
+
+ uint64_t get_instance_id();
+
+ int get_min_compatible_osd(int8_t* require_osd_release);
+ int get_min_compatible_client(int8_t* min_compat_client,
+ int8_t* require_min_compat_client);
+
+ int wait_for_latest_osdmap();
+
+ int create_ioctx(const char *name, IoCtxImpl **io);
+ int create_ioctx(int64_t, IoCtxImpl **io);
+
+ int get_fsid(std::string *s);
+ int64_t lookup_pool(const char *name);
+ bool pool_requires_alignment(int64_t pool_id);
+ int pool_requires_alignment2(int64_t pool_id, bool *req);
+ uint64_t pool_required_alignment(int64_t pool_id);
+ int pool_required_alignment2(int64_t pool_id, uint64_t *alignment);
+ int pool_get_name(uint64_t pool_id, std::string *name,
+ bool wait_latest_map = false);
+
+ int pool_list(std::list<std::pair<int64_t, std::string> >& ls);
+ int get_pool_stats(std::list<std::string>& ls, std::map<std::string,::pool_stat_t> *result,
+ bool *per_pool);
+ int get_fs_stats(ceph_statfs& result);
+ bool get_pool_is_selfmanaged_snaps_mode(const std::string& pool);
+
+ /*
+ -1 was set as the default value and monitor will pickup the right crush rule with below order:
+ a) osd pool default crush replicated rule
+ b) the first rule
+ c) error out if no value find
+ */
+ int pool_create(std::string& name, int16_t crush_rule=-1);
+ int pool_create_async(std::string& name, PoolAsyncCompletionImpl *c,
+ int16_t crush_rule=-1);
+ int pool_get_base_tier(int64_t pool_id, int64_t* base_tier);
+ int pool_delete(const char *name);
+
+ int pool_delete_async(const char *name, PoolAsyncCompletionImpl *c);
+
+ int blocklist_add(const std::string& client_address, uint32_t expire_seconds);
+
+ int mon_command(const std::vector<std::string>& cmd, const bufferlist &inbl,
+ bufferlist *outbl, std::string *outs);
+ void mon_command_async(const std::vector<std::string>& cmd, const bufferlist &inbl,
+ bufferlist *outbl, std::string *outs, Context *on_finish);
+ int mon_command(int rank,
+ const std::vector<std::string>& cmd, const bufferlist &inbl,
+ bufferlist *outbl, std::string *outs);
+ int mon_command(std::string name,
+ const std::vector<std::string>& cmd, const bufferlist &inbl,
+ bufferlist *outbl, std::string *outs);
+ int mgr_command(const std::vector<std::string>& cmd, const bufferlist &inbl,
+ bufferlist *outbl, std::string *outs);
+ int mgr_command(
+ const std::string& name,
+ const std::vector<std::string>& cmd, const bufferlist &inbl,
+ bufferlist *outbl, std::string *outs);
+ int osd_command(int osd, std::vector<std::string>& cmd, const bufferlist& inbl,
+ bufferlist *poutbl, std::string *prs);
+ int pg_command(pg_t pgid, std::vector<std::string>& cmd, const bufferlist& inbl,
+ bufferlist *poutbl, std::string *prs);
+
+ void handle_log(MLog *m);
+ int monitor_log(const std::string& level, rados_log_callback_t cb,
+ rados_log_callback2_t cb2, void *arg);
+
+ void get();
+ bool put();
+ void blocklist_self(bool set);
+
+ std::string get_addrs() const;
+
+ int service_daemon_register(
+ const std::string& service, ///< service name (e.g., 'rgw')
+ const std::string& name, ///< daemon name (e.g., 'gwfoo')
+ const std::map<std::string,std::string>& metadata); ///< static metadata about daemon
+ int service_daemon_update_status(
+ std::map<std::string,std::string>&& status);
+
+ mon_feature_t get_required_monitor_features() const;
+
+ int get_inconsistent_pgs(int64_t pool_id, std::vector<std::string>* pgs);
+ const char** get_tracked_conf_keys() const override;
+ void handle_conf_change(const ConfigProxy& conf,
+ const std::set <std::string> &changed) override;
+};
+
+#endif