190
191
OSDMap() : epoch(0),
193
num_osd(0), max_osd(0) {
194
num_osd(0), max_osd(0),
195
cluster_snapshot_epoch(0) {
194
196
memset(&fsid, 0, sizeof(fsid));
198
const ceph_fsid_t& get_fsid() const { return fsid; }
199
void set_fsid(ceph_fsid_t& f) { fsid = f; }
200
const uuid_d& get_fsid() const { return fsid; }
201
void set_fsid(uuid_d& f) { fsid = f; }
201
203
epoch_t get_epoch() const { return epoch; }
202
204
void inc_epoch() { epoch++; }
213
215
const utime_t& get_created() const { return created; }
214
216
const utime_t& get_modified() const { return modified; }
216
bool is_blacklisted(const entity_addr_t& a);
218
bool is_blacklisted(const entity_addr_t& a) const;
218
220
string get_cluster_snapshot() const {
219
221
if (cluster_snapshot_epoch == epoch)
256
258
void set_flag(int f) { flags |= f; }
257
259
void clear_flag(int f) { flags &= ~f; }
259
int get_state(int o) {
261
int get_state(int o) const {
265
int get_state(int o, set<string>& st) const {
267
unsigned t = osd_state[o];
268
for (unsigned s = 1; t; s <<= 1) {
271
st.insert(ceph_osd_state_name(s));
261
274
return osd_state[o];
263
276
void set_state(int o, unsigned s) {
335
348
assert(exists(osd));
336
349
return osd_hb_addr[osd];
338
entity_inst_t get_inst(int osd) {
351
entity_inst_t get_inst(int osd) const {
339
352
assert(exists(osd));
340
353
assert(is_up(osd));
341
354
return entity_inst_t(entity_name_t::OSD(osd), osd_addr[osd]);
343
entity_inst_t get_cluster_inst(int osd) {
356
entity_inst_t get_cluster_inst(int osd) const {
344
357
assert(exists(osd));
345
358
assert(is_up(osd));
346
359
if (osd_cluster_addr[osd] == entity_addr_t())
347
360
return get_inst(osd);
348
361
return entity_inst_t(entity_name_t::OSD(osd), osd_cluster_addr[osd]);
350
entity_inst_t get_hb_inst(int osd) {
363
entity_inst_t get_hb_inst(int osd) const {
351
364
assert(exists(osd));
352
365
assert(is_up(osd));
353
366
return entity_inst_t(entity_name_t::OSD(osd), osd_hb_addr[osd]);
390
403
/**** mapping facilities ****/
391
int object_locator_to_pg(const object_t& oid, const object_locator_t& loc, pg_t &pg) {
404
int object_locator_to_pg(const object_t& oid, const object_locator_t& loc, pg_t &pg) const {
392
405
// calculate ps (placement seed)
393
406
const pg_pool_t *pool = get_pg_pool(loc.get_pool());
409
pg_t object_locator_to_pg(const object_t& oid, const object_locator_t& loc) {
422
pg_t object_locator_to_pg(const object_t& oid, const object_locator_t& loc) const {
411
424
int ret = object_locator_to_pg(oid, loc, pg);
412
425
assert(ret == 0);
416
object_locator_t file_to_object_locator(const ceph_file_layout& layout) {
429
object_locator_t file_to_object_locator(const ceph_file_layout& layout) const {
417
430
return object_locator_t(layout.fl_pg_pool, layout.fl_pg_preferred);
421
ceph_object_layout file_to_object_layout(object_t oid, ceph_file_layout& layout) {
434
ceph_object_layout file_to_object_layout(object_t oid, ceph_file_layout& layout) const {
422
435
return make_object_layout(oid, layout.fl_pg_pool,
423
436
layout.fl_pg_preferred);
426
ceph_object_layout make_object_layout(object_t oid, int pg_pool, int preferred=-1) {
439
ceph_object_layout make_object_layout(object_t oid, int pg_pool, int preferred=-1) const {
427
440
object_locator_t loc(pg_pool);
428
441
loc.preferred = preferred;
443
456
// pg -> (osd list)
445
int _pg_to_osds(const pg_pool_t& pool, pg_t pg, vector<int>& osds) {
458
int _pg_to_osds(const pg_pool_t& pool, pg_t pg, vector<int>& osds) const {
447
460
ps_t pps = pool.raw_pg_to_pps(pg); // placement ps
448
461
unsigned size = pool.get_size();
465
478
// pg -> (up osd list)
466
void _raw_to_up_osds(pg_t pg, vector<int>& raw, vector<int>& up) {
479
void _raw_to_up_osds(pg_t pg, vector<int>& raw, vector<int>& up) const {
468
481
for (unsigned i=0; i<raw.size(); i++) {
469
482
if (!exists(raw[i]) || is_down(raw[i]))
475
bool _raw_to_temp_osds(const pg_pool_t& pool, pg_t pg, vector<int>& raw, vector<int>& temp) {
488
bool _raw_to_temp_osds(const pg_pool_t& pool, pg_t pg, vector<int>& raw, vector<int>& temp) const {
476
489
pg = pool.raw_pg_to_pg(pg);
477
map<pg_t,vector<int> >::iterator p = pg_temp.find(pg);
490
map<pg_t,vector<int> >::const_iterator p = pg_temp.find(pg);
478
491
if (p != pg_temp.end()) {
480
493
for (unsigned i=0; i<p->second.size(); i++) {
491
int pg_to_osds(pg_t pg, vector<int>& raw) {
504
int pg_to_osds(pg_t pg, vector<int>& raw) const {
492
505
const pg_pool_t *pool = get_pg_pool(pg.pool());
495
508
return _pg_to_osds(*pool, pg, raw);
498
int pg_to_acting_osds(pg_t pg, vector<int>& acting) { // list of osd addr's
511
int pg_to_acting_osds(pg_t pg, vector<int>& acting) const { // list of osd addr's
499
512
const pg_pool_t *pool = get_pg_pool(pg.pool());
515
528
_raw_to_up_osds(pg, raw, up);
518
void pg_to_up_acting_osds(pg_t pg, vector<int>& up, vector<int>& acting) {
531
void pg_to_up_acting_osds(pg_t pg, vector<int>& up, vector<int>& acting) const {
519
532
const pg_pool_t *pool = get_pg_pool(pg.pool());
535
548
const map<int64_t,pg_pool_t>& get_pools() { return pools; }
536
const char *get_pool_name(int64_t p) {
537
if (pool_name.count(p))
538
return pool_name[p].c_str();
549
const char *get_pool_name(int64_t p) const {
550
map<int64_t, string>::const_iterator i = pool_name.find(p);
551
if (i != pool_name.end())
552
return i->second.c_str();
541
555
bool have_pg_pool(int64_t p) const {
542
556
return pools.count(p);
544
const pg_pool_t* get_pg_pool(int64_t p) {
558
const pg_pool_t* get_pg_pool(int64_t p) const {
559
map<int64_t, pg_pool_t>::const_iterator i = pools.find(p);
560
if (i != pools.end())
549
564
unsigned get_pg_size(pg_t pg) const {
551
566
assert(p != pools.end());
552
567
return p->second.get_size();
554
int get_pg_type(pg_t pg) {
569
int get_pg_type(pg_t pg) const {
555
570
assert(pools.count(pg.pool()));
556
pg_pool_t &pool = pools[pg.pool()];
557
return pool.get_type();
571
return pools.find(pg.pool())->second.get_type();
561
pg_t raw_pg_to_pg(pg_t pg) {
575
pg_t raw_pg_to_pg(pg_t pg) const {
562
576
assert(pools.count(pg.pool()));
563
pg_pool_t &pool = pools[pg.pool()];
564
return pool.raw_pg_to_pg(pg);
577
return pools.find(pg.pool())->second.raw_pg_to_pg(pg);
567
580
// pg -> primary osd
614
627
return PG_ROLE_MIDDLE;
617
int get_pg_role(pg_t pg, int osd) {
630
int get_pg_role(pg_t pg, int osd) const {
618
631
vector<int> group;
619
632
int nrep = pg_to_osds(pg, group);
620
633
return calc_pg_role(osd, group, nrep);
638
651
* handy helpers to build simple maps...
640
void build_simple(CephContext *cct, epoch_t e, ceph_fsid_t &fsid,
641
int num_osd, int num_dom,
642
int pg_bits, int pgp_bits, int lpg_bits);
643
void build_simple_from_conf(CephContext *cct, epoch_t e, ceph_fsid_t &fsid,
653
void build_simple(CephContext *cct, epoch_t e, uuid_d &fsid,
654
int num_osd, int pg_bits, int pgp_bits, int lpg_bits);
655
void build_simple_from_conf(CephContext *cct, epoch_t e, uuid_d &fsid,
644
656
int pg_bits, int pgp_bits, int lpg_bits);
645
657
static void build_simple_crush_map(CephContext *cct, CrushWrapper& crush,
646
map<int, const char*>& poolsets, int num_osd, int num_dom=0);
658
map<int, const char*>& poolsets, int num_osd);
647
659
static void build_simple_crush_map_from_conf(CephContext *cct, CrushWrapper& crush,
648
660
map<int, const char*>& rulesets);