Skip to content

Commit

Permalink
Consider emergency reconnect in PlatformStatus system (#7725)
Browse files Browse the repository at this point in the history
Signed-off-by: Austin Littley <austin@swirldslabs.com>
  • Loading branch information
alittley committed Aug 4, 2023
1 parent 45d0cdc commit d90c876
Show file tree
Hide file tree
Showing 28 changed files with 289 additions and 22 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@
import com.swirlds.common.notification.listeners.PlatformStatusChangeNotification;
import com.swirlds.common.system.status.actions.CatastrophicFailureAction;
import com.swirlds.common.system.status.actions.DoneReplayingEventsAction;
import com.swirlds.common.system.status.actions.EmergencyReconnectStartedAction;
import com.swirlds.common.system.status.actions.FallenBehindAction;
import com.swirlds.common.system.status.actions.FreezePeriodEnteredAction;
import com.swirlds.common.system.status.actions.PlatformStatusAction;
Expand Down Expand Up @@ -121,6 +122,9 @@ private PlatformStatusLogic getNewLogic(@NonNull final PlatformStatusAction acti
return currentStatusLogic.processCatastrophicFailureAction((CatastrophicFailureAction) action);
} else if (actionClass == DoneReplayingEventsAction.class) {
return currentStatusLogic.processDoneReplayingEventsAction((DoneReplayingEventsAction) action);
} else if (actionClass == EmergencyReconnectStartedAction.class) {
return currentStatusLogic.processEmergencyReconnectStartedAction(
(EmergencyReconnectStartedAction) action);
} else if (actionClass == FallenBehindAction.class) {
return currentStatusLogic.processFallenBehindAction((FallenBehindAction) action);
} else if (actionClass == FreezePeriodEnteredAction.class) {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
/*
* Copyright (C) 2023 Hedera Hashgraph, LLC
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

package com.swirlds.common.system.status.actions;

/**
* An action that is triggered when the platform begins an emergency reconnect.
*/
public record EmergencyReconnectStartedAction() implements PlatformStatusAction {}
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
import com.swirlds.common.system.status.PlatformStatusConfig;
import com.swirlds.common.system.status.actions.CatastrophicFailureAction;
import com.swirlds.common.system.status.actions.DoneReplayingEventsAction;
import com.swirlds.common.system.status.actions.EmergencyReconnectStartedAction;
import com.swirlds.common.system.status.actions.FallenBehindAction;
import com.swirlds.common.system.status.actions.FreezePeriodEnteredAction;
import com.swirlds.common.system.status.actions.ReconnectCompleteAction;
Expand Down Expand Up @@ -90,6 +91,22 @@ public PlatformStatusLogic processDoneReplayingEventsAction(@NonNull final DoneR
throw new IllegalPlatformStatusException(action, getStatus());
}

/**
* {@inheritDoc}
* <p>
* Receiving an {@link EmergencyReconnectStartedAction} while in {@link PlatformStatus#ACTIVE} throws an exception,
* since an emergency reconnect is only ever performed right after the platform starts up.
*/
@NonNull
@Override
public PlatformStatusLogic processEmergencyReconnectStartedAction(
@NonNull final EmergencyReconnectStartedAction action) {

Objects.requireNonNull(action);

throw new IllegalPlatformStatusException(action, getStatus());
}

/**
* {@inheritDoc}
* <p>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
import com.swirlds.common.system.status.PlatformStatusConfig;
import com.swirlds.common.system.status.actions.CatastrophicFailureAction;
import com.swirlds.common.system.status.actions.DoneReplayingEventsAction;
import com.swirlds.common.system.status.actions.EmergencyReconnectStartedAction;
import com.swirlds.common.system.status.actions.FallenBehindAction;
import com.swirlds.common.system.status.actions.FreezePeriodEnteredAction;
import com.swirlds.common.system.status.actions.ReconnectCompleteAction;
Expand Down Expand Up @@ -80,6 +81,22 @@ public PlatformStatusLogic processDoneReplayingEventsAction(@NonNull final DoneR
throw new IllegalPlatformStatusException(action, getStatus());
}

/**
* {@inheritDoc}
* <p>
* Receiving an {@link EmergencyReconnectStartedAction} while in {@link PlatformStatus#BEHIND} throws an exception,
* since an emergency reconnect should never be started when the platform is already behind.
*/
@NonNull
@Override
public PlatformStatusLogic processEmergencyReconnectStartedAction(
@NonNull final EmergencyReconnectStartedAction action) {

Objects.requireNonNull(action);

throw new IllegalPlatformStatusException(action, getStatus());
}

/**
* {@inheritDoc}
* <p>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
import com.swirlds.common.system.status.PlatformStatus;
import com.swirlds.common.system.status.actions.CatastrophicFailureAction;
import com.swirlds.common.system.status.actions.DoneReplayingEventsAction;
import com.swirlds.common.system.status.actions.EmergencyReconnectStartedAction;
import com.swirlds.common.system.status.actions.FallenBehindAction;
import com.swirlds.common.system.status.actions.FreezePeriodEnteredAction;
import com.swirlds.common.system.status.actions.ReconnectCompleteAction;
Expand Down Expand Up @@ -52,6 +53,17 @@ public PlatformStatusLogic processDoneReplayingEventsAction(@NonNull final DoneR
return this;
}

/**
* {@inheritDoc}
*/
@NonNull
@Override
public PlatformStatusLogic processEmergencyReconnectStartedAction(
@NonNull final EmergencyReconnectStartedAction action) {

return this;
}

/**
* {@inheritDoc}
*/
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
import com.swirlds.common.system.status.PlatformStatusConfig;
import com.swirlds.common.system.status.actions.CatastrophicFailureAction;
import com.swirlds.common.system.status.actions.DoneReplayingEventsAction;
import com.swirlds.common.system.status.actions.EmergencyReconnectStartedAction;
import com.swirlds.common.system.status.actions.FallenBehindAction;
import com.swirlds.common.system.status.actions.FreezePeriodEnteredAction;
import com.swirlds.common.system.status.actions.ReconnectCompleteAction;
Expand Down Expand Up @@ -75,6 +76,20 @@ public PlatformStatusLogic processDoneReplayingEventsAction(@NonNull final DoneR
throw new IllegalPlatformStatusException(action, getStatus());
}

/**
* {@inheritDoc}
* <p>
* {@link PlatformStatus#CHECKING} status unconditionally transitions to {@link PlatformStatus#BEHIND} when an
* {@link EmergencyReconnectStartedAction} is processed.
*/
@NonNull
@Override
public PlatformStatusLogic processEmergencyReconnectStartedAction(
@NonNull final EmergencyReconnectStartedAction action) {

return new BehindStatusLogic(config);
}

/**
* {@inheritDoc}
* <p>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
import com.swirlds.common.system.status.PlatformStatus;
import com.swirlds.common.system.status.actions.CatastrophicFailureAction;
import com.swirlds.common.system.status.actions.DoneReplayingEventsAction;
import com.swirlds.common.system.status.actions.EmergencyReconnectStartedAction;
import com.swirlds.common.system.status.actions.FallenBehindAction;
import com.swirlds.common.system.status.actions.FreezePeriodEnteredAction;
import com.swirlds.common.system.status.actions.ReconnectCompleteAction;
Expand Down Expand Up @@ -52,6 +53,17 @@ public PlatformStatusLogic processDoneReplayingEventsAction(@NonNull final DoneR
return this;
}

/**
* {@inheritDoc}
*/
@NonNull
@Override
public PlatformStatusLogic processEmergencyReconnectStartedAction(
@NonNull final EmergencyReconnectStartedAction action) {

return this;
}

/**
* {@inheritDoc}
*/
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
import com.swirlds.common.system.status.PlatformStatus;
import com.swirlds.common.system.status.actions.CatastrophicFailureAction;
import com.swirlds.common.system.status.actions.DoneReplayingEventsAction;
import com.swirlds.common.system.status.actions.EmergencyReconnectStartedAction;
import com.swirlds.common.system.status.actions.FallenBehindAction;
import com.swirlds.common.system.status.actions.FreezePeriodEnteredAction;
import com.swirlds.common.system.status.actions.ReconnectCompleteAction;
Expand Down Expand Up @@ -74,6 +75,23 @@ public PlatformStatusLogic processDoneReplayingEventsAction(@NonNull final DoneR
throw new IllegalPlatformStatusException(action, getStatus());
}

/**
* {@inheritDoc}
* <p>
* Receiving an {@link EmergencyReconnectStartedAction} while in {@link PlatformStatus#FREEZING} throws an
* exception. If an emergency reconnect was required, the action should have happened already, before arriving
* in {@link PlatformStatus#FREEZING}.
*/
@NonNull
@Override
public PlatformStatusLogic processEmergencyReconnectStartedAction(
@NonNull final EmergencyReconnectStartedAction action) {

Objects.requireNonNull(action);

throw new IllegalPlatformStatusException(action, getStatus());
}

/**
* {@inheritDoc}
* <p>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
import com.swirlds.common.system.status.PlatformStatusConfig;
import com.swirlds.common.system.status.actions.CatastrophicFailureAction;
import com.swirlds.common.system.status.actions.DoneReplayingEventsAction;
import com.swirlds.common.system.status.actions.EmergencyReconnectStartedAction;
import com.swirlds.common.system.status.actions.FallenBehindAction;
import com.swirlds.common.system.status.actions.FreezePeriodEnteredAction;
import com.swirlds.common.system.status.actions.ReconnectCompleteAction;
Expand Down Expand Up @@ -89,6 +90,20 @@ public PlatformStatusLogic processDoneReplayingEventsAction(@NonNull final DoneR
throw new IllegalPlatformStatusException(action, getStatus());
}

/**
* {@inheritDoc}
* <p>
* {@link PlatformStatus#OBSERVING} status unconditionally transitions to {@link PlatformStatus#BEHIND} when an
* {@link EmergencyReconnectStartedAction} is processed.
*/
@NonNull
@Override
public PlatformStatusLogic processEmergencyReconnectStartedAction(
@NonNull final EmergencyReconnectStartedAction action) {

return new BehindStatusLogic(config);
}

/**
* {@inheritDoc}
* <p>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
import com.swirlds.common.system.status.PlatformStatus;
import com.swirlds.common.system.status.actions.CatastrophicFailureAction;
import com.swirlds.common.system.status.actions.DoneReplayingEventsAction;
import com.swirlds.common.system.status.actions.EmergencyReconnectStartedAction;
import com.swirlds.common.system.status.actions.FallenBehindAction;
import com.swirlds.common.system.status.actions.FreezePeriodEnteredAction;
import com.swirlds.common.system.status.actions.PlatformStatusAction;
Expand Down Expand Up @@ -61,6 +62,15 @@ public interface PlatformStatusLogic {
@NonNull
PlatformStatusLogic processDoneReplayingEventsAction(@NonNull final DoneReplayingEventsAction action);

/**
* Process an {@link EmergencyReconnectStartedAction} action.
*
* @param action the action to process
* @return the {@link PlatformStatusLogic} to manage the resulting status
*/
@NonNull
PlatformStatusLogic processEmergencyReconnectStartedAction(@NonNull final EmergencyReconnectStartedAction action);

/**
* Process a {@link FallenBehindAction}
*
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
import com.swirlds.common.system.status.PlatformStatusConfig;
import com.swirlds.common.system.status.actions.CatastrophicFailureAction;
import com.swirlds.common.system.status.actions.DoneReplayingEventsAction;
import com.swirlds.common.system.status.actions.EmergencyReconnectStartedAction;
import com.swirlds.common.system.status.actions.FallenBehindAction;
import com.swirlds.common.system.status.actions.FreezePeriodEnteredAction;
import com.swirlds.common.system.status.actions.ReconnectCompleteAction;
Expand Down Expand Up @@ -94,6 +95,22 @@ public PlatformStatusLogic processDoneReplayingEventsAction(@NonNull final DoneR
throw new IllegalPlatformStatusException(action, getStatus());
}

/**
* {@inheritDoc}
* <p>
* Receiving an {@link EmergencyReconnectStartedAction} while in {@link PlatformStatus#RECONNECT_COMPLETE} throws
* and exception, since if a reconnect was just completed, we shouldn't be starting another emergency reconnect.
*/
@NonNull
@Override
public PlatformStatusLogic processEmergencyReconnectStartedAction(
@NonNull final EmergencyReconnectStartedAction action) {

Objects.requireNonNull(action);

throw new IllegalPlatformStatusException(action, getStatus());
}

/**
* {@inheritDoc}
* <p>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
import com.swirlds.common.system.status.PlatformStatusConfig;
import com.swirlds.common.system.status.actions.CatastrophicFailureAction;
import com.swirlds.common.system.status.actions.DoneReplayingEventsAction;
import com.swirlds.common.system.status.actions.EmergencyReconnectStartedAction;
import com.swirlds.common.system.status.actions.FallenBehindAction;
import com.swirlds.common.system.status.actions.FreezePeriodEnteredAction;
import com.swirlds.common.system.status.actions.ReconnectCompleteAction;
Expand Down Expand Up @@ -88,6 +89,23 @@ public PlatformStatusLogic processDoneReplayingEventsAction(@NonNull final DoneR
}
}

/**
* {@inheritDoc}
* <p>
* Receiving an {@link EmergencyReconnectStartedAction} while in {@link PlatformStatus#REPLAYING_EVENTS} throws an
* exception, since the check for potentially beginning an emergency reconnect doesn't happen until after
* the platform has transitioned out of the {@link PlatformStatus#REPLAYING_EVENTS} status.
*/
@NonNull
@Override
public PlatformStatusLogic processEmergencyReconnectStartedAction(
@NonNull final EmergencyReconnectStartedAction action) {

Objects.requireNonNull(action);

throw new IllegalPlatformStatusException(action, getStatus());
}

/**
* {@inheritDoc}
* <p>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
import com.swirlds.common.system.status.PlatformStatusConfig;
import com.swirlds.common.system.status.actions.CatastrophicFailureAction;
import com.swirlds.common.system.status.actions.DoneReplayingEventsAction;
import com.swirlds.common.system.status.actions.EmergencyReconnectStartedAction;
import com.swirlds.common.system.status.actions.FallenBehindAction;
import com.swirlds.common.system.status.actions.FreezePeriodEnteredAction;
import com.swirlds.common.system.status.actions.ReconnectCompleteAction;
Expand Down Expand Up @@ -75,6 +76,22 @@ public PlatformStatusLogic processDoneReplayingEventsAction(@NonNull final DoneR
throw new IllegalPlatformStatusException(action, getStatus());
}

/**
* {@inheritDoc}
* <p>
* Receiving an {@link EmergencyReconnectStartedAction} while in {@link PlatformStatus#STARTING_UP} throws an
* exception, since the check to begin an emergency reconnect should not have been made yet.
*/
@NonNull
@Override
public PlatformStatusLogic processEmergencyReconnectStartedAction(
@NonNull final EmergencyReconnectStartedAction action) {

Objects.requireNonNull(action);

throw new IllegalPlatformStatusException(action, getStatus());
}

/**
* {@inheritDoc}
* <p>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
import com.swirlds.common.system.status.PlatformStatusConfig;
import com.swirlds.common.system.status.actions.CatastrophicFailureAction;
import com.swirlds.common.system.status.actions.DoneReplayingEventsAction;
import com.swirlds.common.system.status.actions.EmergencyReconnectStartedAction;
import com.swirlds.common.system.status.actions.FallenBehindAction;
import com.swirlds.common.system.status.actions.FreezePeriodEnteredAction;
import com.swirlds.common.system.status.actions.ReconnectCompleteAction;
Expand Down Expand Up @@ -118,6 +119,10 @@ void unexpectedActions() {
logic::processReconnectCompleteAction, new ReconnectCompleteAction(0), logic.getStatus());
triggerActionAndAssertException(
logic::processDoneReplayingEventsAction, new DoneReplayingEventsAction(time.now()), logic.getStatus());
triggerActionAndAssertException(
logic::processEmergencyReconnectStartedAction,
new EmergencyReconnectStartedAction(),
logic.getStatus());
triggerActionAndAssertException(
logic::processStartedReplayingEventsAction, new StartedReplayingEventsAction(), logic.getStatus());
}
Expand Down

0 comments on commit d90c876

Please sign in to comment.