#ifndef CEPH_OSDMAP_H
#define CEPH_OSDMAP_H
-#include "include/cpp-btree/btree_map.h"
-
/*
* describe properties of the OSD cluster.
* disks, disk groups, total # osds,
#include <set>
#include <map>
#include "include/memory.h"
+#include "include/btree_map.h"
using namespace std;
// forward declaration
class CephContext;
class CrushWrapper;
+class health_check_map_t;
// FIXME C++11 does not have std::equal for two differently-typed containers.
// use this until we move to c++14
public:
OSDMap() : epoch(0),
- pool_max(-1),
+ pool_max(0),
flags(0),
num_osd(0), num_up_osd(0), num_in_osd(0),
max_osd(0),
float get_nearfull_ratio() const {
return nearfull_ratio;
}
- void count_full_nearfull_osds(int *full, int *backfill, int *nearfull) const;
void get_full_osd_util(
const mempool::pgmap::unordered_map<int32_t,osd_stat_t> &osd_stat,
map<int, float> *full,
map<int, float> *backfill,
map<int, float> *nearfull) const;
-
+ void get_full_pools(CephContext *cct,
+ set<int64_t> *full,
+ set<int64_t> *backfillfull,
+ set<int64_t> *nearfull) const;
void get_full_osd_counts(set<int> *full, set<int> *backfill,
set<int> *nearfull) const;
*/
uint64_t get_up_osd_features() const;
+ void maybe_remove_pg_upmaps(CephContext *cct,
+ const OSDMap& osdmap,
+ Incremental *pending_inc);
+
int apply_incremental(const Incremental &inc);
/// try to re-use/reference addrs in oldmap from newmap
return p && pgid.ps() < p->get_pg_num();
}
+ int get_pg_pool_min_size(pg_t pgid) const {
+ if (!pg_exists(pgid)) {
+ return -ENOENT;
+ }
+ const pg_pool_t *p = get_pg_pool(pgid.pool());
+ assert(p);
+ return p->get_min_size();
+ }
+
+ int get_pg_pool_size(pg_t pgid) const {
+ if (!pg_exists(pgid)) {
+ return -ENOENT;
+ }
+ const pg_pool_t *p = get_pg_pool(pgid.pool());
+ assert(p);
+ return p->get_size();
+ }
+
+ int get_pg_pool_crush_rule(pg_t pgid) const {
+ if (!pg_exists(pgid)) {
+ return -ENOENT;
+ }
+ const pg_pool_t *p = get_pg_pool(pgid.pool());
+ assert(p);
+ return p->get_crush_rule();
+ }
+
private:
/// pg -> (raw osd list)
void _pg_to_raw_osds(
vector<int> *osds, int *primary) const;
/// apply pg_upmap[_items] mappings
- void _apply_remap(const pg_pool_t& pi, pg_t pg, vector<int> *raw) const;
+ void _apply_upmap(const pg_pool_t& pi, pg_t pg, vector<int> *raw) const;
/// pg -> (up osd list)
void _raw_to_up_osds(const pg_pool_t& pool, const vector<int>& raw,
mempool::osdmap::map<int64_t,pg_pool_t>& get_pools() {
return pools;
}
+ void get_pool_ids_by_rule(int rule_id, set<int64_t> *pool_ids) const {
+ assert(pool_ids);
+ for (auto &p: pools) {
+ if ((int)p.second.get_crush_rule() == rule_id) {
+ pool_ids->insert(p.first);
+ }
+ }
+ }
+ void get_pool_ids_by_osd(CephContext *cct,
+ int osd,
+ set<int64_t> *pool_ids) const;
const string& get_pool_name(int64_t p) const {
auto i = pool_name.find(p);
assert(i != pool_name.end());
return i->second;
}
+ const mempool::osdmap::map<int64_t,string>& get_pool_names() const {
+ return pool_name;
+ }
bool have_pg_pool(int64_t p) const {
return pools.count(p);
}
* @param num_osd [in] number of OSDs if >= 0 or read from conf if < 0
* @return **0** on success, negative errno on error.
*/
+private:
+ int build_simple_optioned(CephContext *cct, epoch_t e, uuid_d &fsid,
+ int num_osd, int pg_bits, int pgp_bits,
+ bool default_pool);
+public:
int build_simple(CephContext *cct, epoch_t e, uuid_d &fsid,
- int num_osd, int pg_bits, int pgp_bits);
+ int num_osd) {
+ return build_simple_optioned(cct, e, fsid, num_osd, 0, 0, false);
+ }
+ int build_simple_with_pool(CephContext *cct, epoch_t e, uuid_d &fsid,
+ int num_osd, int pg_bits, int pgp_bits) {
+ return build_simple_optioned(cct, e, fsid, num_osd,
+ pg_bits, pgp_bits, true);
+ }
static int _build_crush_types(CrushWrapper& crush);
static int build_simple_crush_map(CephContext *cct, CrushWrapper& crush,
int num_osd, ostream *ss);
const string& root,
ostream *ss);
- bool crush_ruleset_in_use(int ruleset) const;
+ bool crush_rule_in_use(int rule_id) const;
+
+ int validate_crush_rules(CrushWrapper *crush, ostream *ss) const;
void clear_temp() {
pg_temp->clear();
public:
void print(ostream& out) const;
void print_pools(ostream& out) const;
- void print_summary(Formatter *f, ostream& out) const;
+ void print_summary(Formatter *f, ostream& out, const string& prefix) const;
void print_oneline_summary(ostream& out) const;
enum {
- DUMP_IN = 1, // only 'in' osds
- DUMP_OUT = 2, // only 'out' osds
- DUMP_UP = 4, // only 'up' osds
- DUMP_DOWN = 8, // only 'down' osds
+ DUMP_IN = 1, // only 'in' osds
+ DUMP_OUT = 2, // only 'out' osds
+ DUMP_UP = 4, // only 'up' osds
+ DUMP_DOWN = 8, // only 'down' osds
+ DUMP_DESTROYED = 16, // only 'destroyed' osds
};
void print_tree(Formatter *f, ostream *out, unsigned dump_flags=0) const;
void dump(Formatter *f) const;
static void generate_test_instances(list<OSDMap*>& o);
bool check_new_blacklist_entries() const { return new_blacklist_entries; }
+
+ void check_health(health_check_map_t *checks) const;
+
+ int parse_osd_id_list(const vector<string>& ls,
+ set<int> *out,
+ ostream *ss) const;
};
WRITE_CLASS_ENCODER_FEATURES(OSDMap)
WRITE_CLASS_ENCODER_FEATURES(OSDMap::Incremental)