From: Sage Weil Date: Wed, 15 Feb 2012 21:16:25 +0000 (-0800) Subject: osd: fix _activate_committed replica->primary message X-Git-Tag: v0.44~48^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=4b3bb5ab37a05fa001d59f24da7d9c30d650321b;p=ceph.git osd: fix _activate_committed replica->primary message Normally we take a fresh map reference in PG::lock(). However, _activate_committed needs to make sure the map hasn't changed significantly before acting. In the case of #2068, the OSD map has moved forward and the mapping has changed, but the PG hasn't processed that yet, and thus mis-tags the MOSDPGInfo message. Tag the message with the e epoch, and also pass down the primary's address to send the message to the right location. Fixes: #2068 Signed-off-by: Sage Weil --- diff --git a/src/osd/PG.cc b/src/osd/PG.cc index 49d7a4181de..d5497797673 100644 --- a/src/osd/PG.cc +++ b/src/osd/PG.cc @@ -1171,9 +1171,10 @@ void PG::build_might_have_unfound() struct C_PG_ActivateCommitted : public Context { PG *pg; epoch_t epoch; - C_PG_ActivateCommitted(PG *p, epoch_t e) : pg(p), epoch(e) {} + entity_inst_t primary; + C_PG_ActivateCommitted(PG *p, epoch_t e, entity_inst_t pi) : pg(p), epoch(e), primary(pi) {} void finish(int r) { - pg->_activate_committed(epoch); + pg->_activate_committed(epoch, primary); } }; @@ -1230,7 +1231,8 @@ void PG::activate(ObjectStore::Transaction& t, list& tfin, // find out when we commit get(); // for callback - tfin.push_back(new C_PG_ActivateCommitted(this, info.history.same_interval_since)); + tfin.push_back(new C_PG_ActivateCommitted(this, info.history.same_interval_since, + get_osdmap()->get_inst(acting[0]))); // initialize snap_trimq if (is_primary()) { @@ -1463,7 +1465,7 @@ void PG::replay_queued_ops() update_stats(); } -void PG::_activate_committed(epoch_t e) +void PG::_activate_committed(epoch_t e, entity_inst_t& primary) { lock(); if (e < last_peering_reset) { @@ -1477,9 +1479,7 @@ void PG::_activate_committed(epoch_t e) all_activated_and_committed(); } else { dout(10) << "_activate_committed " << e << " telling primary" << dendl; - epoch_t cur_epoch = get_osdmap()->get_epoch(); - entity_inst_t primary = get_osdmap()->get_cluster_inst(acting[0]); - MOSDPGInfo *m = new MOSDPGInfo(cur_epoch); + MOSDPGInfo *m = new MOSDPGInfo(e); pg_info_t i = info; i.history.last_epoch_started = e; m->pg_info.push_back(i); diff --git a/src/osd/PG.h b/src/osd/PG.h index 5ea380e1f02..6d187fea9a0 100644 --- a/src/osd/PG.h +++ b/src/osd/PG.h @@ -730,7 +730,7 @@ public: void activate(ObjectStore::Transaction& t, list& tfin, map< int, map >& query_map, map *activator_map=0); - void _activate_committed(epoch_t e); + void _activate_committed(epoch_t e, entity_inst_t& primary); void all_activated_and_committed(); void proc_primary_info(ObjectStore::Transaction &t, const pg_info_t &info);