X-Git-Url: https://gerrit.opnfv.org/gerrit/gitweb?a=blobdiff_plain;f=src%2Fceph%2Fsrc%2Fmon%2FPGMonitor.h;fp=src%2Fceph%2Fsrc%2Fmon%2FPGMonitor.h;h=5395c5bb37f89fb3d70dae00f82510fddd4d2498;hb=812ff6ca9fcd3e629e49d4328905f33eee8ca3f5;hp=0000000000000000000000000000000000000000;hpb=15280273faafb77777eab341909a3f495cf248d9;p=stor4nfv.git diff --git a/src/ceph/src/mon/PGMonitor.h b/src/ceph/src/mon/PGMonitor.h new file mode 100644 index 0000000..5395c5b --- /dev/null +++ b/src/ceph/src/mon/PGMonitor.h @@ -0,0 +1,148 @@ +// -*- 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-2006 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. + * + */ + +/* + * Placement Group Monitor. Placement Groups are logical sets of objects + * that are replicated by the same set of devices. + */ + +#ifndef CEPH_PGMONITOR_H +#define CEPH_PGMONITOR_H + +#include +#include +using namespace std; + +#include "PGMap.h" +#include "PaxosService.h" +#include "include/types.h" +#include "include/utime.h" +#include "common/histogram.h" +#include "msg/Messenger.h" +#include "mon/MonitorDBStore.h" + +class MPGStats; +class MonPGStatService; +class PGMonStatService; + +class PGMonitor : public PaxosService { + PGMap pg_map; + std::unique_ptr pgservice; + + bool do_delete = false; ///< propose deleting pgmap data + bool did_delete = false; ///< we already deleted pgmap data + +private: + PGMap::Incremental pending_inc; + + bool check_all_pgs = false; + + const char *pgmap_meta_prefix; + const char *pgmap_pg_prefix; + const char *pgmap_osd_prefix; + + void create_initial() override; + void update_from_paxos(bool *need_bootstrap) override; + void upgrade_format() override; + void on_upgrade() override; + void post_paxos_update() override; + void handle_osd_timeouts(); + void create_pending() override; // prepare a new pending + // propose pending update to peers + version_t get_trim_to() override; + void update_logger(); + + void encode_pending(MonitorDBStore::TransactionRef t) override; + void read_pgmap_meta(); + void read_pgmap_full(); + void apply_pgmap_delta(bufferlist& bl); + + bool preprocess_query(MonOpRequestRef op) override; // true if processed. + bool prepare_update(MonOpRequestRef op) override; + + bool preprocess_pg_stats(MonOpRequestRef op); + bool pg_stats_have_changed(int from, const MPGStats *stats) const; + bool prepare_pg_stats(MonOpRequestRef op); + void _updated_stats(MonOpRequestRef op, MonOpRequestRef ack_op); + + struct C_Stats; + + bool preprocess_command(MonOpRequestRef op); + bool prepare_command(MonOpRequestRef op); + + // when we last received PG stats from each osd + map last_osd_report; + + epoch_t send_pg_creates(int osd, Connection *con, epoch_t next); + +public: + PGMonitor(Monitor *mn, Paxos *p, const string& service_name); + ~PGMonitor() override; + + void get_store_prefixes(set& s) override { + s.insert(get_service_name()); + s.insert(pgmap_meta_prefix); + s.insert(pgmap_pg_prefix); + s.insert(pgmap_osd_prefix); + } + + void on_restart() override; + + /* Courtesy function provided by PaxosService, called when an election + * finishes and the cluster goes active. We use it here to make sure we + * haven't lost any PGs from new pools. */ + void on_active() override; + + bool should_stash_full() override { + return false; // never + } + void encode_full(MonitorDBStore::TransactionRef t) override { + assert(0 == "unimplemented encode_full"); + } + + + void tick() override; // check state, take actions + + void check_osd_map(epoch_t epoch); + + int _warn_slow_request_histogram(const pow2_hist_t& h, string suffix, + list >& summary, + list > *detail) const; + + void get_health(list >& summary, + list > *detail, + CephContext *cct) const override; + void check_full_osd_health( + list >& summary, + list > *detail, + const mempool::pgmap::set& s, + const char *desc, health_status_t sev) const; + + void check_subs(); + bool check_sub(Subscription *sub); + + MonPGStatService *get_pg_stat_service(); + +private: + // no copying allowed + PGMonitor(const PGMonitor &rhs); + PGMonitor &operator=(const PGMonitor &rhs); + + // we don't want to include gtest.h just for FRIEND_TEST + friend class pgmonitor_dump_object_stat_sum_0_Test; + friend class pgmonitor_dump_object_stat_sum_1_Test; + friend class pgmonitor_dump_object_stat_sum_2_Test; +}; + +#endif