From: Greg Farnum Date: Sun, 13 Apr 2014 06:06:37 +0000 (-0700) Subject: OSD: Juggle the locking when resurrecting a PG X-Git-Tag: v0.81~57^2~10 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=9028f95e54d15263c88a1865b696b42413cdf862;p=ceph.git OSD: Juggle the locking when resurrecting a PG Don't hold the old PG's lock in _create_lock_pg. Instead, just copy the necessary data bits into a holding location. Note that this means we aren't protecting it against change while the new PG is created, which I *think* is okay... Signed-off-by: Greg Farnum --- diff --git a/src/osd/OSD.cc b/src/osd/OSD.cc index 4080e5075d32..933d102ce623 100644 --- a/src/osd/OSD.cc +++ b/src/osd/OSD.cc @@ -2449,21 +2449,29 @@ void OSD::handle_pg_peering_evt( } case RES_SELF: { old_pg_state->lock(); + OSDMapRef old_osd_map = old_pg_state->get_osdmap(); + int old_role = old_pg_state->role; + vector old_up = old_pg_state->up; + int old_up_primary = old_pg_state->up_primary.osd; + vector old_acting = old_pg_state->acting; + int old_primary = old_pg_state->primary.osd; + pg_history_t old_history = old_pg_state->info.history; + pg_interval_map_t old_past_intervals = old_pg_state->past_intervals; + old_pg_state->unlock(); PG *pg = _create_lock_pg( - old_pg_state->get_osdmap(), + old_osd_map, resurrected, false, false, true, - old_pg_state->role, - old_pg_state->up, - old_pg_state->up_primary.osd, - old_pg_state->acting, - old_pg_state->primary.osd, - old_pg_state->info.history, - old_pg_state->past_intervals, + old_role, + old_up, + old_up_primary, + old_acting, + old_primary, + old_history, + old_past_intervals, *rctx.transaction); - old_pg_state->unlock(); pg->handle_create(&rctx); pg->write_if_dirty(*rctx.transaction); dispatch_context(rctx, pg, osdmap); @@ -2477,22 +2485,30 @@ void OSD::handle_pg_peering_evt( case RES_PARENT: { assert(old_pg_state); old_pg_state->lock(); + OSDMapRef old_osd_map = old_pg_state->get_osdmap(); + int old_role = old_pg_state->role; + vector old_up = old_pg_state->up; + int old_up_primary = old_pg_state->up_primary.osd; + vector old_acting = old_pg_state->acting; + int old_primary = old_pg_state->primary.osd; + pg_history_t old_history = old_pg_state->info.history; + pg_interval_map_t old_past_intervals = old_pg_state->past_intervals; + old_pg_state->unlock(); PG *parent = _create_lock_pg( - old_pg_state->get_osdmap(), + old_osd_map, resurrected, false, false, true, - old_pg_state->role, - old_pg_state->up, - old_pg_state->up_primary.osd, - old_pg_state->acting, - old_pg_state->primary.osd, - old_pg_state->info.history, - old_pg_state->past_intervals, + old_role, + old_up, + old_up_primary, + old_acting, + old_primary, + old_history, + old_past_intervals, *rctx.transaction ); - old_pg_state->unlock(); parent->handle_create(&rctx); parent->write_if_dirty(*rctx.transaction); dispatch_context(rctx, parent, osdmap);