From 1e23065f2b42b59519f44d7b31a327a3000e788d Mon Sep 17 00:00:00 2001 From: Neha Date: Tue, 25 Feb 2020 03:01:41 +0000 Subject: [PATCH] osd/PeeringState.h: ignore RemoteBackfillReserved in WaitLocalBackfillReserved 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 (cherry picked from commit 61152ac29654a819eb961e5fc2d7f63b706e15c9) Conflicts: src/osd/PeeringState.h - The RemoteBackfillReserved still in src/osd/PG.h in nautilus. Manually backport this fix to src/osd/PG.h --- src/osd/PG.h | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/osd/PG.h b/src/osd/PG.h index 4857250d0739..ae8aa7e7a9e7 100644 --- a/src/osd/PG.h +++ b/src/osd/PG.h @@ -2471,9 +2471,14 @@ protected: 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(); }; -- 2.47.3