void OSDMonitor::share_map_with_random_osd()
{
- // tell any osd
- MonSession *s = mon->session_map.get_random_osd_session();
- if (s) {
- dout(10) << "committed, telling random " << s->inst << " all about it" << dendl;
- MOSDMap *m = build_incremental(osdmap.get_epoch() - 1, osdmap.get_epoch()); // whatev, they'll request more if they need it
- mon->messenger->send_message(m, s->inst);
+ if (osdmap.get_num_up_osds() == 0) {
+ dout(10) << __func__ << " no up osds, don't share with anyone" << dendl;
+ return;
}
+
+ MonSession *s = mon->session_map.get_random_osd_session(&osdmap);
+ if (!s) {
+ dout(10) << __func__ << " no up osd on our session map" << dendl;
+ return;
+ }
+
+ dout(10) << "committed, telling random " << s->inst << " all about it" << dendl;
+ // whatev, they'll request more if they need it
+ MOSDMap *m = build_incremental(osdmap.get_epoch() - 1, osdmap.get_epoch());
+ mon->messenger->send_message(m, s->inst);
}
#include "msg/msg_types.h"
#include "auth/AuthServiceHandler.h"
+#include "osd/OSDMap.h"
#include "MonCaps.h"
s->get(); // caller gets a ref
return s;
}
-
- MonSession *get_random_osd_session() {
+
+ MonSession *get_random_osd_session(OSDMap *osdmap) {
// ok, this isn't actually random, but close enough.
if (by_osd.empty())
return 0;
int n = by_osd.rbegin()->first + 1;
int r = rand() % n;
+
multimap<int,MonSession*>::iterator p = by_osd.lower_bound(r);
if (p == by_osd.end())
p--;
- return p->second;
- }
+ if (!osdmap) {
+ return p->second;
+ }
+
+ MonSession *s = NULL;
+
+ multimap<int,MonSession*>::iterator b = p, f = p;
+ bool backward = true, forward = true;
+ while (backward || forward) {
+ if (backward) {
+ if (osdmap->is_up(b->first)) {
+ s = b->second;
+ break;
+ }
+ if (b != by_osd.begin())
+ --b;
+ else
+ backward = false;
+ }
+
+ forward = (f != by_osd.end());
+ if (forward) {
+ if (osdmap->is_up(f->first)) {
+ s = f->second;
+ break;
+ }
+ ++f;
+ }
+ }
+
+ return s;
+ }
void add_update_sub(MonSession *s, const string& what, version_t start, bool onetime, bool incremental_onetime) {
Subscription *sub = 0;