summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSage Weil <sage@newdream.net>2012-05-01 16:12:02 -0700
committerSage Weil <sage@newdream.net>2012-05-01 16:12:02 -0700
commitca4311e5e39cec8fad85fad3e67eea968707e9eb (patch)
treee70d7ada5a1b327400b26f71ed878c6db42b3493
parentc3fb68ee1bcefb4518e2c2154674ca3cd191cf8c (diff)
downloadceph-ca4311e5e39cec8fad85fad3e67eea968707e9eb.tar.gz
osdmap: store a uuid for each osd
Rev the extended section of the map to store it. Dump it when the osd exists. Zero it out if an osd is destroyed. Provide some accessors to identify an osd given a uuid (linear search). Signed-off-by: Sage Weil <sage@newdream.net>
-rw-r--r--src/osd/OSDMap.cc58
-rw-r--r--src/osd/OSDMap.h12
2 files changed, 68 insertions, 2 deletions
diff --git a/src/osd/OSDMap.cc b/src/osd/OSDMap.cc
index fb73a83a98a..4ffda17b439 100644
--- a/src/osd/OSDMap.cc
+++ b/src/osd/OSDMap.cc
@@ -116,6 +116,16 @@ int OSDMap::Incremental::get_net_marked_down(const OSDMap *previous) const
return n;
}
+int OSDMap::Incremental::identify_osd(uuid_d u) const
+{
+ for (map<int32_t,uuid_d>::const_iterator p = new_uuid.begin();
+ p != new_uuid.end();
+ ++p)
+ if (p->second == u)
+ return p->first;
+ return -1;
+}
+
void OSDMap::Incremental::encode_client_old(bufferlist& bl) const
{
__u16 v = 5;
@@ -198,7 +208,7 @@ void OSDMap::Incremental::encode(bufferlist& bl, uint64_t features) const
::encode(new_pg_temp, bl);
// extended
- __u16 ev = CEPH_OSDMAP_INC_VERSION_EXT;
+ __u16 ev = 8;
::encode(ev, bl);
::encode(new_hb_up, bl);
::encode(new_up_thru, bl);
@@ -208,6 +218,7 @@ void OSDMap::Incremental::encode(bufferlist& bl, uint64_t features) const
::encode(old_blacklist, bl);
::encode(new_up_internal, bl);
::encode(cluster_snapshot, bl);
+ ::encode(new_uuid, bl);
}
void OSDMap::Incremental::decode(bufferlist::iterator &p)
@@ -295,6 +306,8 @@ void OSDMap::Incremental::decode(bufferlist::iterator &p)
::decode(new_up_internal, p);
if (ev >= 7)
::decode(cluster_snapshot, p);
+ if (ev >= 8)
+ ::decode(new_uuid, p);
}
void OSDMap::Incremental::dump(Formatter *f) const
@@ -433,6 +446,15 @@ void OSDMap::Incremental::dump(Formatter *f) const
if (cluster_snapshot.size())
f->dump_string("cluster_snapshot", cluster_snapshot);
+
+ f->open_array_section("new_uuid");
+ for (map<int32_t,uuid_d>::const_iterator p = new_uuid.begin(); p != new_uuid.end(); ++p) {
+ f->open_object_section("osd");
+ f->dump_int("osd", p->first);
+ f->dump_stream("uuid") << p->second;
+ f->close_section();
+ }
+ f->close_section();
}
void OSDMap::Incremental::generate_test_instances(list<Incremental*>& o)
@@ -482,6 +504,7 @@ void OSDMap::set_max_osd(int m)
osd_addrs->client_addr.resize(m);
osd_addrs->cluster_addr.resize(m);
osd_addrs->hb_addr.resize(m);
+ osd_uuid->resize(m);
calc_num_osds();
}
@@ -554,6 +577,14 @@ int OSDMap::identify_osd(const entity_addr_t& addr) const
return -1;
}
+int OSDMap::identify_osd(const uuid_d& u) const
+{
+ for (int i=0; i<max_osd; i++)
+ if (exists(i) && get_uuid(i) == u)
+ return i;
+ return -1;
+}
+
bool OSDMap::find_osd_on_ip(const entity_addr_t& ip) const
{
for (int i=0; i<max_osd; i++)
@@ -607,6 +638,11 @@ void OSDMap::dedup(const OSDMap *o, OSDMap *n)
if (*o->pg_temp == *n->pg_temp)
n->pg_temp = o->pg_temp;
}
+
+ // do uuids match?
+ if (o->osd_uuid->size() == n->osd_uuid->size() &&
+ *o->osd_uuid == *n->osd_uuid)
+ n->osd_uuid = o->osd_uuid;
}
int OSDMap::apply_incremental(Incremental &inc)
@@ -675,6 +711,9 @@ int OSDMap::apply_incremental(Incremental &inc)
(s & CEPH_OSD_UP)) {
osd_info[i->first].down_at = epoch;
}
+ if ((osd_state[i->first] & CEPH_OSD_EXISTS) &&
+ (s & CEPH_OSD_EXISTS))
+ (*osd_uuid)[i->first] = uuid_d();
osd_state[i->first] ^= s;
}
for (map<int32_t,entity_addr_t>::iterator i = inc.new_up_client.begin();
@@ -692,6 +731,7 @@ int OSDMap::apply_incremental(Incremental &inc)
i != inc.new_up_internal.end();
i++)
osd_addrs->cluster_addr[i->first].reset(new entity_addr_t(i->second));
+
// info
for (map<int32_t,epoch_t>::iterator i = inc.new_up_thru.begin();
i != inc.new_up_thru.end();
@@ -706,6 +746,10 @@ int OSDMap::apply_incremental(Incremental &inc)
for (map<int32_t,epoch_t>::iterator p = inc.new_lost.begin(); p != inc.new_lost.end(); p++)
osd_info[p->first].lost_at = p->second;
+ // uuid
+ for (map<int32_t,uuid_d>::iterator p = inc.new_uuid.begin(); p != inc.new_uuid.end(); ++p)
+ (*osd_uuid)[p->first] = p->second;
+
// pg rebuild
for (map<pg_t, vector<int> >::iterator p = inc.new_pg_temp.begin(); p != inc.new_pg_temp.end(); p++) {
if (p->second.empty())
@@ -968,7 +1012,7 @@ void OSDMap::encode(bufferlist& bl, uint64_t features) const
::encode(cbl, bl);
// extended
- __u16 ev = CEPH_OSDMAP_VERSION_EXT;
+ __u16 ev = 8;
::encode(ev, bl);
::encode(osd_addrs->hb_addr, bl);
::encode(osd_info, bl);
@@ -976,6 +1020,7 @@ void OSDMap::encode(bufferlist& bl, uint64_t features) const
::encode(osd_addrs->cluster_addr, bl);
::encode(cluster_snapshot_epoch, bl);
::encode(cluster_snapshot, bl);
+ ::encode(*osd_uuid, bl);
}
void OSDMap::decode(bufferlist& bl)
@@ -1075,6 +1120,12 @@ void OSDMap::decode(bufferlist::iterator& p)
::decode(cluster_snapshot, p);
}
+ if (ev >= 8) {
+ ::decode(*osd_uuid, p);
+ } else {
+ osd_uuid->resize(max_osd);
+ }
+
// index pool names
name_pool.clear();
for (map<int64_t,string>::iterator i = pool_name.begin(); i != pool_name.end(); i++)
@@ -1119,6 +1170,7 @@ void OSDMap::dump(Formatter *f) const
if (exists(i)) {
f->open_object_section("osd_info");
f->dump_int("osd", i);
+ f->dump_stream("uuid") << get_uuid(i);
f->dump_int("up", is_up(i));
f->dump_int("in", is_in(i));
get_info(i).dump(f);
@@ -1252,6 +1304,8 @@ void OSDMap::print(ostream& out) const
set<string> st;
get_state(i, st);
out << " " << st;
+ if (!get_uuid(i).is_zero())
+ out << " " << get_uuid(i);
out << "\n";
}
}
diff --git a/src/osd/OSDMap.h b/src/osd/OSDMap.h
index f76f22d6db3..dc0162c3b04 100644
--- a/src/osd/OSDMap.h
+++ b/src/osd/OSDMap.h
@@ -115,6 +115,7 @@ public:
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;
+ map<int32_t,uuid_d> new_uuid;
map<entity_addr_t,utime_t> new_blacklist;
vector<entity_addr_t> old_blacklist;
@@ -124,6 +125,7 @@ public:
int get_net_marked_out(const OSDMap *previous) const;
int get_net_marked_down(const OSDMap *previous) const;
+ int identify_osd(uuid_d u) const;
void encode_client_old(bufferlist& bl) const;
void encode(bufferlist& bl, uint64_t features=-1) const;
@@ -172,6 +174,8 @@ private:
map<int64_t,string> pool_name;
map<string,int64_t> name_pool;
+ std::tr1::shared_ptr< vector<uuid_d> > osd_uuid;
+
hash_map<entity_addr_t,utime_t> blacklist;
epoch_t cluster_snapshot_epoch;
@@ -191,6 +195,7 @@ private:
num_osd(0), max_osd(0),
osd_addrs(new addrs_s),
pg_temp(new map<pg_t,vector<int> >),
+ osd_uuid(new vector<uuid_d>),
cluster_snapshot_epoch(0),
crush(new CrushWrapper) {
memset(&fsid, 0, sizeof(fsid));
@@ -292,6 +297,8 @@ private:
}
int identify_osd(const entity_addr_t& addr) const;
+ int identify_osd(const uuid_d& u) const;
+
bool have_addr(const entity_addr_t& addr) const {
return identify_osd(addr) >= 0;
}
@@ -326,6 +333,11 @@ private:
return entity_inst_t(entity_name_t::OSD(osd), get_hb_addr(osd));
}
+ const uuid_d& get_uuid(int osd) const {
+ assert(exists(osd));
+ return (*osd_uuid)[osd];
+ }
+
const epoch_t& get_up_from(int osd) const {
assert(exists(osd));
return osd_info[osd].up_from;