]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
PG: clear want_acting when we leave Primary
authorSamuel Just <sam.just@inktank.com>
Thu, 25 Apr 2013 21:08:57 +0000 (14:08 -0700)
committerSamuel Just <sam.just@inktank.com>
Wed, 1 May 2013 02:48:01 +0000 (19:48 -0700)
This is somewhat annoying actually.  Intuitively we want to
clear_primary_state when we leave primary, but when we restart
peering due to a change in prior set status, we can't afford
to forget most of our peering state.  want_acting, on the
other hand, should never persist across peering attempts.
In fact, in the future, want_acting should be pulled into
the Primary state structure.

Fixes: #3904
Signed-off-by: Samuel Just <sam.just@inktank.com>
Reviewed-by: Sage Weil <sage@inktank.com>
Reviewed-by: David Zafman <david.zafman@inktank.com>
(cherry picked from commit a5cade1fe7338602fb2bbfa867433d825f337c87)

src/osd/PG.cc

index 0ad4fdfb8af219aaf22f30872cb647f85c4f59df..7f49bb0bcab2b9915b0c12619eb4ac33d891cbe0 100644 (file)
@@ -4724,7 +4724,6 @@ void PG::start_peering_interval(const OSDMapRef lastmap,
 
   up = newup;
   acting = newacting;
-  want_acting.clear();
 
   if (info.stats.up != up ||
       info.stats.acting != acting) {
@@ -5448,6 +5447,8 @@ PG::RecoveryState::Primary::Primary(my_context ctx)
 {
   state_name = "Started/Primary";
   context< RecoveryMachine >().log_enter(state_name);
+  PG *pg = context< RecoveryMachine >().pg;
+  assert(pg->want_acting.empty());
 }
 
 boost::statechart::result PG::RecoveryState::Primary::react(const AdvMap &advmap)
@@ -5484,6 +5485,8 @@ boost::statechart::result PG::RecoveryState::Primary::react(const ActMap&)
 void PG::RecoveryState::Primary::exit()
 {
   context< RecoveryMachine >().log_exit(state_name, enter_time);
+  PG *pg = context< RecoveryMachine >().pg;
+  pg->want_acting.clear();
 }
 
 /*---------Peering--------*/