class_handler(osd->class_handler),
osd_max_object_size(*cct->_conf, "osd_max_object_size"),
osd_skip_data_digest(*cct->_conf, "osd_skip_data_digest"),
- pg_epoch_lock("OSDService::pg_epoch_lock"),
publish_lock("OSDService::publish_lock"),
pre_publish_lock("OSDService::pre_publish_lock"),
max_oldest_map(0),
void OSDService::finish_pg_delete(PG *pg, unsigned old_pg_num)
{
- pg_remove_epoch(pg->get_pgid());
-
osd->unregister_pg(pg);
for (auto shard : osd->shards) {
shard->unprime_split_children(pg->pg_id, old_pg_num);
spg_t pgid)
{
PGRef pg = _make_pg(createmap, pgid);
- service.pg_add_epoch(pg->pg_id, createmap->get_epoch());
return pg;
}
pg->lock();
dout(10) << __func__ << " " << *pg << dendl;
epoch_t e = pg->get_osdmap_epoch();
- pg->unlock();
-
- service.pg_add_epoch(pg->pg_id, e);
-
- pg->lock();
pg->handle_initialize(&rctx);
pg->queue_null(e, e);
dispatch_context_transaction(rctx, pg);
handle.reset_tp_timeout();
}
pg->handle_activate_map(rctx);
- service.pg_update_epoch(pg->pg_id, lastmap->get_epoch());
if (!new_pgs.empty()) {
rctx->transaction->register_on_applied(new C_FinishSplits(this, new_pgs));
}
}
-private:
- // -- map epoch lower bound --
- Mutex pg_epoch_lock;
- Cond pg_cond;
- multiset<epoch_t> pg_epochs;
- map<spg_t,epoch_t> pg_epoch;
-
-public:
- void pg_add_epoch(spg_t pgid, epoch_t epoch) {
- Mutex::Locker l(pg_epoch_lock);
- map<spg_t,epoch_t>::iterator t = pg_epoch.find(pgid);
- assert(t == pg_epoch.end());
- pg_epoch[pgid] = epoch;
- pg_epochs.insert(epoch);
- if (*pg_epochs.begin() == epoch) {
- // we are the (new?) blocking epoch
- pg_cond.Signal();
- }
- }
- void pg_update_epoch(spg_t pgid, epoch_t epoch) {
- Mutex::Locker l(pg_epoch_lock);
- map<spg_t,epoch_t>::iterator t = pg_epoch.find(pgid);
- assert(t != pg_epoch.end());
- if (*pg_epochs.begin() == t->second) {
- // we were on the blocking epoch
- pg_cond.Signal();
- }
- pg_epochs.erase(pg_epochs.find(t->second));
- t->second = epoch;
- pg_epochs.insert(epoch);
- }
- void pg_remove_epoch(spg_t pgid) {
- Mutex::Locker l(pg_epoch_lock);
- map<spg_t,epoch_t>::iterator t = pg_epoch.find(pgid);
- if (t != pg_epoch.end()) {
- if (*pg_epochs.begin() == t->second) {
- // we were on the blocking epoch
- pg_cond.Signal();
- }
- pg_epochs.erase(pg_epochs.find(t->second));
- pg_epoch.erase(t);
- }
- }
- epoch_t get_min_pg_epoch() {
- Mutex::Locker l(pg_epoch_lock);
- if (pg_epochs.empty())
- return 0;
- else
- return *pg_epochs.begin();
- }
-
- void wait_min_pg_epoch(epoch_t e) {
- Mutex::Locker l(pg_epoch_lock);
- while (!pg_epochs.empty() &&
- *pg_epochs.begin() < e) {
- pg_cond.Wait(pg_epoch_lock);
- }
- }
-
private:
// -- superblock --
Mutex publish_lock, pre_publish_lock; // pre-publish orders before publish