* working from old maps.
*/
OSDMapRef next_osdmap;
+ Cond pre_publish_cond;
void pre_publish_map(OSDMapRef map) {
Mutex::Locker l(pre_publish_lock);
next_osdmap = map;
}
void activate_map();
+ /// map epochs reserved below
+ map<epoch_t, unsigned> map_reservations;
+
+ /// gets ref to next_osdmap and registers the epoch as reserved
+ OSDMapRef get_nextmap_reserved() {
+ Mutex::Locker l(pre_publish_lock);
+ if (!next_osdmap)
+ return OSDMapRef();
+ epoch_t e = next_osdmap->get_epoch();
+ map<epoch_t, unsigned>::iterator i =
+ map_reservations.insert(make_pair(e, 0)).first;
+ i->second++;
+ return next_osdmap;
+ }
+ /// releases reservation on map
+ void release_map(OSDMapRef osdmap) {
+ Mutex::Locker l(pre_publish_lock);
+ map<epoch_t, unsigned>::iterator i =
+ map_reservations.find(osdmap->get_epoch());
+ assert(i != map_reservations.end());
+ assert(i->second > 0);
+ if (--(i->second) == 0) {
+ map_reservations.erase(i);
+ }
+ pre_publish_cond.Signal();
+ }
+ /// blocks until there are no reserved maps prior to next_osdmap
+ void await_reserved_maps() {
+ Mutex::Locker l(pre_publish_lock);
+ assert(next_osdmap);
+ while (true) {
+ map<epoch_t, unsigned>::iterator i = map_reservations.begin();
+ if (i == map_reservations.end() || i->first >= next_osdmap->get_epoch()) {
+ break;
+ } else {
+ pre_publish_cond.Wait(pre_publish_lock);
+ }
+ }
+ }
ConnectionRef get_con_osd_cluster(int peer, epoch_t from_epoch);
pair<ConnectionRef,ConnectionRef> get_con_osd_hb(int peer, epoch_t from_epoch); // (back, front)