summaryrefslogtreecommitdiffstats
path: root/src/mgr/ClusterState.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/mgr/ClusterState.h')
-rw-r--r--src/mgr/ClusterState.h163
1 files changed, 163 insertions, 0 deletions
diff --git a/src/mgr/ClusterState.h b/src/mgr/ClusterState.h
new file mode 100644
index 000000000..eeff1f76b
--- /dev/null
+++ b/src/mgr/ClusterState.h
@@ -0,0 +1,163 @@
+// -*- 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) 2014 John Spray <john.spray@inktank.com>
+ *
+ * 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 CLUSTER_STATE_H_
+#define CLUSTER_STATE_H_
+
+#include "mds/FSMap.h"
+#include "mon/MgrMap.h"
+#include "common/ceph_mutex.h"
+
+#include "osdc/Objecter.h"
+#include "mon/MonClient.h"
+#include "mon/PGMap.h"
+#include "mgr/ServiceMap.h"
+
+class MMgrDigest;
+class MMonMgrReport;
+class MPGStats;
+
+
+/**
+ * Cluster-scope state (things like cluster maps) as opposed
+ * to daemon-level state (things like perf counters and smart)
+ */
+class ClusterState
+{
+protected:
+ MonClient *monc;
+ Objecter *objecter;
+ FSMap fsmap;
+ ServiceMap servicemap;
+ mutable ceph::mutex lock = ceph::make_mutex("ClusterState");
+
+ MgrMap mgr_map;
+
+ map<int64_t,unsigned> existing_pools; ///< pools that exist, and pg_num, as of PGMap epoch
+ PGMap pg_map;
+ PGMap::Incremental pending_inc;
+
+ bufferlist health_json;
+ bufferlist mon_status_json;
+
+ class ClusterSocketHook *asok_hook;
+
+public:
+
+ void load_digest(MMgrDigest *m);
+ void ingest_pgstats(ceph::ref_t<MPGStats> stats);
+
+ void update_delta_stats();
+
+ ClusterState(MonClient *monc_, Objecter *objecter_, const MgrMap& mgrmap);
+
+ void set_objecter(Objecter *objecter_);
+ void set_fsmap(FSMap const &new_fsmap);
+ void set_mgr_map(MgrMap const &new_mgrmap);
+ void set_service_map(ServiceMap const &new_service_map);
+
+ void notify_osdmap(const OSDMap &osd_map);
+
+ bool have_fsmap() const {
+ std::lock_guard l(lock);
+ return fsmap.get_epoch() > 0;
+ }
+
+ template<typename Callback, typename...Args>
+ auto with_servicemap(Callback&& cb, Args&&...args) const
+ {
+ std::lock_guard l(lock);
+ return std::forward<Callback>(cb)(servicemap, std::forward<Args>(args)...);
+ }
+
+ template<typename Callback, typename...Args>
+ auto with_fsmap(Callback&& cb, Args&&...args) const
+ {
+ std::lock_guard l(lock);
+ return std::forward<Callback>(cb)(fsmap, std::forward<Args>(args)...);
+ }
+
+ template<typename Callback, typename...Args>
+ auto with_mgrmap(Callback&& cb, Args&&...args) const
+ {
+ std::lock_guard l(lock);
+ return std::forward<Callback>(cb)(mgr_map, std::forward<Args>(args)...);
+ }
+
+ template<typename Callback, typename...Args>
+ auto with_pgmap(Callback&& cb, Args&&...args) const ->
+ decltype(cb(pg_map, std::forward<Args>(args)...))
+ {
+ std::lock_guard l(lock);
+ return std::forward<Callback>(cb)(pg_map, std::forward<Args>(args)...);
+ }
+
+ template<typename Callback, typename...Args>
+ auto with_mutable_pgmap(Callback&& cb, Args&&...args) ->
+ decltype(cb(pg_map, std::forward<Args>(args)...))
+ {
+ std::lock_guard l(lock);
+ return std::forward<Callback>(cb)(pg_map, std::forward<Args>(args)...);
+ }
+
+ template<typename... Args>
+ auto with_monmap(Args &&... args) const
+ {
+ std::lock_guard l(lock);
+ ceph_assert(monc != nullptr);
+ return monc->with_monmap(std::forward<Args>(args)...);
+ }
+
+ template<typename... Args>
+ auto with_osdmap(Args &&... args) const ->
+ decltype(objecter->with_osdmap(std::forward<Args>(args)...))
+ {
+ ceph_assert(objecter != nullptr);
+ return objecter->with_osdmap(std::forward<Args>(args)...);
+ }
+
+ // call cb(osdmap, pg_map, ...args) with the appropriate locks
+ template <typename Callback, typename ...Args>
+ auto with_osdmap_and_pgmap(Callback&& cb, Args&& ...args) const {
+ ceph_assert(objecter != nullptr);
+ std::lock_guard l(lock);
+ return objecter->with_osdmap(
+ std::forward<Callback>(cb),
+ pg_map,
+ std::forward<Args>(args)...);
+ }
+
+ template<typename Callback, typename...Args>
+ auto with_health(Callback&& cb, Args&&...args) const
+ {
+ std::lock_guard l(lock);
+ return std::forward<Callback>(cb)(health_json, std::forward<Args>(args)...);
+ }
+
+ template<typename Callback, typename...Args>
+ auto with_mon_status(Callback&& cb, Args&&...args) const
+ {
+ std::lock_guard l(lock);
+ return std::forward<Callback>(cb)(mon_status_json, std::forward<Args>(args)...);
+ }
+
+ void final_init();
+ void shutdown();
+ bool asok_command(std::string_view admin_command,
+ const cmdmap_t& cmdmap,
+ Formatter *f,
+ ostream& ss);
+};
+
+#endif
+