]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
osd/PG: handle RELEASE race with Remote*Reserved on replica
authorSage Weil <sage@redhat.com>
Sat, 28 Oct 2017 21:02:52 +0000 (16:02 -0500)
committerSage Weil <sage@redhat.com>
Sat, 28 Oct 2017 21:03:13 +0000 (16:03 -0500)
If we get a REQUEST and RELEASE in quick succession, we may process a
local Remote*Reserved back in the RepNotRecovering state.

Signed-off-by: Sage Weil <sage@redhat.com>
src/osd/PG.h

index 74aa788056e4f7cdec6ff3093f1086050bb17d2d..024c29abcf3ea16d49373afd72b55be22e93d0dc 100644 (file)
@@ -2354,11 +2354,21 @@ protected:
        boost::statechart::custom_reaction< RejectRemoteReservation >,
        boost::statechart::transition< RemoteReservationRejected, RepNotRecovering >,
        boost::statechart::transition< RemoteReservationCanceled, RepNotRecovering >,
+       boost::statechart::custom_reaction< RemoteRecoveryReserved >,
+       boost::statechart::custom_reaction< RemoteBackfillReserved >,
        boost::statechart::transition< RecoveryDone, RepNotRecovering >  // for compat with pre-reservation peers
        > reactions;
       explicit RepNotRecovering(my_context ctx);
       boost::statechart::result react(const RequestRecoveryPrio &evt);
       boost::statechart::result react(const RequestBackfillPrio &evt);
+      boost::statechart::result react(const RemoteBackfillReserved &evt) {
+       // my reservation completion raced with a RELEASE from primary
+       return discard_event();
+      }
+      boost::statechart::result react(const RemoteRecoveryReserved &evt) {
+       // my reservation completion raced with a RELEASE from primary
+       return discard_event();
+      }
       boost::statechart::result react(const RejectRemoteReservation &evt);
       void exit();
     };