From ba2488f238923199534d56a8a86df4e48c2ddd96 Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Sat, 19 May 2012 13:24:47 -0700 Subject: [PATCH] osdmap: use pg[p]_num accessors This lets us ensure that calc_pg_masks() is called when pg[p]_num is set or modified. Fixes: #2448 Backport: dho Signed-off-by: Sage Weil --- src/mon/OSDMonitor.cc | 10 ++++------ src/osd/OSD.cc | 9 +++++---- src/osd/OSDMap.cc | 8 ++++---- src/osd/osd_types.h | 11 +++++++++++ 4 files changed, 24 insertions(+), 14 deletions(-) diff --git a/src/mon/OSDMonitor.cc b/src/mon/OSDMonitor.cc index 81d147a9f358e..e9ef7ceb73425 100644 --- a/src/mon/OSDMonitor.cc +++ b/src/mon/OSDMonitor.cc @@ -1685,10 +1685,8 @@ int OSDMonitor::prepare_new_pool(string& name, uint64_t auid, int crush_rule, else pending_inc.new_pools[pool].crush_ruleset = g_conf->osd_pool_default_crush_rule; pending_inc.new_pools[pool].object_hash = CEPH_STR_HASH_RJENKINS; - pending_inc.new_pools[pool].pg_num = (pg_num ? pg_num : - g_conf->osd_pool_default_pg_num); - pending_inc.new_pools[pool].pgp_num = (pgp_num ? pgp_num : - g_conf->osd_pool_default_pgp_num); + pending_inc.new_pools[pool].set_pg_num(pg_num ? pg_num : g_conf->osd_pool_default_pg_num); + pending_inc.new_pools[pool].set_pgp_num(pgp_num ? pgp_num : g_conf->osd_pool_default_pgp_num); pending_inc.new_pools[pool].last_change = pending_inc.epoch; pending_inc.new_pools[pool].auid = auid; pending_inc.new_pool_names[pool] = name; @@ -2295,7 +2293,7 @@ bool OSDMonitor::prepare_command(MMonCommand *m) } else { if (pending_inc.new_pools.count(pool) == 0) pending_inc.new_pools[pool] = *p; - pending_inc.new_pools[pool].pg_num = n; + pending_inc.new_pools[pool].set_pg_num(n); pending_inc.new_pools[pool].last_change = pending_inc.epoch; ss << "set pool " << pool << " pg_num to " << n; getline(ss, rs); @@ -2311,7 +2309,7 @@ bool OSDMonitor::prepare_command(MMonCommand *m) } else { if (pending_inc.new_pools.count(pool) == 0) pending_inc.new_pools[pool] = *p; - pending_inc.new_pools[pool].pgp_num = n; + pending_inc.new_pools[pool].set_pgp_num(n); pending_inc.new_pools[pool].last_change = pending_inc.epoch; ss << "set pool " << pool << " pgp_num to " << n; getline(ss, rs); diff --git a/src/osd/OSD.cc b/src/osd/OSD.cc index 48d8db53e53e4..cc81d251ccb6e 100644 --- a/src/osd/OSD.cc +++ b/src/osd/OSD.cc @@ -3521,9 +3521,10 @@ void OSD::advance_map(ObjectStore::Transaction& t, C_Contexts *tfin) pool->auid = pi->auid; // split? - if (pool->info.pg_num != pi->pg_num) { - dout(1) << " pool " << p->first << " pg_num " << pool->info.pg_num << " -> " << pi->pg_num << dendl; - pool_resize[p->first] = pool->info.pg_num; + if (pool->info.get_pg_num() != pi->get_pg_num()) { + dout(1) << " pool " << p->first << " pg_num " << pool->info.get_pg_num() + << " -> " << pi->get_pg_num() << dendl; + pool_resize[p->first] = pool->info.get_pg_num(); changed = true; } @@ -3579,7 +3580,7 @@ void OSD::advance_map(ObjectStore::Transaction& t, C_Contexts *tfin) pg_t pgid = it->first; PG *pg = it->second; set children; - if (pgid.is_split(p->second, pg->pool->info.pg_num, &children)) { + if (pgid.is_split(p->second, pg->pool->info.get_pg_num(), &children)) { do_split(pg, children, t, tfin); } } diff --git a/src/osd/OSDMap.cc b/src/osd/OSDMap.cc index 0b5b45917ff4a..401d5eda58775 100644 --- a/src/osd/OSDMap.cc +++ b/src/osd/OSDMap.cc @@ -1451,8 +1451,8 @@ void OSDMap::build_simple(CephContext *cct, epoch_t e, uuid_d &fsid, pools[pool].size = cct->_conf->osd_pool_default_size; pools[pool].crush_ruleset = p->first; pools[pool].object_hash = CEPH_STR_HASH_RJENKINS; - pools[pool].pg_num = poolbase << pg_bits; - pools[pool].pgp_num = poolbase << pgp_bits; + pools[pool].set_pg_num(poolbase << pg_bits); + pools[pool].set_pgp_num(poolbase << pgp_bits); pools[pool].last_change = epoch; if (p->first == CEPH_DATA_RULE) pools[pool].crash_replay_interval = cct->_conf->osd_default_data_pool_replay_window; @@ -1565,8 +1565,8 @@ void OSDMap::build_simple_from_conf(CephContext *cct, epoch_t e, uuid_d &fsid, pools[pool].size = cct->_conf->osd_pool_default_size; pools[pool].crush_ruleset = p->first; pools[pool].object_hash = CEPH_STR_HASH_RJENKINS; - pools[pool].pg_num = (maxosd + 1) << pg_bits; - pools[pool].pgp_num = (maxosd + 1) << pgp_bits; + pools[pool].set_pg_num((maxosd + 1) << pg_bits); + pools[pool].set_pgp_num((maxosd + 1) << pgp_bits); pools[pool].last_change = epoch; if (p->first == CEPH_DATA_RULE) pools[pool].crash_replay_interval = cct->_conf->osd_default_data_pool_replay_window; diff --git a/src/osd/osd_types.h b/src/osd/osd_types.h index 58c6a552b38e7..625c8675912a8 100644 --- a/src/osd/osd_types.h +++ b/src/osd/osd_types.h @@ -597,7 +597,9 @@ struct pg_pool_t { __u8 size; /// number of osds in each pg __u8 crush_ruleset; /// crush placement rule set __u8 object_hash; /// hash mapping object name to ps +private: __u32 pg_num, pgp_num; /// number of pgs +public: epoch_t last_change; /// most recent epoch changed, exclusing snapshot changes snapid_t snap_seq; /// seq for per-pool snapshot epoch_t snap_epoch; /// osdmap epoch of last snap @@ -657,6 +659,15 @@ struct pg_pool_t { unsigned get_pg_num_mask() const { return pg_num_mask; } unsigned get_pgp_num_mask() const { return pgp_num_mask; } + void set_pg_num(int p) { + pg_num = p; + calc_pg_masks(); + } + void set_pgp_num(int p) { + pgp_num = p; + calc_pg_masks(); + } + static int calc_bits_of(int t); void calc_pg_masks(); -- 2.39.5