set<pair<spg_t,epoch_t>> *split_children,
set<pair<spg_t,epoch_t>> *merge_pgs)
{
+ dout(20) << __func__ << " " << pgid << " e" << old_map->get_epoch()
+ << " to e" << new_map->get_epoch() << dendl;
if (!old_map->have_pg_pool(pgid.pool())) {
+ dout(20) << __func__ << " " << pgid << " pool " << pgid.pool()
+ << " does not exist in old map" << dendl;
return;
}
int old_pgnum = old_map->get_pg_num(pgid.pool());
auto p = osd->pg_num_history.pg_nums.find(pgid.pool());
if (p == osd->pg_num_history.pg_nums.end()) {
+ dout(20) << __func__ << " " << pgid << " pool " << pgid.pool()
+ << " has no history" << dendl;
return;
}
dout(20) << __func__ << " " << pgid << " e" << old_map->get_epoch()
agent_cond.notify_all();
}
+OSDMapRef OSDService::get_nextmap_reserved() {
+ std::lock_guard l(pre_publish_lock);
+
+ epoch_t e = next_osdmap->get_epoch();
+
+ std::map<epoch_t, unsigned>::iterator i =
+ map_reservations.insert(std::make_pair(e, 0)).first;
+ i->second++;
+ dout(20) << __func__ << " map_reservations: " << map_reservations << dendl;
+ return next_osdmap;
+}
+
+/// releases reservation on map
+void OSDService::release_map(OSDMapRef osdmap) {
+ std::lock_guard l(pre_publish_lock);
+ dout(20) << __func__ << " epoch: " << osdmap->get_epoch() << dendl;
+ std::map<epoch_t, unsigned>::iterator i =
+ map_reservations.find(osdmap->get_epoch());
+ ceph_assert(i != map_reservations.end());
+ ceph_assert(i->second > 0);
+ if (--(i->second) == 0) {
+ map_reservations.erase(i);
+ }
+ if (pre_publish_waiter) {
+ dout(20) << __func__ << " notify all." << dendl;
+ pre_publish_cond.notify_all();
+ }
+}
+
+/// blocks until there are no reserved maps prior to next_osdmap
+void OSDService::await_reserved_maps() {
+ std::unique_lock l{pre_publish_lock};
+ dout(20) << __func__ << " epoch:" << next_osdmap->get_epoch() << dendl;
+
+ ceph_assert(next_osdmap);
+ pre_publish_waiter++;
+ pre_publish_cond.wait(l, [this] {
+ auto i = map_reservations.cbegin();
+ return (i == map_reservations.cend() ||
+ i->first >= next_osdmap->get_epoch());
+ });
+ pre_publish_waiter--;
+ dout(20) << __func__ << " done " << pre_publish_waiter << dendl;
+}
+
void OSDService::request_osdmap_update(epoch_t e)
{
osd->osdmap_subscribe(e, false);
void OSDService::send_message_osd_cluster(int peer, Message *m, epoch_t from_epoch)
{
+ dout(20) << __func__ << " " << m->get_type_name() << " to osd." << peer
+ << " from_epoch " << from_epoch << dendl;
OSDMapRef next_map = get_nextmap_reserved();
// service map is always newer/newest
ceph_assert(from_epoch <= next_map->get_epoch());
void OSDService::send_message_osd_cluster(std::vector<std::pair<int, Message*>>& messages, epoch_t from_epoch)
{
+ dout(20) << __func__ << " from_epoch " << from_epoch << dendl;
OSDMapRef next_map = get_nextmap_reserved();
// service map is always newer/newest
ceph_assert(from_epoch <= next_map->get_epoch());
}
ConnectionRef OSDService::get_con_osd_cluster(int peer, epoch_t from_epoch)
{
+ dout(20) << __func__ << " to osd." << peer
+ << " from_epoch " << from_epoch << dendl;
OSDMapRef next_map = get_nextmap_reserved();
// service map is always newer/newest
ceph_assert(from_epoch <= next_map->get_epoch());
pair<ConnectionRef,ConnectionRef> OSDService::get_con_osd_hb(int peer, epoch_t from_epoch)
{
+ dout(20) << __func__ << " to osd." << peer
+ << " from_epoch " << from_epoch << dendl;
OSDMapRef next_map = get_nextmap_reserved();
// service map is always newer/newest
ceph_assert(from_epoch <= next_map->get_epoch());
dout(10) << __func__ << " " << *i << dendl;
i = sent_ready_to_merge_source.erase(i);
} else {
+ dout(20) << __func__ << " exist " << *i << dendl;
++i;
}
}
{
ceph_assert(ceph_mutex_is_locked(osd_lock));
auto osdmap = get_osdmap();
- dout(7) << "consume_map version " << osdmap->get_epoch() << dendl;
+ dout(20) << __func__ << " version " << osdmap->get_epoch() << dendl;
/** make sure the cluster is speaking in SORTBITWISE, because we don't
* speak the older sorting version any more. Be careful not to force
derr << __func__ << " SORTBITWISE flag is not set" << dendl;
ceph_abort();
}
-
service.pre_publish_map(osdmap);
service.await_reserved_maps();
service.publish_map(osdmap);
-
+ dout(20) << "consume_map " << osdmap->get_epoch() << " -- publish done" << dendl;
// prime splits and merges
set<pair<spg_t,epoch_t>> newly_split; // splits, and when
set<pair<spg_t,epoch_t>> merge_pgs; // merge participants, and when
set<pair<spg_t,epoch_t>> *merge_pgs)
{
std::lock_guard l(shard_lock);
+ dout(20) << __func__ << " " << pg_slots.size() << " slots" << dendl;
if (shard_osdmap) {
for (auto& i : pg_slots) {
+ dout(20) << __func__ << " slot pgid:" << i.first << "slot:" << i.second.get() << dendl;
const spg_t& pgid = i.first;
auto *slot = i.second.get();
if (slot->pg) {
}
}
}
+ dout(20) << __func__ << " " << split_pgs->size() << " splits, "
+ << merge_pgs->size() << " merges" << dendl;
}
void OSDShard::prime_splits(const OSDMapRef& as_of_osdmap,
std::map<epoch_t, unsigned> map_reservations;
/// gets ref to next_osdmap and registers the epoch as reserved
- OSDMapRef get_nextmap_reserved() {
- std::lock_guard l(pre_publish_lock);
- epoch_t e = next_osdmap->get_epoch();
- std::map<epoch_t, unsigned>::iterator i =
- map_reservations.insert(std::make_pair(e, 0)).first;
- i->second++;
- return next_osdmap;
- }
+ OSDMapRef get_nextmap_reserved();
/// releases reservation on map
- void release_map(OSDMapRef osdmap) {
- std::lock_guard l(pre_publish_lock);
- std::map<epoch_t, unsigned>::iterator i =
- map_reservations.find(osdmap->get_epoch());
- ceph_assert(i != map_reservations.end());
- ceph_assert(i->second > 0);
- if (--(i->second) == 0) {
- map_reservations.erase(i);
- }
- if (pre_publish_waiter) {
- pre_publish_cond.notify_all();
- }
- }
+ void release_map(OSDMapRef osdmap);
/// blocks until there are no reserved maps prior to next_osdmap
- void await_reserved_maps() {
- std::unique_lock l{pre_publish_lock};
- ceph_assert(next_osdmap);
- pre_publish_waiter++;
- pre_publish_cond.wait(l, [this] {
- auto i = map_reservations.cbegin();
- return (i == map_reservations.cend() ||
- i->first >= next_osdmap->get_epoch());
- });
- pre_publish_waiter--;
- }
+ void await_reserved_maps() ;
OSDMapRef get_next_osdmap() {
std::lock_guard l(pre_publish_lock);
return next_osdmap;