// -*- 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 * * 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 "common/Cond.h" #include "common/Mutex.h" #include "common/RWLock.h" #include "common/Timer.h" #include "include/rados/librados.h" #include "include/rados/librados.hpp" #include "mon/MonClient.h" #include "mgr/MgrClient.h" #include "msg/Dispatcher.h" #include "IoCtxImpl.h" struct AuthAuthorizer; struct Context; class CephContext; struct Connection; struct md_config_t; class Message; class MLog; class Messenger; class AioCompletionImpl; class librados::RadosClient : public Dispatcher { std::unique_ptr > cct_deleter; public: using Dispatcher::cct; md_config_t *conf; private: enum { DISCONNECTED, CONNECTING, CONNECTED, } state; MonClient monclient; MgrClient mgrclient; Messenger *messenger; uint64_t instance_id; bool _dispatch(Message *m); bool ms_dispatch(Message *m) override; bool ms_get_authorizer(int dest_type, AuthAuthorizer **authorizer, bool force_new) 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; Mutex lock; Cond cond; SafeTimer timer; int refcnt; version_t log_last_version; rados_log_callback_t log_cb; rados_log_callback2_t log_cb2; void *log_cb_arg; string log_watch; bool service_daemon = false; string daemon_name, service_name; map daemon_metadata; int wait_for_osdmap(); public: Finisher finisher; explicit RadosClient(CephContext *cct_); ~RadosClient() override; int ping_monitor(string mon_id, string *result); int connect(); void shutdown(); int watch_flush(); int async_watch_flush(AioCompletionImpl *c); uint64_t get_instance_id(); 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 *requires); uint64_t pool_required_alignment(int64_t pool_id); int pool_required_alignment2(int64_t pool_id, uint64_t *alignment); int pool_get_auid(uint64_t pool_id, unsigned long long *auid); int pool_get_name(uint64_t pool_id, std::string *auid); int pool_list(std::list >& ls); int get_pool_stats(std::list& ls, map& result); 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 ruleset b) the first ruleset in crush ruleset c) error out if no value find */ int pool_create(string& name, unsigned long long auid=0, int16_t crush_rule=-1); int pool_create_async(string& name, PoolAsyncCompletionImpl *c, unsigned long long auid=0, 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 blacklist_add(const string& client_address, uint32_t expire_seconds); int mon_command(const vector& cmd, const bufferlist &inbl, bufferlist *outbl, string *outs); void mon_command_async(const vector& cmd, const bufferlist &inbl, bufferlist *outbl, string *outs, Context *on_finish); int mon_command(int rank, const vector& cmd, const bufferlist &inbl, bufferlist *outbl, string *outs); int mon_command(string name, const vector& cmd, const bufferlist &inbl, bufferlist *outbl, string *outs); int mgr_command(const vector& cmd, const bufferlist &inbl, bufferlist *outbl, string *outs); int osd_command(int osd, vector& cmd, const bufferlist& inbl, bufferlist *poutbl, string *prs); int pg_command(pg_t pgid, vector& cmd, const bufferlist& inbl, bufferlist *poutbl, string *prs); void handle_log(MLog *m); int monitor_log(const string& level, rados_log_callback_t cb, rados_log_callback2_t cb2, void *arg); void get(); bool put(); void blacklist_self(bool set); 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& metadata); ///< static metadata about daemon int service_daemon_update_status( const std::map& status); mon_feature_t get_required_monitor_features() const; }; #endif