1 // -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
2 // vim: ts=8 sw=2 smarttab
4 * Ceph - scalable distributed file system
6 * Copyright (C) 2016 John Spray <john.spray@redhat.com>
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.
14 #ifndef DAEMON_STATE_H_
15 #define DAEMON_STATE_H_
21 #include <boost/circular_buffer.hpp>
23 #include "common/Mutex.h"
25 #include "msg/msg_types.h"
27 // For PerfCounterType
28 #include "messages/MMgrReport.h"
31 // Unique reference to a daemon within a cluster
32 typedef std::pair
<std::string
, std::string
> DaemonKey
;
34 // An instance of a performance counter type, within
35 // a particular daemon.
36 class PerfCounterInstance
43 DataPoint(utime_t t_
, uint64_t v_
)
48 boost::circular_buffer
<DataPoint
> buffer
;
49 uint64_t get_current() const;
52 const boost::circular_buffer
<DataPoint
> & get_data() const
56 void push(utime_t t
, uint64_t const &v
);
62 typedef std::map
<std::string
, PerfCounterType
> PerfCounterTypes
;
64 // Performance counters for one daemon
65 class DaemonPerfCounters
68 // The record of perf stat types, shared between daemons
69 PerfCounterTypes
&types
;
71 DaemonPerfCounters(PerfCounterTypes
&types_
)
75 std::map
<std::string
, PerfCounterInstance
> instances
;
77 // FIXME: this state is really local to DaemonServer, it's part
78 // of the protocol rather than being part of what other classes
79 // mgiht want to read. Maybe have a separate session object
80 // inside DaemonServer instead of stashing session-ish state here?
81 std::set
<std::string
> declared_types
;
83 void update(MMgrReport
*report
);
88 declared_types
.clear();
92 // The state that we store about one daemon
96 Mutex lock
= {"DaemonState::lock"};
100 // The hostname where daemon was last seen running (extracted
101 // from the metadata)
102 std::string hostname
;
104 // The metadata (hostname, version, etc) sent from the daemon
105 std::map
<std::string
, std::string
> metadata
;
108 bool service_daemon
= false;
109 utime_t service_status_stamp
;
110 std::map
<std::string
, std::string
> service_status
;
111 utime_t last_service_beacon
;
113 // The perf counters received in MMgrReport messages
114 DaemonPerfCounters perf_counters
;
116 DaemonState(PerfCounterTypes
&types_
)
117 : perf_counters(types_
)
122 typedef std::shared_ptr
<DaemonState
> DaemonStatePtr
;
123 typedef std::map
<DaemonKey
, DaemonStatePtr
> DaemonStateCollection
;
129 * Fuse the collection of per-daemon metadata from Ceph into
130 * a view that can be queried by service type, ID or also
131 * by server (aka fqdn).
133 class DaemonStateIndex
136 std::map
<std::string
, DaemonStateCollection
> by_server
;
137 DaemonStateCollection all
;
139 std::set
<DaemonKey
> updating
;
145 DaemonStateIndex() : lock("DaemonState") {}
147 // FIXME: shouldn't really be public, maybe construct DaemonState
148 // objects internally to avoid this.
149 PerfCounterTypes types
;
151 void insert(DaemonStatePtr dm
);
152 void _erase(const DaemonKey
& dmk
);
154 bool exists(const DaemonKey
&key
) const;
155 DaemonStatePtr
get(const DaemonKey
&key
);
156 DaemonStateCollection
get_by_server(const std::string
&hostname
) const;
157 DaemonStateCollection
get_by_service(const std::string
&svc_name
) const;
159 const DaemonStateCollection
&get_all() const {return all
;}
160 const std::map
<std::string
, DaemonStateCollection
> &get_all_servers() const
165 void notify_updating(const DaemonKey
&k
) { updating
.insert(k
); }
166 void clear_updating(const DaemonKey
&k
) { updating
.erase(k
); }
167 bool is_updating(const DaemonKey
&k
) { return updating
.count(k
) > 0; }
170 * Remove state for all daemons of this type whose names are
171 * not present in `names_exist`. Use this function when you have
172 * a cluster map and want to ensure that anything absent in the map
173 * is also absent in this class.
175 void cull(const std::string
& svc_name
,
176 const std::set
<std::string
>& names_exist
);