summaryrefslogtreecommitdiffstats
path: root/src/mon/MgrMonitor.h
blob: 79d4e50051d8049ba778b51a0b5522b49fe92c4b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
// -*- 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) 2016 John Spray <john.spray@redhat.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 CEPH_MGRMONITOR_H
#define CEPH_MGRMONITOR_H

#include <map>
#include <set>

#include "include/Context.h"
#include "MgrMap.h"
#include "PaxosService.h"
#include "MonCommand.h"

class MgrMonitor: public PaxosService
{
  MgrMap map;
  MgrMap pending_map;
  bool ever_had_active_mgr = false;

  std::map<std::string, ceph::buffer::list> pending_metadata;
  std::set<std::string> pending_metadata_rm;

  std::map<std::string,Option> mgr_module_options;
  std::list<std::string> misc_option_strings;

  utime_t first_seen_inactive;

  std::map<uint64_t, ceph::coarse_mono_clock::time_point> last_beacon;

  /**
   * If a standby is available, make it active, given that
   * there is currently no active daemon.
   *
   * @return true if a standby was promoted
   */
  bool promote_standby();

  /**
   * Drop the active daemon from the MgrMap. No promotion is performed.
   *
   * @return whether PAXOS was plugged by this method
   */
  bool drop_active();

  /**
   * Remove this gid from the list of standbys.  By default,
   * also remove metadata (i.e. forget the daemon entirely).
   *
   * Set `drop_meta` to false if you would like to keep
   * the daemon's metadata, for example if you're dropping
   * it as a standby before reinstating it as the active daemon.
   */
  void drop_standby(uint64_t gid, bool drop_meta=true);

  Context *digest_event = nullptr;
  void cancel_timer();

  std::vector<health_check_map_t> prev_health_checks;

  bool check_caps(MonOpRequestRef op, const uuid_d& fsid);

  health_status_t should_warn_about_mgr_down();

  // Command descriptions we've learned from the active mgr
  std::vector<MonCommand> command_descs;
  std::vector<MonCommand> pending_command_descs;

public:
  MgrMonitor(Monitor &mn, Paxos &p, const std::string& service_name)
    : PaxosService(mn, p, service_name)
  {}
  ~MgrMonitor() override {}

  void init() override;
  void on_shutdown() override;

  const MgrMap &get_map() const { return map; }

  const std::map<std::string,Option>& get_mgr_module_options() {
    return mgr_module_options;
  }
  const Option *find_module_option(const std::string& name);

  bool in_use() const { return map.epoch > 0; }

  version_t get_trim_to() const override;

  void prime_mgr_client();

  void create_initial() override;
  void get_store_prefixes(std::set<std::string>& s) const override;
  void update_from_paxos(bool *need_bootstrap) override;
  void post_paxos_update() override;
  void create_pending() override;
  void encode_pending(MonitorDBStore::TransactionRef t) override;

  bool preprocess_query(MonOpRequestRef op) override;
  bool prepare_update(MonOpRequestRef op) override;

  bool preprocess_command(MonOpRequestRef op);
  bool prepare_command(MonOpRequestRef op);

  void encode_full(MonitorDBStore::TransactionRef t) override { }

  bool preprocess_beacon(MonOpRequestRef op);
  bool prepare_beacon(MonOpRequestRef op);

  void check_sub(Subscription *sub);
  void check_subs();
  void send_digests();

  void on_active() override;
  void on_restart() override;

  void tick() override;

  void print_summary(ceph::Formatter *f, std::ostream *ss) const;

  const std::vector<MonCommand> &get_command_descs() const;

  int load_metadata(const std::string& name, std::map<std::string, std::string>& m,
		    std::ostream *err) const;
  int dump_metadata(const std::string& name, ceph::Formatter *f, std::ostream *err);
  void print_nodes(ceph::Formatter *f) const;
  void count_metadata(const std::string& field, ceph::Formatter *f);
  void count_metadata(const std::string& field, std::map<std::string,int> *out);
  void get_versions(std::map<std::string, std::list<std::string>> &versions);

  // When did the mon last call into our tick() method?  Used for detecting
  // when the mon was not updating us for some period (e.g. during slow
  // election) to reset last_beacon timeouts
  ceph::coarse_mono_clock::time_point last_tick;
};

#endif