broker: upgrade and rollback keep a stopped actor stopped
A stopped actor gets the new version installed, keeps its mailbox and does not run main until the next start. Running actors still restart on the new version. The upgraded and rolled_back answers say whether the actor runs.
This commit is contained in:
@@ -506,6 +506,50 @@ async fn rolls_back_a_crash_loop_to_the_previous_version_without_restoring_data(
|
||||
host.stop().await;
|
||||
}
|
||||
|
||||
#[tokio::test]
|
||||
async fn upgrade_and_rollback_keep_a_stopped_actor_stopped() {
|
||||
let world = create_world("upgrade-stopped");
|
||||
let wasm = toolbox_wasm().clone();
|
||||
let (host, mut mailbox) = start(&world).await;
|
||||
let source = passing_source(&world, "source");
|
||||
spawn_type(&host, &mut mailbox, "sleeper", &wasm, &source).await;
|
||||
let stopped = request(&host, &mut mailbox, json!({"type": "stop", "actor": "sleeper"})).await;
|
||||
assert_eq!(stopped.body["type"], "stopped");
|
||||
|
||||
let upgraded = upgrade_actor(&host, &mut mailbox, "sleeper", &wasm, &source).await;
|
||||
assert_eq!(upgraded.body["type"], "upgraded", "{upgraded:?}");
|
||||
assert_eq!(upgraded.body["version"], 2);
|
||||
assert_eq!(upgraded.body["running"], false);
|
||||
let meta = world.read_meta("sleeper");
|
||||
assert_eq!((meta.version, meta.running), (Some(2), false));
|
||||
|
||||
// Mail waits in the mailbox: the stopped actor reads nothing.
|
||||
let waiting = host.broker.send("console", Some("sleeper"), None, None, json!({"type": "version"}));
|
||||
assert!(
|
||||
tokio::time::timeout(Duration::from_millis(500), receive_reply(&mut mailbox, &waiting, Duration::from_secs(10)))
|
||||
.await
|
||||
.is_err(),
|
||||
"a stopped actor must not answer"
|
||||
);
|
||||
|
||||
let rolled_back = request(&host, &mut mailbox, json!({"type": "rollback", "actor": "sleeper", "version": 1})).await;
|
||||
assert_eq!(rolled_back.body["type"], "rolled_back", "{rolled_back:?}");
|
||||
assert_eq!(rolled_back.body["running"], false);
|
||||
assert!(!world.read_meta("sleeper").running);
|
||||
|
||||
// `start` runs the installed version and delivers the waiting message.
|
||||
let started = request(&host, &mut mailbox, json!({"type": "start", "actor": "sleeper"})).await;
|
||||
assert_eq!(started.body["type"], "started");
|
||||
let answer = receive_reply(&mut mailbox, &waiting, Duration::from_secs(10)).await;
|
||||
assert_eq!(answer.body["version"], "1");
|
||||
|
||||
// A running actor still restarts on the new version.
|
||||
let running = upgrade_actor(&host, &mut mailbox, "sleeper", &wasm, &source).await;
|
||||
assert_eq!(running.body["running"], true);
|
||||
assert_eq!(ask(&host, &mut mailbox, "sleeper", json!({"type": "version"})).await.body["version"], "3");
|
||||
host.stop().await;
|
||||
}
|
||||
|
||||
#[tokio::test]
|
||||
async fn explicit_rollback_keeps_current_data() {
|
||||
let world = create_world("explicit-rollback");
|
||||
|
||||
Reference in New Issue
Block a user