diff --git a/src/kernel_evm/kernel/src/lib.rs b/src/kernel_evm/kernel/src/lib.rs index f0f00a1fb7428d378776b763b9e2c96d419eb113..c1f49c8172ef46e552eb7550f3b99692d13e131a 100644 --- a/src/kernel_evm/kernel/src/lib.rs +++ b/src/kernel_evm/kernel/src/lib.rs @@ -284,6 +284,9 @@ pub fn kernel_loop(host: &mut Host) { } Err(e) => { if let Some(UpgradeError(Fallback)) = e.downcast_ref::() { + // All the changes from the failed migration are reverted. + host.revert() + .expect("The kernel failed to delete the temporary directory"); host.fallback_backup_kernel() .expect("Fallback mechanism failed"); } else { diff --git a/src/kernel_evm/kernel/tests/resources/failed_migration.wasm b/src/kernel_evm/kernel/tests/resources/failed_migration.wasm index 5c85a0a7cbfcb907c042f2db22c2584c6eb8affc..1696d2aed83ab982a108224b6a765dc2bf1683c4 100755 Binary files a/src/kernel_evm/kernel/tests/resources/failed_migration.wasm and b/src/kernel_evm/kernel/tests/resources/failed_migration.wasm differ diff --git a/tezt/tests/evm_rollup.ml b/tezt/tests/evm_rollup.ml index 135e2bbc1d79deb00d62a4639d7644dbf5ed5d1d..a37d6cc45dba3d315a894147a7120da310b1ae4c 100644 --- a/tezt/tests/evm_rollup.ml +++ b/tezt/tests/evm_rollup.ml @@ -1880,6 +1880,18 @@ let test_kernel_upgrade_failing_migration = in (* Fallback mechanism is triggered, no block is produced at that level. *) let* _ = next_evm_level ~sc_rollup_node ~node ~client in + (* We make sure that we can't read under the tmp file, after migration failed, + everything is reverted. *) + let*! tmp_dummy = + Sc_rollup_client.inspect_durable_state_value + sc_rollup_client + ~pvm_kind:"wasm_2_0_0" + ~operation:Sc_rollup_client.Value + ~key:"/tmp/__dummy" + in + (match tmp_dummy with + | Some _ -> failwith "Nothing should be readable under the temporary dir." + | None -> ()) ; let* kernel_after_migration_failed = get_kernel_boot_wasm ~sc_rollup_client in (* The upgrade succeeded, but the fallback mechanism was activated, so the kernel after the upgrade/migration is still the previous one. *)