]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
PG: don't use a self-transition for WaitRemoteRecoveryReserved
authorSamuel Just <sam.just@inktank.com>
Sat, 22 Dec 2012 00:51:40 +0000 (16:51 -0800)
committerSamuel Just <sam.just@inktank.com>
Sat, 22 Dec 2012 04:37:06 +0000 (20:37 -0800)
Previously, using the state on active worked, but now we might
go back through WaitRemoteRecoveryReserved without resetting
Active.

Signed-off-by: Samuel Just <sam.just@inktank.com>
src/osd/PG.cc
src/osd/PG.h

index 169a5bdf6ae803cfb093f55044e21cb17ec71543..a450ba0de75f552b3b58c70ad7cd0b359d054c0c 100644 (file)
@@ -5699,13 +5699,17 @@ void PG::RecoveryState::WaitLocalRecoveryReserved::exit()
 }
 
 PG::RecoveryState::WaitRemoteRecoveryReserved::WaitRemoteRecoveryReserved(my_context ctx)
-  : my_base(ctx)
+  : my_base(ctx),
+    acting_osd_it(context< Active >().sorted_acting_set.begin())
 {
   state_name = "Started/Primary/Active/WaitRemoteRecoveryReserved";
   context< RecoveryMachine >().log_enter(state_name);
-  PG *pg = context< RecoveryMachine >().pg;
+  post_event(RemoteRecoveryReserved());
+}
 
-  set<int>::const_iterator &acting_osd_it = context< Active >().acting_osd_it;
+boost::statechart::result
+PG::RecoveryState::WaitRemoteRecoveryReserved::react(const RemoteRecoveryReserved &evt) {
+  PG *pg = context< RecoveryMachine >().pg;
 
   if (acting_osd_it != context< Active >().sorted_acting_set.end()) {
     // skip myself
@@ -5730,6 +5734,7 @@ PG::RecoveryState::WaitRemoteRecoveryReserved::WaitRemoteRecoveryReserved(my_con
   } else {
     post_event(AllRemotesReserved());
   }
+  return discard_event();
 }
 
 void PG::RecoveryState::WaitRemoteRecoveryReserved::exit()
@@ -5857,7 +5862,6 @@ PG::RecoveryState::Active::Active(my_context ctx)
   : my_base(ctx),
     sorted_acting_set(context< RecoveryMachine >().pg->acting.begin(),
                       context< RecoveryMachine >().pg->acting.end()),
-    acting_osd_it(sorted_acting_set.begin()),
     all_replicas_activated(false)
 {
   state_name = "Started/Primary/Active";
index bcd179d47273d7b1ccca5bff456e6edc29dfebf6..46ae2d9127c83cbf6aca470c4b7a9a18ad73384b 100644 (file)
@@ -1366,7 +1366,6 @@ public:
       void exit();
 
       const set<int> sorted_acting_set;
-      set<int>::const_iterator acting_osd_it;
       bool all_replicas_activated;
 
       typedef boost::mpl::list <
@@ -1519,10 +1518,12 @@ public:
 
     struct WaitRemoteRecoveryReserved : boost::statechart::state< WaitRemoteRecoveryReserved, Active >, NamedState {
       typedef boost::mpl::list <
-       boost::statechart::transition< RemoteRecoveryReserved, WaitRemoteRecoveryReserved >,
+       boost::statechart::custom_reaction< RemoteRecoveryReserved >,
        boost::statechart::transition< AllRemotesReserved, Recovering >
        > reactions;
+      set<int>::const_iterator acting_osd_it;
       WaitRemoteRecoveryReserved(my_context ctx);
+      boost::statechart::result react(const RemoteRecoveryReserved &evt);
       void exit();
     };