Skip to content

Commit

Permalink
chore: Increase robustness of `--stop-before flag.
Browse files Browse the repository at this point in the history
First and foremost, make sure that repeated resuming before the same
state, with the same `--stop-before` flag, is a noop. It should keep
stopping there. Also make sure that once we have started executing the
path after that, it should no longer be possible to go back.

For this we introduce some new DB flags, but since the existing ones
have not been released yet, this should be fine.

Finally, simplify test conditions by removing the query states from
the log, since they have no effect on the flow.

Signed-off-by: Kristian Amlie <[email protected]>
  • Loading branch information
kacf committed Sep 25, 2024
1 parent 4c77a50 commit 25f223e
Show file tree
Hide file tree
Showing 7 changed files with 384 additions and 213 deletions.
16 changes: 9 additions & 7 deletions src/mender-update/standalone.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -81,35 +81,37 @@ class StateMachine {
ScriptRunnerState download_leave_state_;
ScriptRunnerState download_error_state_;

SaveState save_artifact_install_state_;
JustSaveState save_before_artifact_install_state_;
JustSaveState save_artifact_install_state_;
ScriptRunnerState artifact_install_enter_state_;
ArtifactInstallState artifact_install_state_;
ScriptRunnerState artifact_install_leave_state_;
ScriptRunnerState artifact_install_error_state_;

RebootAndRollbackQueryState reboot_and_rollback_query_state_;

SaveState save_artifact_commit_state_;
JustSaveState save_before_artifact_commit_state_;
JustSaveState save_artifact_commit_state_;
ScriptRunnerState artifact_commit_enter_state_;
ArtifactCommitState artifact_commit_state_;
SaveState save_post_artifact_commit_state_;
SaveState save_artifact_commit_leave_state_;
JustSaveState save_before_artifact_commit_leave_state_;
JustSaveState save_artifact_commit_leave_state_;
ScriptRunnerState artifact_commit_leave_state_;
ScriptRunnerState artifact_commit_error_state_;

RollbackQueryState rollback_query_state_;

SaveState save_artifact_rollback_state_;
JustSaveState save_artifact_rollback_state_;
ScriptRunnerState artifact_rollback_enter_state_;
ArtifactRollbackState artifact_rollback_state_;
ScriptRunnerState artifact_rollback_leave_state_;

SaveState save_artifact_failure_state_;
JustSaveState save_artifact_failure_state_;
ScriptRunnerState artifact_failure_enter_state_;
ArtifactFailureState artifact_failure_state_;
ScriptRunnerState artifact_failure_leave_state_;

SaveState save_cleanup_state_;
JustSaveState save_cleanup_state_;
CleanupState cleanup_state_;

ExitState exit_state_;
Expand Down
4 changes: 3 additions & 1 deletion src/mender-update/standalone/context.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -28,9 +28,11 @@ const string StateDataKeys::in_state {"InState"};
const string StateDataKeys::failed {"Failed"};
const string StateDataKeys::rolled_back {"RolledBack"};

const string StateData::kBeforeStateArtifactInstall_Enter {"Before_ArtifactInstall_Enter"};
const string StateData::kInStateArtifactInstall_Enter {"ArtifactInstall_Enter"};
const string StateData::kBeforeStateArtifactCommit_Enter {"Before_ArtifactCommit_Enter"};
const string StateData::kInStateArtifactCommit_Enter {"ArtifactCommit_Enter"};
const string StateData::kInStatePostArtifactCommit {"PostArtifactCommit"};
const string StateData::kBeforeStateArtifactCommit_Leave {"Before_ArtifactCommit_Leave"};
const string StateData::kInStateArtifactCommit_Leave {"ArtifactCommit_Leave"};
const string StateData::kInStateArtifactRollback_Enter {"ArtifactRollback_Enter"};
const string StateData::kInStateArtifactFailure_Enter {"ArtifactFailure_Enter"};
Expand Down
4 changes: 3 additions & 1 deletion src/mender-update/standalone/context.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -76,9 +76,11 @@ struct StateData {
bool failed {false};
bool rolled_back {false};

static const string kBeforeStateArtifactInstall_Enter;
static const string kInStateArtifactInstall_Enter;
static const string kBeforeStateArtifactCommit_Enter;
static const string kInStateArtifactCommit_Enter;
static const string kInStatePostArtifactCommit;
static const string kBeforeStateArtifactCommit_Leave;
static const string kInStateArtifactCommit_Leave;
static const string kInStateArtifactRollback_Enter;
static const string kInStateArtifactFailure_Enter;
Expand Down
194 changes: 115 additions & 79 deletions src/mender-update/standalone/standalone.cpp

Large diffs are not rendered by default.

12 changes: 11 additions & 1 deletion src/mender-update/standalone/states.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,11 @@ void SaveState::OnEnter(Context &ctx, sm::EventPoster<StateEvent> &poster) {
return;
}

OnEnterSaveState(ctx, poster);
}

void JustSaveState::OnEnterSaveState(Context &ctx, sm::EventPoster<StateEvent> &poster) {
// Nothing other than saving, which has already happened.
poster.PostEvent(StateEvent::Success);
}

Expand Down Expand Up @@ -362,7 +367,12 @@ void ArtifactInstallState::OnEnter(Context &ctx, sm::EventPoster<StateEvent> &po
poster.PostEvent(StateEvent::Success);
}

void RebootAndRollbackQueryState::OnEnter(Context &ctx, sm::EventPoster<StateEvent> &poster) {
RebootAndRollbackQueryState::RebootAndRollbackQueryState() :
SaveState(StateData::kBeforeStateArtifactCommit_Enter) {
}

void RebootAndRollbackQueryState::OnEnterSaveState(
Context &ctx, sm::EventPoster<StateEvent> &poster) {
auto reboot = ctx.update_module->NeedsReboot();
if (!reboot) {
log::Error("Could not query for reboot: " + reboot.error().String());
Expand Down
16 changes: 13 additions & 3 deletions src/mender-update/standalone/states.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -35,12 +35,21 @@ class SaveState : virtual public StateType {
SaveState(const string &state) :
state_ {state} {
}
void OnEnter(Context &ctx, sm::EventPoster<StateEvent> &poster) override;
void OnEnter(Context &ctx, sm::EventPoster<StateEvent> &poster) override final;
virtual void OnEnterSaveState(Context &ctx, sm::EventPoster<StateEvent> &poster) = 0;

private:
string state_;
};

class JustSaveState : public SaveState {
public:
JustSaveState(const string &state) :
SaveState {state} {
}
void OnEnterSaveState(Context &ctx, sm::EventPoster<StateEvent> &poster) override;
};

class PrepareDownloadState : virtual public StateType {
public:
void OnEnter(Context &ctx, sm::EventPoster<StateEvent> &poster) override;
Expand All @@ -56,9 +65,10 @@ class ArtifactInstallState : virtual public StateType {
void OnEnter(Context &ctx, sm::EventPoster<StateEvent> &poster) override;
};

class RebootAndRollbackQueryState : virtual public StateType {
class RebootAndRollbackQueryState : public SaveState {
public:
void OnEnter(Context &ctx, sm::EventPoster<StateEvent> &poster) override;
RebootAndRollbackQueryState();
void OnEnterSaveState(Context &ctx, sm::EventPoster<StateEvent> &poster) override;
};

class ArtifactCommitState : virtual public StateType {
Expand Down
Loading

0 comments on commit 25f223e

Please sign in to comment.