]> git.apps.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
osd/PeeringState.h: ignore RemoteBackfillReserved in WaitLocalBackfillReserved
authorNeha <nojha@redhat.com>
Tue, 25 Feb 2020 03:01:41 +0000 (03:01 +0000)
committerNeha <nojha@redhat.com>
Tue, 25 Feb 2020 03:13:51 +0000 (03:13 +0000)
It is possible to dequeue an outstanding RemoteBackfillReserved, though we may have
already released reservations for that backfill target. Currently, if this happens
while we are in WaitLocalBackfillReserved, it can lead to a crash on the primary.
Prevent this by treating this condition as a no-op.

The longer term fix is to add a RELEASE_ACK mechanism, which prevents the primary
from scheduling a backfill retry until all the RELEASE_ACKs have been received.

Fixes: https://tracker.ceph.com/issues/44248
Signed-off-by: Neha Ojha <nojha@redhat.com>
src/osd/PeeringState.h

index 4b73182870af8443500d54b6a58252fa4e5a1ad4..59eb5a5a4df036f2f82d5a91abe61733169a35cb 100644 (file)
@@ -938,9 +938,14 @@ public:
 
   struct WaitLocalBackfillReserved : boost::statechart::state< WaitLocalBackfillReserved, Active >, NamedState {
     typedef boost::mpl::list<
-      boost::statechart::transition< LocalBackfillReserved, WaitRemoteBackfillReserved >
+      boost::statechart::transition< LocalBackfillReserved, WaitRemoteBackfillReserved >,
+      boost::statechart::custom_reaction< RemoteBackfillReserved >
       > reactions;
     explicit WaitLocalBackfillReserved(my_context ctx);
+    boost::statechart::result react(const RemoteBackfillReserved& evt) {
+      /* no-op */
+      return discard_event();
+    }
     void exit();
   };