From 2e8e51df0587615dab9330a68a9d6f96618cc615 Mon Sep 17 00:00:00 2001 From: Noa Date: Mon, 20 Nov 2023 12:17:40 -0600 Subject: [PATCH 1/2] Update wasmtime --- Cargo.lock | 140 ++++++++---------- Cargo.toml | 2 +- crates/core/Cargo.toml | 2 +- .../core/src/host/wasmtime/wasmtime_module.rs | 22 +-- 4 files changed, 67 insertions(+), 99 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 086e731e963..8943fbdeeb0 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -739,18 +739,18 @@ dependencies = [ [[package]] name = "cranelift-bforest" -version = "0.101.0" +version = "0.102.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e5e1df0da8488dd03b34afc134ba84b754d61862cc465932a9e5d07952f661e" +checksum = "76eb38f2af690b5a4411d9a8782b6d77dabff3ca939e0518453ab9f9a4392d41" dependencies = [ "cranelift-entity", ] [[package]] name = "cranelift-codegen" -version = "0.101.0" +version = "0.102.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77a17ca4e699a0aaf49a0c88f6311a864f321048aa63f6b787cab20eb5f93f10" +checksum = "39526c036b92912417e8931f52c1e235796688068d3efdbbd8b164f299d19156" dependencies = [ "bumpalo", "cranelift-bforest", @@ -769,33 +769,33 @@ dependencies = [ [[package]] name = "cranelift-codegen-meta" -version = "0.101.0" +version = "0.102.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "022f2793cdade1d37a1f755ac42938a3f832f533eac6cafc8b26b209544c3c06" +checksum = "fdb0deedc9fccf2db53a5a3c9c9d0163e44143b0d004dca9bf6ab6a0024cd79a" dependencies = [ "cranelift-codegen-shared", ] [[package]] name = "cranelift-codegen-shared" -version = "0.101.0" +version = "0.102.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4d72dbb83c2ad788dec4ad0843070973cb48c35a3ca19b1e7437ac40834fd9c" +checksum = "cea2d1b274e45aa8e61e9103efa1ba82d4b5a19d12bd1fd10744c3b7380ba3ff" [[package]] name = "cranelift-control" -version = "0.101.0" +version = "0.102.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae07cf26dcc90d546826d747ac63b6c40c916f34b03e92a6ae0422c28d771b8a" +checksum = "6ea5977559a71e63db79a263f0e81a89b996e8a38212c4281e37dd1dbaa8b65c" dependencies = [ "arbitrary", ] [[package]] name = "cranelift-entity" -version = "0.101.0" +version = "0.102.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2fe6b7e49820893691aea497f36257e9d6f52061d8c4758d61d802d5f101a3d" +checksum = "2f871ada808b58158d84dfc43a6a2e2d2756baaf4ed1c51fd969ca8330e6ca5c" dependencies = [ "serde", "serde_derive", @@ -803,9 +803,9 @@ dependencies = [ [[package]] name = "cranelift-frontend" -version = "0.101.0" +version = "0.102.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44f497576ca3674581581601b6a55ccc1b43447217648c880e5bce70db3cf659" +checksum = "e8e6890f587ef59824b3debe577e68fdf9b307b3808c54b8d93a18fd0b70941b" dependencies = [ "cranelift-codegen", "log", @@ -815,15 +815,15 @@ dependencies = [ [[package]] name = "cranelift-isle" -version = "0.101.0" +version = "0.102.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b96aa02eac00fffee13b0cd37d17874ccdb3d5458983041accd825ef78ce6454" +checksum = "a8d5fc6d5d3b52d1917002b17a8ecce448c2621b5bf394bb4e77e2f676893537" [[package]] name = "cranelift-native" -version = "0.101.0" +version = "0.102.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2870170ca44054b202c737626607b87be6e35655084bd94a6ff807a5812ba7df" +checksum = "3e10c2e7faa65d4ae7de9a83b44f2c31aca7dc638e17d0a79572fdf8103d720b" dependencies = [ "cranelift-codegen", "libc", @@ -832,9 +832,9 @@ dependencies = [ [[package]] name = "cranelift-wasm" -version = "0.101.0" +version = "0.102.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "103975f31b2c015ba53cd4bbb4fb9c509e91cf532752587d4e48748d0305334f" +checksum = "2755807efc7ec80d1cc0b6815e70f10cedf968889f0469091dbff9c5c0741c48" dependencies = [ "cranelift-codegen", "cranelift-entity", @@ -1084,15 +1084,6 @@ version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c2e66c9d817f1720209181c316d28635c050fa304f9c79e47a520882661b7308" -[[package]] -name = "debugid" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bef552e6f588e446098f6ba40d89ac146c8c7b64aade83c051ee00bb5d2bc18d" -dependencies = [ - "uuid", -] - [[package]] name = "decorum" version = "0.3.1" @@ -1579,19 +1570,6 @@ dependencies = [ "byteorder", ] -[[package]] -name = "fxprof-processed-profile" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "27d12c0aed7f1e24276a241aadc4cb8ea9f83000f34bc062b7cc2d51e3b0fabd" -dependencies = [ - "bitflags 2.4.1", - "debugid", - "fxhash", - "serde", - "serde_json", -] - [[package]] name = "generator" version = "0.7.5" @@ -2082,9 +2060,9 @@ checksum = "884e2677b40cc8c339eaefcb701c32ef1fd2493d71118dc0ca4b6a736c93bd67" [[package]] name = "libc" -version = "0.2.149" +version = "0.2.150" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a08173bc88b7955d1b3145aa561539096c421ac8debde8cbc3612ec635fee29b" +checksum = "89d92a4743f9a61002fae18374ed11e7973f530cb3a3255fb354818118b2203c" [[package]] name = "libloading" @@ -2177,9 +2155,9 @@ checksum = "0717cef1bc8b636c6e1c1bbdefc09e6322da8a9321966e8928ef80d20f7f770f" [[package]] name = "linux-raw-sys" -version = "0.4.10" +version = "0.4.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da2479e8c062e40bf0066ffa0bc823de0a9368974af99c9f6df941d2c231e03f" +checksum = "969488b55f8ac402214f3f5fd243ebb7206cf82de60d3172994707a4bcc2b829" [[package]] name = "lock_api" @@ -3514,9 +3492,9 @@ dependencies = [ [[package]] name = "rustix" -version = "0.38.19" +version = "0.38.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "745ecfa778e66b2b63c88a61cb36e0eea109e803b0b86bf9879fbc77c70e86ed" +checksum = "dc99bc2d4f1fed22595588a013687477aedf3cdcfb26558c559edb67b4d9b22e" dependencies = [ "bitflags 2.4.1", "errno", @@ -4676,9 +4654,9 @@ dependencies = [ [[package]] name = "target-lexicon" -version = "0.12.11" +version = "0.12.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d0e916b1148c8e263850e1ebcbd046f333e0683c724876bb0da63ea4373dc8a" +checksum = "14c39fd04924ca3a864207c66fc2cd7d22d7c016007f9ce846cbb9326331930a" [[package]] name = "tempdir" @@ -5394,9 +5372,9 @@ checksum = "ca6ad05a4870b2bf5fe995117d3728437bd27d7cd5f06f13c17443ef369775a1" [[package]] name = "wasm-encoder" -version = "0.35.0" +version = "0.36.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ca90ba1b5b0a70d3d49473c5579951f3bddc78d47b59256d2f9d4922b150aca" +checksum = "822b645bf4f2446b949776ffca47e2af60b167209ffb70814ef8779d299cd421" dependencies = [ "leb128", ] @@ -5442,9 +5420,9 @@ dependencies = [ [[package]] name = "wasmparser" -version = "0.115.0" +version = "0.116.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e06c0641a4add879ba71ccb3a1e4278fd546f76f1eafb21d8f7b07733b547cd5" +checksum = "a58e28b80dd8340cb07b8242ae654756161f6fc8d0038123d679b7b99964fa50" dependencies = [ "indexmap 2.0.2", "semver", @@ -5452,15 +5430,14 @@ dependencies = [ [[package]] name = "wasmtime" -version = "14.0.0" +version = "15.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f734876984c17b40eb5aa06086e7f25642eba7a15c1814c43556d185b8f1148" +checksum = "ae4b1702ef55144d6f594085f4989dc71fb71a791be1c8354ecc8e489b81199b" dependencies = [ "anyhow", "bincode", "bumpalo", "cfg-if", - "fxprof-processed-profile", "indexmap 2.0.2", "libc", "log", @@ -5472,7 +5449,6 @@ dependencies = [ "serde_derive", "serde_json", "target-lexicon", - "wasm-encoder", "wasmparser", "wasmtime-cache", "wasmtime-cranelift", @@ -5484,18 +5460,18 @@ dependencies = [ [[package]] name = "wasmtime-asm-macros" -version = "14.0.0" +version = "15.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e028656da1291ec5b4720c6b3fb579ee53cdecc0d4a105d4409a6b5c0029afa" +checksum = "c981d0e87bb3e98e08e76644e7ae5dfdef7f1d4105145853f3d677bb4535d65f" dependencies = [ "cfg-if", ] [[package]] name = "wasmtime-cache" -version = "14.0.0" +version = "15.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0df12569f88409543cfeb41b3a9b620f3c40fa7d8edeb571acf8bcccdd6c21ab" +checksum = "3d7ba8adaa84fdb9dd659275edcf7fc5282c44b9c9f829986c71d44fd52ea80a" dependencies = [ "anyhow", "base64 0.21.4", @@ -5513,9 +5489,9 @@ dependencies = [ [[package]] name = "wasmtime-cranelift" -version = "14.0.0" +version = "15.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "695e60462e0c4f897a06fdea52bf8667403ff4d7a6f1c312997b226f2bdd1ed6" +checksum = "1453665878e16245b9a25405e550c4a36c6731c6e34ea804edc002a38c3e6741" dependencies = [ "anyhow", "cfg-if", @@ -5538,9 +5514,9 @@ dependencies = [ [[package]] name = "wasmtime-cranelift-shared" -version = "14.0.0" +version = "15.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "18cef77aabba0155e713843f6ce698d325308c3ee76aca7a1f0b106d43b25a1e" +checksum = "d3dface3d9b72b4670781ff72675eabb291e2836b5dded6bb312b577d2bb561f" dependencies = [ "anyhow", "cranelift-codegen", @@ -5554,9 +5530,9 @@ dependencies = [ [[package]] name = "wasmtime-environ" -version = "14.0.0" +version = "15.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7679dbbd0eb6ea23fc8c29dc8c46f77a951f6154bb25af969bda18b0386b4680" +checksum = "c0116108e7d231cce15fe7dd642c66c3abb14dbcf169b0130e11f223ce8d1ad7" dependencies = [ "anyhow", "cranelift-entity", @@ -5574,9 +5550,9 @@ dependencies = [ [[package]] name = "wasmtime-jit" -version = "14.0.0" +version = "15.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e05ba8df0a4c9d9ab245ba79f5b5f1fe29d0f9f6531f94aadc0e391f866f697e" +checksum = "e32b210767452f6b20157bb7c7d98295b92cc47aaad2a8aa31652f4469813a5d" dependencies = [ "addr2line", "anyhow", @@ -5599,9 +5575,9 @@ dependencies = [ [[package]] name = "wasmtime-jit-debug" -version = "14.0.0" +version = "15.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56166807146dbbf193ec6830450ecc0e01725d468b328bcadcd20eb2c3d8085e" +checksum = "bffd2785a16c55ac77565613ebda625f5850d4014af0499df750e8de97c04547" dependencies = [ "once_cell", "wasmtime-versioned-export-macros", @@ -5609,9 +5585,9 @@ dependencies = [ [[package]] name = "wasmtime-jit-icache-coherence" -version = "14.0.0" +version = "15.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3a5dda53ad6993f9b0a2d65fb49e0348a7232a27a8794064122870d6ee19eb2" +checksum = "b73ad1395eda136baec5ece7e079e0536a82ef73488e345456cc9b89858ad0ec" dependencies = [ "cfg-if", "libc", @@ -5620,9 +5596,9 @@ dependencies = [ [[package]] name = "wasmtime-runtime" -version = "14.0.0" +version = "15.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c3c8fb9f63fd6ab79144e53415e2345867adf600ad329a05167b361eae82b18" +checksum = "77b50f7f3c1a8dabb2607f32a81242917bd77cee75f3dec66e04b02ccbb8ba07" dependencies = [ "anyhow", "cc", @@ -5648,9 +5624,9 @@ dependencies = [ [[package]] name = "wasmtime-types" -version = "14.0.0" +version = "15.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1dea1bc99dcd41d510b6f3535baefe56ec55741f0a9bd812b3323a1668b2eb50" +checksum = "447973db3dc5c24db14130ab0922795c58790aec296d198ad9d253b82ec67471" dependencies = [ "cranelift-entity", "serde", @@ -5661,9 +5637,9 @@ dependencies = [ [[package]] name = "wasmtime-versioned-export-macros" -version = "14.0.0" +version = "15.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47704f2f613f4e11f48a77aa0e7a20b9b0704fee560b48995e6c8af4b3f84981" +checksum = "9a347bb8ecf12275fb180afb1b1c85c9e186553c43109737bffed4f54c2aa365" dependencies = [ "proc-macro2", "quote", @@ -5672,9 +5648,9 @@ dependencies = [ [[package]] name = "wasmtime-wmemcheck" -version = "14.0.0" +version = "15.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a6c6c4600bc33b7f0e2f63111406788c6595649a198638f75cd047e33ceaf5d" +checksum = "47907bdd67500c66fa308acbce7387c7bfb63b5505ef81be7fc897709afcca60" [[package]] name = "web-sys" diff --git a/Cargo.toml b/Cargo.toml index 15391889421..bb12254e456 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -182,7 +182,7 @@ uuid = { version = "1.2.1", features = ["v4"] } walkdir = "2.2.5" wasmbin = "0.6" -wasmtime = { version = "14", default-features = false, features = ["cranelift"] } +wasmtime = { version = "15", default-features = false, features = ["cranelift", "demangle", "addr2line", "cache"] } # We use the "ondemand" feature to allow connecting after the start, # and reconnecting, from the tracy client to the database. diff --git a/crates/core/Cargo.toml b/crates/core/Cargo.toml index d30a9610301..f4467ddada7 100644 --- a/crates/core/Cargo.toml +++ b/crates/core/Cargo.toml @@ -88,7 +88,7 @@ tracing.workspace = true url.workspace = true urlencoding.workspace = true uuid.workspace = true -wasmtime = { workspace = true, features = ["cache"] } +wasmtime.workspace = true # Rocksdb ostorage backend, linked only if "rocksdb" feature enabled. rocksdb = {workspace = true, optional = true} diff --git a/crates/core/src/host/wasmtime/wasmtime_module.rs b/crates/core/src/host/wasmtime/wasmtime_module.rs index e5c99895735..0798522e48e 100644 --- a/crates/core/src/host/wasmtime/wasmtime_module.rs +++ b/crates/core/src/host/wasmtime/wasmtime_module.rs @@ -106,8 +106,7 @@ impl module_host_actor::WasmInstancePre for WasmtimeModule { store.data_mut().instantiate(mem); // Note: this budget is just for initializers - let (init_budget, _) = WasmtimeFuel::from_energy_quanta(EnergyQuanta::DEFAULT_BUDGET); - set_store_fuel(&mut store, init_budget); + set_store_fuel(&mut store, EnergyQuanta::DEFAULT_BUDGET); for preinit in &func_names.preinits { let func = instance.get_typed_func::<(), ()>(&mut store, preinit).unwrap(); @@ -199,8 +198,7 @@ impl module_host_actor::WasmInstance for WasmtimeInstance { // note that this conversion is load-bearing - although we convert budget right back into // EnergyQuanta at the end of this function, from_energy_quanta clamps it to a u64 range. // otherwise, we'd return something like `used: i128::MAX - u64::MAX`, which is inaccurate. - let (budget, _excess_quanta) = WasmtimeFuel::from_energy_quanta(budget); - set_store_fuel(store, budget); + let budget: WasmtimeFuel = set_store_fuel(store, budget); let mut make_buf = |data| store.data_mut().insert_buffer(data); @@ -252,18 +250,12 @@ impl module_host_actor::WasmInstance for WasmtimeInstance { } } -fn set_store_fuel(store: &mut impl AsContextMut, fuel: WasmtimeFuel) { - let fuel = fuel.0; - let mut store = store.as_context_mut(); - let rem = store.fuel_remaining().unwrap(); - let diff = rem.abs_diff(fuel); - if rem < fuel { - store.add_fuel(diff).unwrap(); - } else { - store.consume_fuel(diff).unwrap(); - } +fn set_store_fuel(store: &mut impl AsContextMut, fuel: EnergyQuanta) -> WasmtimeFuel { + let (fuel, _excess) = WasmtimeFuel::from_energy_quanta(fuel); + store.as_context_mut().set_fuel(fuel.0).unwrap(); + fuel } fn get_store_fuel(store: &impl AsContext) -> WasmtimeFuel { - WasmtimeFuel(store.as_context().fuel_remaining().unwrap()) + WasmtimeFuel(store.as_context().get_fuel().unwrap()) } From 720a5c708ed6a59e346d562b26c9046afb1d1e0d Mon Sep 17 00:00:00 2001 From: Noa Date: Thu, 30 Nov 2023 01:09:54 -0600 Subject: [PATCH 2/2] Add test for wasmtime fuel use --- .../core/src/host/wasmtime/wasmtime_module.rs | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/crates/core/src/host/wasmtime/wasmtime_module.rs b/crates/core/src/host/wasmtime/wasmtime_module.rs index 0798522e48e..b18d465e8ec 100644 --- a/crates/core/src/host/wasmtime/wasmtime_module.rs +++ b/crates/core/src/host/wasmtime/wasmtime_module.rs @@ -259,3 +259,23 @@ fn set_store_fuel(store: &mut impl AsContextMut, fuel: EnergyQuanta) -> Wasmtime fn get_store_fuel(store: &impl AsContext) -> WasmtimeFuel { WasmtimeFuel(store.as_context().get_fuel().unwrap()) } + +#[cfg(test)] +mod tests { + use super::*; + use crate::host::EnergyDiff; + + #[test] + fn test_fuel() { + let mut store = wasmtime::Store::new( + &wasmtime::Engine::new(wasmtime::Config::new().consume_fuel(true)).unwrap(), + (), + ); + let budget = EnergyQuanta::DEFAULT_BUDGET; + let budget = set_store_fuel(&mut store, budget); + store.set_fuel(store.get_fuel().unwrap() - 10).unwrap(); + let remaining: EnergyQuanta = get_store_fuel(&store).into(); + let used = EnergyQuanta::from(budget) - remaining; + assert_eq!(used, EnergyDiff(10_000)); + } +}