ENCODE_START(7, 7, bl);
{
- ENCODE_START(1, 1, bl); // client-usable data
+ ENCODE_START(2, 1, bl); // client-usable data
::encode(fsid, bl);
::encode(epoch, bl);
::encode(modified, bl);
::encode(new_weight, bl);
::encode(new_pg_temp, bl);
::encode(new_primary_temp, bl);
+ ::encode(new_primary_affinity, bl);
ENCODE_FINISH(bl); // client-usable data
}
return;
}
{
- DECODE_START(1, bl); // client-usable data
+ DECODE_START(2, bl); // client-usable data
::decode(fsid, bl);
::decode(epoch, bl);
::decode(modified, bl);
::decode(new_weight, bl);
::decode(new_pg_temp, bl);
::decode(new_primary_temp, bl);
+ if (struct_v >= 2)
+ ::decode(new_primary_affinity, bl);
+ else
+ new_primary_affinity.clear();
DECODE_FINISH(bl); // client-usable data
}
osd_addrs->hb_back_addr.resize(m);
osd_addrs->hb_front_addr.resize(m);
osd_uuid->resize(m);
+ if (osd_primary_affinity)
+ osd_primary_affinity->resize(m, CEPH_OSD_DEFAULT_PRIMARY_AFFINITY);
calc_num_osds();
}
osd_state[i->first] &= ~(CEPH_OSD_AUTOOUT | CEPH_OSD_NEW);
}
+ for (map<int32_t,uint32_t>::const_iterator i = inc.new_primary_affinity.begin();
+ i != inc.new_primary_affinity.end();
+ ++i) {
+ set_primary_affinity(i->first, i->second);
+ }
+
// up/down
for (map<int32_t,uint8_t>::const_iterator i = inc.new_state.begin();
i != inc.new_state.end();
const pg_pool_t *pool = get_pg_pool(pg.pool());
if (!pool)
return 0;
- int r = _pg_to_osds(*pool, pg, raw, primary);
+ int r = _pg_to_osds(*pool, pg, raw, primary, NULL);
return r;
}
ENCODE_START(7, 7, bl);
{
- ENCODE_START(1, 1, bl); // client-usable data
+ ENCODE_START(2, 1, bl); // client-usable data
// base
::encode(fsid, bl);
::encode(epoch, bl);
::encode(*pg_temp, bl);
::encode(*primary_temp, bl);
+ if (osd_primary_affinity) {
+ ::encode(*osd_primary_affinity, bl);
+ } else {
+ vector<__u32> v;
+ ::encode(v, bl);
+ }
// crush
bufferlist cbl;
else
osd_addrs->hb_front_addr.resize(osd_addrs->hb_back_addr.size());
+ osd_primary_affinity.reset();
+
post_decode();
}
* Since we made it past that hurdle, we can use our normal paths.
*/
{
- DECODE_START(1, bl); // client-usable data
+ DECODE_START(2, bl); // client-usable data
// base
::decode(fsid, bl);
::decode(epoch, bl);
::decode(*pg_temp, bl);
::decode(*primary_temp, bl);
+ if (struct_v >= 2) {
+ osd_primary_affinity.reset(new vector<__u32>);
+ ::decode(*osd_primary_affinity, bl);
+ if (osd_primary_affinity->empty())
+ osd_primary_affinity.reset();
+ } else {
+ osd_primary_affinity.reset();
+ }
// crush
bufferlist cbl;
f->dump_stream("uuid") << get_uuid(i);
f->dump_int("up", is_up(i));
f->dump_int("in", is_in(i));
+ f->dump_float("weight", get_weightf(i));
+ f->dump_float("primary_affinity", get_primary_affinityf(i));
get_info(i).dump(f);
f->dump_stream("public_addr") << get_addr(i);
f->dump_stream("cluster_addr") << get_cluster_addr(i);
map<int32_t,uint32_t> new_weight;
map<pg_t,vector<int32_t> > new_pg_temp; // [] to remove
map<pg_t, int> new_primary_temp; // [-1] to remove
+ map<int32_t,uint32_t> new_primary_affinity;
map<int32_t,epoch_t> new_up_thru;
map<int32_t,pair<epoch_t,epoch_t> > new_last_clean_interval;
map<int32_t,epoch_t> new_lost;
vector<osd_info_t> osd_info;
ceph::shared_ptr< map<pg_t,vector<int> > > pg_temp; // temp pg mapping (e.g. while we rebuild)
ceph::shared_ptr< map<pg_t,int > > primary_temp; // temp primary mapping (e.g. while we rebuild)
+ ceph::shared_ptr< vector<__u32> > osd_primary_affinity; ///< 16.16 fixed point, 0x10000 = baseline
map<int64_t,pg_pool_t> pools;
map<int64_t,string> pool_name;
}
void adjust_osd_weights(const map<int,double>& weights, Incremental& inc) const;
+ void set_primary_affinity(int o, int w) {
+ assert(o < max_osd);
+ if (!osd_primary_affinity)
+ osd_primary_affinity.reset(new vector<__u32>(max_osd,
+ CEPH_OSD_DEFAULT_PRIMARY_AFFINITY));
+ (*osd_primary_affinity)[o] = w;
+ }
+ unsigned get_primary_affinity(int o) const {
+ assert(o < max_osd);
+ if (!osd_primary_affinity)
+ return CEPH_OSD_DEFAULT_PRIMARY_AFFINITY;
+ return (*osd_primary_affinity)[o];
+ }
+ float get_primary_affinityf(int o) const {
+ return (float)get_primary_affinity(o) / (float)CEPH_OSD_MAX_PRIMARY_AFFINITY;
+ }
+
bool exists(int osd) const {
//assert(osd >= 0);
return osd >= 0 && osd < max_osd && (osd_state[osd] & CEPH_OSD_EXISTS);