From: Josh Durgin Date: Wed, 4 May 2011 19:23:08 +0000 (-0700) Subject: OSD: start PG state machine when loading pre-existing PGs X-Git-Tag: v0.28~74^2~23 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=d622a6fba607a4894b3f19655288954f39c70d01;p=ceph.git OSD: start PG state machine when loading pre-existing PGs This caused a crash when restarting a killed OSD because the Initial state was receiving the ActMap event. Signed-off-by: Josh Durgin --- diff --git a/src/osd/OSD.cc b/src/osd/OSD.cc index a2f2b485ac0..23feecfff8f 100644 --- a/src/osd/OSD.cc +++ b/src/osd/OSD.cc @@ -568,8 +568,10 @@ int OSD::init() } // load up pgs (as they previously existed) - load_pgs(); - + // defer querying until after the messenger is initialized + map > query_map; + load_pgs(query_map); + dout(2) << "superblock: i am osd" << superblock.whoami << dendl; assert_warn(whoami == superblock.whoami); if (whoami != superblock.whoami) { @@ -620,6 +622,8 @@ int OSD::init() dout(0) << "started rotating keys" << dendl; #endif + do_queries(query_map); + return 0; } @@ -1049,7 +1053,7 @@ PG *OSD::lookup_lock_raw_pg(pg_t pgid) } -void OSD::load_pgs() +void OSD::load_pgs(map > &query_map) { assert(osd_lock.is_locked()); dout(10) << "load_pgs" << dendl; @@ -1089,6 +1093,9 @@ void OSD::load_pgs() int role = osdmap->calc_pg_role(whoami, pg->acting, nrep); pg->set_role(role); + PG::RecoveryCtx rctx(&query_map, 0, 0, 0, 0); + pg->handle_create(&rctx); + dout(10) << "load_pgs loaded " << *pg << " " << pg->log << dendl; pg->unlock(); } diff --git a/src/osd/OSD.h b/src/osd/OSD.h index 40ff50644ba..b1b1ae8f4a9 100644 --- a/src/osd/OSD.h +++ b/src/osd/OSD.h @@ -514,7 +514,7 @@ protected: ObjectStore::Transaction **pt, C_Contexts **pfin); - void load_pgs(); + void load_pgs(map > &query_map); void calc_priors_during(pg_t pgid, epoch_t start, epoch_t end, set& pset); void project_pg_history(pg_t pgid, PG::Info::History& h, epoch_t from, vector& lastup, vector& lastacting);