diff --git a/Cargo.lock b/Cargo.lock index 78dc5fd6d..3b47a5dbc 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -24,9 +24,9 @@ dependencies = [ [[package]] name = "aho-corasick" -version = "0.7.19" +version = "0.7.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4f55bd91a0978cbfd91c457a164bab8b4001c833b7f323132c0a4e1922dd44e" +checksum = "cc936419f96fa211c1b9166887b38e5e40b19958e5b895be7c1f93adec7071ac" dependencies = [ "memchr", ] @@ -96,9 +96,9 @@ dependencies = [ [[package]] name = "async-trait" -version = "0.1.58" +version = "0.1.59" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e805d94e6b5001b651426cf4cd446b1ab5f319d27bab5c644f61de0a804360c" +checksum = "31e6e93155431f3931513b243d371981bb2770112b370c82745a1d19d2f99364" dependencies = [ "proc-macro2", "quote", @@ -154,9 +154,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "block-buffer" -version = "0.9.0" +version = "0.10.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4" +checksum = "69cce20737498f97b993470a6e536b8523f0af7892a4f928cceb1ac5e52ebe7e" dependencies = [ "generic-array", ] @@ -175,9 +175,9 @@ checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" [[package]] name = "bytes" -version = "1.2.1" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec8a7b6a70fde80372154c65702f00a0f56f3e1c36abbc6c440484be248856db" +checksum = "dfb24e866b15a1af2a1b663f10c6b6b8f397a84aadb828f12e5b289ec23a3a3c" [[package]] name = "cap-fs-ext" @@ -252,9 +252,9 @@ checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5" [[package]] name = "cc" -version = "1.0.76" +version = "1.0.77" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76a284da2e6fe2092f2353e51713435363112dfd60030e22add80be333fb928f" +checksum = "e9f73505338f7d905b19d18738976aae232eb46b8efc15554ffc56deb5d9ebe4" dependencies = [ "jobserver", ] @@ -306,14 +306,14 @@ dependencies = [ [[package]] name = "clap" -version = "4.0.24" +version = "4.0.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60494cedb60cb47462c0ff7be53de32c0e42a6fc2c772184554fa12bd9489c03" +checksum = "4d63b9e9c07271b9957ad22c173bae2a4d9a81127680962039296abcd2f8251d" dependencies = [ - "atty", "bitflags", "clap_derive", "clap_lex 0.3.0", + "is-terminal 0.4.1", "once_cell", "strsim", "termcolor", @@ -386,24 +386,25 @@ dependencies = [ [[package]] name = "cranelift-bforest" -version = "0.89.2" +version = "0.90.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "593b398dd0c5b1e2e3a9c3dae8584e287894ea84e361949ad506376e99196265" +checksum = "b62c772976416112fa4484cbd688cb6fb35fd430005c1c586224fc014018abad" dependencies = [ "cranelift-entity", ] [[package]] name = "cranelift-codegen" -version = "0.89.2" +version = "0.90.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "afc0d8faabd099ea15ab33d49d150e5572c04cfeb95d675fd41286739b754629" +checksum = "9b40ed2dd13c2ac7e24f88a3090c68ad3414eb1d066a95f8f1f7b3b819cb4e46" dependencies = [ "arrayvec", "bumpalo", "cranelift-bforest", "cranelift-codegen-meta", "cranelift-codegen-shared", + "cranelift-egraph", "cranelift-entity", "cranelift-isle", "gimli", @@ -415,33 +416,47 @@ dependencies = [ [[package]] name = "cranelift-codegen-meta" -version = "0.89.2" +version = "0.90.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ac1669e42579476f001571d6ba4b825fac686282c97b88b18f8e34242066a81" +checksum = "bb927a8f1c27c34ee3759b6b0ffa528d2330405d5cc4511f0cab33fe2279f4b5" dependencies = [ "cranelift-codegen-shared", ] [[package]] name = "cranelift-codegen-shared" -version = "0.89.2" +version = "0.90.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2a1b1eef9640ab72c1e7b583ac678083855a509da34b4b4378bd99954127c20" +checksum = "43dfa417b884a9ab488d95fd6b93b25e959321fe7bfd7a0a960ba5d7fb7ab927" + +[[package]] +name = "cranelift-egraph" +version = "0.90.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e0a66b39785efd8513d2cca967ede56d6cc57c8d7986a595c7c47d0c78de8dce" +dependencies = [ + "cranelift-entity", + "fxhash", + "hashbrown", + "indexmap", + "log", + "smallvec", +] [[package]] name = "cranelift-entity" -version = "0.89.2" +version = "0.90.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eea4e17c3791fd8134640b26242a9ddbd7c67db78f0bad98cb778bf563ef81a0" +checksum = "0637ffde963cb5d759bc4d454cfa364b6509e6c74cdaa21298add0ed9276f346" dependencies = [ "serde", ] [[package]] name = "cranelift-frontend" -version = "0.89.2" +version = "0.90.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fca1474b5302348799656d43a40eacd716a3b46169405a3af812832c9edf77b4" +checksum = "fb72b8342685e850cb037350418f62cc4fc55d6c2eb9c7ca01b82f9f1a6f3d56" dependencies = [ "cranelift-codegen", "log", @@ -451,15 +466,15 @@ dependencies = [ [[package]] name = "cranelift-isle" -version = "0.89.2" +version = "0.90.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77aa537f020ea43483100153278e7215d41695bdcef9eea6642d122675f64249" +checksum = "850579cb9e4b448f7c301f1e6e6cbad99abe3f1f1d878a4994cb66e33c6db8cd" [[package]] name = "cranelift-native" -version = "0.89.2" +version = "0.90.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8bdc6b65241a95b7d8eafbf4e114c082e49b80162a2dcd9c6bcc5989c3310c9e" +checksum = "2d0a279e5bcba3e0466c734d8d8eb6bfc1ad29e95c37f3e4955b492b5616335e" dependencies = [ "cranelift-codegen", "libc", @@ -468,9 +483,9 @@ dependencies = [ [[package]] name = "cranelift-wasm" -version = "0.89.2" +version = "0.90.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4eb6359f606a1c80ccaa04fae9dbbb504615ec7a49b6c212b341080fff7a65dd" +checksum = "e6b8c5e7ffb754093fb89ec4bd4f9dbb9f1c955427299e334917d284745835c2" dependencies = [ "cranelift-codegen", "cranelift-entity", @@ -552,26 +567,36 @@ dependencies = [ [[package]] name = "crossbeam-epoch" -version = "0.9.11" +version = "0.9.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f916dfc5d356b0ed9dae65f1db9fc9770aa2851d2662b988ccf4fe3516e86348" +checksum = "01a9af1f4c2ef74bb8aa1f7e19706bc72d03598c8a570bb5de72243c7a9d9d5a" dependencies = [ "autocfg", "cfg-if", "crossbeam-utils", - "memoffset", + "memoffset 0.7.1", "scopeguard", ] [[package]] name = "crossbeam-utils" -version = "0.8.12" +version = "0.8.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edbafec5fa1f196ca66527c1b12c2ec4745ca14b50f1ad8f9f6f720b55d11fac" +checksum = "4fb766fa798726286dbbb842f174001dab8abc7b627a1dd86e0b7222a95d929f" dependencies = [ "cfg-if", ] +[[package]] +name = "crypto-common" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +dependencies = [ + "generic-array", + "typenum", +] + [[package]] name = "dashmap" version = "5.4.0" @@ -587,9 +612,9 @@ dependencies = [ [[package]] name = "data-encoding" -version = "2.3.2" +version = "2.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ee2393c4a91429dffb4bedf19f4d6abf27d8a732c8ce4980305d782e5426d57" +checksum = "23d8666cb01533c39dde32bcbab8e227b4ed6679b2c925eba05feabea39508fb" [[package]] name = "der-parser" @@ -607,11 +632,12 @@ dependencies = [ [[package]] name = "digest" -version = "0.9.0" +version = "0.10.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" +checksum = "8168378f4e5023e7218c89c891c0fd8ecdb5e5e4f18cb78f38cf245dd021e76f" dependencies = [ - "generic-array", + "block-buffer", + "crypto-common", ] [[package]] @@ -949,9 +975,9 @@ dependencies = [ [[package]] name = "indexmap" -version = "1.9.1" +version = "1.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "10a35a97730320ffe8e2d410b5d3b69279b98d2c14bdb8b70ea89ecf7888d41e" +checksum = "1885e79c1fc4b10f0e172c475f458b7f7b93061064d98c3293e98c5ba0c8b399" dependencies = [ "autocfg", "hashbrown", @@ -980,9 +1006,9 @@ dependencies = [ [[package]] name = "io-lifetimes" -version = "1.0.1" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7d367024b3f3414d8e01f437f704f41a9f64ab36f9067fa73e526ad4c763c87" +checksum = "46112a93252b123d31a119a8d1a1ac19deac4fac6e0e8b0df58f0d4e5870e63c" dependencies = [ "libc", "windows-sys 0.42.0", @@ -1006,6 +1032,18 @@ dependencies = [ "windows-sys 0.36.1", ] +[[package]] +name = "is-terminal" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "927609f78c2913a6f6ac3c27a4fe87f43e2a35367c0c4b0f8265e8f49a104330" +dependencies = [ + "hermit-abi 0.2.6", + "io-lifetimes 1.0.3", + "rustix 0.36.5", + "windows-sys 0.42.0", +] + [[package]] name = "itertools" version = "0.10.5" @@ -1073,9 +1111,9 @@ checksum = "884e2677b40cc8c339eaefcb701c32ef1fd2493d71118dc0ca4b6a736c93bd67" [[package]] name = "libc" -version = "0.2.137" +version = "0.2.138" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc7fcc620a3bff7cdd7a365be3376c97191aeaccc2a603e600951e452615bf89" +checksum = "db6d7e329c562c5dfab7a46a2afabc8b987ab9a4834c9d1ca04dc54c1546cef8" [[package]] name = "linux-raw-sys" @@ -1085,9 +1123,9 @@ checksum = "d4d2456c373231a208ad294c33dc5bff30051eafd954cd4caae83a712b12854d" [[package]] name = "linux-raw-sys" -version = "0.1.2" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb68f22743a3fb35785f1e7f844ca5a3de2dde5bd0c0ef5b372065814699b121" +checksum = "8f9f08d8963a6c613f4b1a78f4f4a4dbfadf8e6545b2d72861731e4858b8b47f" [[package]] name = "lock_api" @@ -1175,6 +1213,17 @@ dependencies = [ "wasmtime", ] +[[package]] +name = "lunatic-metrics-api" +version = "0.12.0" +dependencies = [ + "anyhow", + "log", + "lunatic-common-api", + "metrics", + "wasmtime", +] + [[package]] name = "lunatic-networking-api" version = "0.12.0" @@ -1203,6 +1252,7 @@ dependencies = [ "serde", "tokio", "wasmtime", + "wasmtime-wasi", ] [[package]] @@ -1218,6 +1268,7 @@ dependencies = [ "metrics", "tokio", "wasmtime", + "wasmtime-runtime", ] [[package]] @@ -1237,7 +1288,7 @@ name = "lunatic-runtime" version = "0.12.0" dependencies = [ "anyhow", - "clap 4.0.24", + "clap 4.0.29", "criterion", "dashmap", "env_logger", @@ -1247,6 +1298,7 @@ dependencies = [ "lunatic-distributed-api", "lunatic-error-api", "lunatic-messaging-api", + "lunatic-metrics-api", "lunatic-networking-api", "lunatic-process", "lunatic-process-api", @@ -1334,7 +1386,7 @@ version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b20a59d985586e4a5aef64564ac77299f8586d8be6cf9106a5a40207e8908efb" dependencies = [ - "rustix 0.36.1", + "rustix 0.36.5", ] [[package]] @@ -1346,6 +1398,15 @@ dependencies = [ "autocfg", ] +[[package]] +name = "memoffset" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5de893c32cde5f383baa4c04c5d6dbdd735cfd4a794b0debdb2bb1b421da5ff4" +dependencies = [ + "autocfg", +] + [[package]] name = "metrics" version = "0.20.1" @@ -1505,12 +1566,6 @@ version = "11.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0ab1bc2a289d34bd04a330323ac98a1b4bc82c9d9fcb1e66b63caa84da26b575" -[[package]] -name = "opaque-debug" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" - [[package]] name = "openssl-probe" version = "0.1.5" @@ -1519,9 +1574,9 @@ checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" [[package]] name = "os_str_bytes" -version = "6.4.0" +version = "6.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b5bf27447411e9ee3ff51186bf7a08e16c341efdde93f4d823e8844429bed7e" +checksum = "9b7820b9daea5457c9f21c69448905d723fbd21136ccf521748f23fd49e723ee" [[package]] name = "parking_lot" @@ -1535,9 +1590,9 @@ dependencies = [ [[package]] name = "parking_lot_core" -version = "0.9.4" +version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4dc9e0dc2adc1c69d09143aff38d3d30c5c3f0df0dad82e6d25547af174ebec0" +checksum = "7ff9f3fef3968a3ec5945535ed654cb38ff72d7495a25619e2247fb15a2ed9ba" dependencies = [ "cfg-if", "libc", @@ -1673,9 +1728,9 @@ dependencies = [ [[package]] name = "quinn" -version = "0.9.0" +version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a5f2962a2f18666b1b690cbc33f528b4fcdfc6e51a84b47c7fb19b6a9fab753" +checksum = "445cbfe2382fa023c4f2f3c7e1c95c03dcc1df2bf23cebcb2b13e1402c4394d1" dependencies = [ "bytes", "pin-project-lite", @@ -1691,9 +1746,9 @@ dependencies = [ [[package]] name = "quinn-proto" -version = "0.9.0" +version = "0.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1268269057c3f78dab82fe8d8b7834e656710cff55b97dbc890a67dcc113b2e" +checksum = "72ef4ced82a24bb281af338b9e8f94429b6eca01b4e66d899f40031f074e74c9" dependencies = [ "bytes", "rand", @@ -1710,9 +1765,9 @@ dependencies = [ [[package]] name = "quinn-udp" -version = "0.3.0" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47085d44ed35b0f4499a88e47d689a411d483845966124e187a8f3cbb39eeebb" +checksum = "641538578b21f5e5c8ea733b736895576d0fe329bb883b937db6f4d163dbaaf4" dependencies = [ "libc", "quinn-proto", @@ -1771,11 +1826,10 @@ dependencies = [ [[package]] name = "rayon" -version = "1.5.3" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd99e5772ead8baa5215278c9b15bf92087709e9c1b2d1f97cdb5a183c933a7d" +checksum = "1e060280438193c554f654141c9ea9417886713b7acd75974c85b18a69a88e0b" dependencies = [ - "autocfg", "crossbeam-deque", "either", "rayon-core", @@ -1783,9 +1837,9 @@ dependencies = [ [[package]] name = "rayon-core" -version = "1.9.3" +version = "1.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "258bcdb5ac6dad48491bb2992db6b7cf74878b0384908af124823d118c99683f" +checksum = "cac410af5d00ab6884528b4ab69d1e8e146e8d471201800fa1b4524126de6ad3" dependencies = [ "crossbeam-channel", "crossbeam-deque", @@ -1909,15 +1963,15 @@ dependencies = [ [[package]] name = "rustix" -version = "0.36.1" +version = "0.36.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "812a2ec2043c4d6bc6482f5be2ab8244613cac2493d128d36c0759e52a626ab3" +checksum = "a3807b5d10909833d3e9acd1eb5fb988f79376ff10fce42937de71a449c4c588" dependencies = [ "bitflags", "errno", - "io-lifetimes 1.0.1", + "io-lifetimes 1.0.3", "libc", - "linux-raw-sys 0.1.2", + "linux-raw-sys 0.1.3", "windows-sys 0.42.0", ] @@ -2020,18 +2074,18 @@ dependencies = [ [[package]] name = "serde" -version = "1.0.147" +version = "1.0.149" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d193d69bae983fc11a79df82342761dfbf28a99fc8d203dca4c3c1b590948965" +checksum = "256b9932320c590e707b94576e3cc1f7c9024d0ee6612dfbcf1cb106cbe8e055" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.147" +version = "1.0.149" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f1d362ca8fc9c3e3a7484440752472d68a6caa98f1ab81d99b5dfe517cec852" +checksum = "b4eae9b04cbffdfd550eb462ed33bc6a1b68c935127d008b27444d08380f94e4" dependencies = [ "proc-macro2", "quote", @@ -2040,9 +2094,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.87" +version = "1.0.89" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ce777b7b150d76b9cf60d28b55f5847135a003f7d7350c6be7a773508ce7d45" +checksum = "020ff22c755c2ed3f8cf162dbb41a7268d934702f3ed3631656ea597e08fc3db" dependencies = [ "itoa", "ryu", @@ -2051,15 +2105,13 @@ dependencies = [ [[package]] name = "sha2" -version = "0.9.9" +version = "0.10.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d58a1e1bf39749807d89cf2d98ac2dfa0ff1cb3faa38fbb64dd88ac8013d800" +checksum = "82e6b795fe2e3b1e845bafcb27aa35405c4d47cdfc92af5fc8d3002f76cebdc0" dependencies = [ - "block-buffer", "cfg-if", "cpufeatures", "digest", - "opaque-debug", ] [[package]] @@ -2128,9 +2180,9 @@ checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" [[package]] name = "syn" -version = "1.0.103" +version = "1.0.105" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a864042229133ada95abf3b54fdc62ef5ccabe9515b64717bcb9a1919e59445d" +checksum = "60b9b43d45702de4c839cb9b51d9f529c5dd26a4aff255b42b1ebc03e88ee908" dependencies = [ "proc-macro2", "quote", @@ -2260,9 +2312,9 @@ checksum = "cda74da7e1a664f795bb1f8a87ec406fb89a02522cf6e50620d016add6dbbf5c" [[package]] name = "tokio" -version = "1.21.2" +version = "1.23.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9e03c497dc955702ba729190dc4aac6f2a0ce97f913e5b1b5912fc5039d9099" +checksum = "eab6d665857cc6ca78d6e80303a02cea7a7851e85dfbd77cbdc09bd129f1ef46" dependencies = [ "autocfg", "bytes", @@ -2273,14 +2325,14 @@ dependencies = [ "pin-project-lite", "socket2", "tokio-macros", - "winapi", + "windows-sys 0.42.0", ] [[package]] name = "tokio-macros" -version = "1.8.0" +version = "1.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9724f9a975fb987ef7a3cd9be0350edcbe130698af5b8f7a631e23d42d052484" +checksum = "d266c00fde287f55d3f1c3e96c500c362a2b8c695076ec180f27918820bc6df8" dependencies = [ "proc-macro2", "quote", @@ -2354,9 +2406,9 @@ checksum = "59547bce71d9c38b83d9c0e92b6066c4253371f15005def0c30d9657f50c7642" [[package]] name = "typenum" -version = "1.15.0" +version = "1.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dcf81ac59edc17cc8697ff311e8f5ef2d99fcbd9817b34cec66f90b6c3dfd987" +checksum = "497961ef93d974e23eb6f433eb5fe1b7930b659f06d12dec6fc44a8f554c0bba" [[package]] name = "unicode-ident" @@ -2432,9 +2484,9 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasi-cap-std-sync" -version = "2.0.2" +version = "3.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4b4953999c746173c263b81e9e5e3e335ff47face7187ba2a5ecc91c716e6f3" +checksum = "ecbeebb8985a5423f36f976b2f4a0b3c6ce38d7d9a7247e1ce07aa2880e4f29b" dependencies = [ "anyhow", "async-trait", @@ -2445,7 +2497,7 @@ dependencies = [ "fs-set-times", "io-extras", "io-lifetimes 0.7.5", - "is-terminal", + "is-terminal 0.3.0", "once_cell", "rustix 0.35.13", "system-interface", @@ -2456,9 +2508,9 @@ dependencies = [ [[package]] name = "wasi-common" -version = "2.0.2" +version = "3.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d47faf4f76ebfdeb1f3346a949c6fbf2f2471afc68280b00c76d6c02221d80ad" +checksum = "81e2171f3783fe6600ee24ff6c58ca1b329c55e458cc1622ecc1fd0427648607" dependencies = [ "anyhow", "bitflags", @@ -2468,6 +2520,7 @@ dependencies = [ "rustix 0.35.13", "thiserror", "tracing", + "wasmtime", "wiggle", "windows-sys 0.36.1", ] @@ -2528,27 +2581,27 @@ checksum = "1c38c045535d93ec4f0b4defec448e4291638ee608530863b1e2ba115d4fff7f" [[package]] name = "wasm-encoder" -version = "0.19.1" +version = "0.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9424cdab516a16d4ea03c8f4a01b14e7b2d04a129dcc2bcdde5bcc5f68f06c41" +checksum = "05632e0a66a6ed8cca593c24223aabd6262f256c3693ad9822c315285f010614" dependencies = [ "leb128", ] [[package]] name = "wasmparser" -version = "0.92.0" +version = "0.93.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7da34cec2a8c23db906cdf8b26e988d7a7f0d549eb5d51299129647af61a1b37" +checksum = "c5a4460aa3e271fa180b6a5d003e728f3963fb30e3ba0fa7c9634caa06049328" dependencies = [ "indexmap", ] [[package]] name = "wasmtime" -version = "2.0.2" +version = "3.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "743d37c265fa134a76de653c7e66be22590eaccd03da13cee99f3ac7a59cb826" +checksum = "d18265705b1c49218776577d9f301d79ab06888c7f4a32e2ed24e68a55738ce7" dependencies = [ "anyhow", "async-trait", @@ -2577,18 +2630,18 @@ dependencies = [ [[package]] name = "wasmtime-asm-macros" -version = "2.0.2" +version = "3.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de327cf46d5218315957138131ed904621e6f99018aa2da508c0dcf0c65f1bf2" +checksum = "a201583f6c79b96e74dcce748fa44fb2958f474ef13c93f880ea4d3bed31ae4f" dependencies = [ "cfg-if", ] [[package]] name = "wasmtime-cache" -version = "2.0.2" +version = "3.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42bd53d27df1076100519b680b45d8209aed62b4bbaf0913732810cb216f7b2b" +checksum = "3f37efc6945b08fcb634cffafc438dd299bac55a27c836954656c634d3e63c31" dependencies = [ "anyhow", "base64", @@ -2606,9 +2659,9 @@ dependencies = [ [[package]] name = "wasmtime-cranelift" -version = "2.0.2" +version = "3.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "017c3605ccce867b3ba7f71d95e5652acc22b9dc2971ad6a6f9df4a8d7af2648" +checksum = "fe208297e045ea0ee6702be88772ea40f918d55fbd4163981a4699aff034b634" dependencies = [ "anyhow", "cranelift-codegen", @@ -2627,9 +2680,9 @@ dependencies = [ [[package]] name = "wasmtime-environ" -version = "2.0.2" +version = "3.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6aec5c1f81aab9bb35997113c171b6bb9093afc90e3757c55e0c08dc9ac612e4" +checksum = "754b97f7441ac780a7fa738db5b9c23c1b70ef4abccd8ad205ada5669d196ba2" dependencies = [ "anyhow", "cranelift-entity", @@ -2646,9 +2699,9 @@ dependencies = [ [[package]] name = "wasmtime-fiber" -version = "2.0.2" +version = "3.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1075aa43857086ef89afbe87602fe2dae98ad212582e722b6d3d2676bb5ee141" +checksum = "e5f54abc960b4a055ba16b942cbbd1da641e0ad44cc97a7608f3d43c069b120e" dependencies = [ "cc", "cfg-if", @@ -2659,9 +2712,9 @@ dependencies = [ [[package]] name = "wasmtime-jit" -version = "2.0.2" +version = "3.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08c683893dbba3986aa71582a5332b87157fb95d34098de2e5f077c7f078726d" +checksum = "32800cb6e29faabab7056593f70a4c00c65c75c365aaf05406933f2169d0c22f" dependencies = [ "addr2line", "anyhow", @@ -2673,32 +2726,43 @@ dependencies = [ "log", "object", "rustc-demangle", - "rustix 0.35.13", "serde", "target-lexicon", "thiserror", "wasmtime-environ", "wasmtime-jit-debug", + "wasmtime-jit-icache-coherence", "wasmtime-runtime", "windows-sys 0.36.1", ] [[package]] name = "wasmtime-jit-debug" -version = "2.0.2" +version = "3.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2f8f15a81292eec468c79a4f887a37a3d02eb0c610f34ddbec607d3e9022f18" +checksum = "fe057012a0ba6cee3685af1e923d6e0a6cb9baf15fb3ffa4be3d7f712c7dec42" dependencies = [ "object", "once_cell", "rustix 0.35.13", ] +[[package]] +name = "wasmtime-jit-icache-coherence" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6bbabb309c06cc238ee91b1455b748c45f0bdcab0dda2c2db85b0a1e69fcb66" +dependencies = [ + "cfg-if", + "libc", + "windows-sys 0.36.1", +] + [[package]] name = "wasmtime-runtime" -version = "2.0.2" +version = "3.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09af6238c962e8220424c815a7b1a9a6d0ba0694f0ab0ae12a6cda1923935a0d" +checksum = "09a23b6e138e89594c0189162e524a29e217aec8f9a4e1959a34f74c64e8d17d" dependencies = [ "anyhow", "cc", @@ -2708,7 +2772,7 @@ dependencies = [ "log", "mach", "memfd", - "memoffset", + "memoffset 0.6.5", "paste", "rand", "rustix 0.35.13", @@ -2722,9 +2786,9 @@ dependencies = [ [[package]] name = "wasmtime-types" -version = "2.0.2" +version = "3.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5dc3dd9521815984b35d6362f79e6b9c72475027cd1c71c44eb8df8fbf33a9fb" +checksum = "68ec7615fde8c79737f1345d81f0b18da83b3db929a87b4604f27c932246d1e2" dependencies = [ "cranelift-entity", "serde", @@ -2734,9 +2798,9 @@ dependencies = [ [[package]] name = "wasmtime-wasi" -version = "2.0.2" +version = "3.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3bba5cc0a940cef3fbbfa7291c7e5fe0f7ec6fb2efa7bd1504032ed6202a1c0" +checksum = "ca539adf155dca1407aa3656e5661bf2364b1f3ebabc7f0a8bd62629d876acfa" dependencies = [ "anyhow", "wasi-cap-std-sync", @@ -2756,9 +2820,9 @@ dependencies = [ [[package]] name = "wast" -version = "49.0.0" +version = "50.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05ef81fcd60d244cafffeafac3d17615fdb2fddda6aca18f34a8ae233353587c" +checksum = "a2cbb59d4ac799842791fe7e806fa5dbbf6b5554d538e51cc8e176db6ff0ae34" dependencies = [ "leb128", "memchr", @@ -2768,11 +2832,11 @@ dependencies = [ [[package]] name = "wat" -version = "1.0.51" +version = "1.0.52" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c347c4460ffb311e95aafccd8c29e4888f241b9e4b3bb0e0ccbd998de2c8c0d" +checksum = "584aaf7a1ecf4d383bbe1a25eeab0cbb8ff96acc6796707ff65cde48f4632f15" dependencies = [ - "wast 49.0.0", + "wast 50.0.0", ] [[package]] @@ -2806,9 +2870,9 @@ dependencies = [ [[package]] name = "wiggle" -version = "2.0.2" +version = "3.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "211ef4d238fd83bbe6f1bc57f3e2e20dc8b1f999188be252e7a535b696c6f84f" +checksum = "2da09ca5b8bb9278a2123e8c36342166b9aaa55a0dbab18b231f46d6f6ab85bc" dependencies = [ "anyhow", "async-trait", @@ -2822,9 +2886,9 @@ dependencies = [ [[package]] name = "wiggle-generate" -version = "2.0.2" +version = "3.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "63feec26b2fc3708c7a63316949ca75dd96988f03a17e4cb8d533dc62587ada4" +checksum = "ba5796f53b429df7d44cfdaae8f6d9cd981d82aec3516561352ca9c5e73ee185" dependencies = [ "anyhow", "heck", @@ -2837,9 +2901,9 @@ dependencies = [ [[package]] name = "wiggle-macro" -version = "2.0.2" +version = "3.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "494dc2646618c2b7fb0ec5e1d27dbac5ca31194c00a64698a4b5b35a83d80c21" +checksum = "8b830eb7203d48942fb8bc8bb105f76e7d09c33a082d638e990e02143bb2facd" dependencies = [ "proc-macro2", "quote", @@ -3050,9 +3114,9 @@ dependencies = [ [[package]] name = "zstd-sys" -version = "2.0.1+zstd.1.5.2" +version = "2.0.4+zstd.1.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fd07cbbc53846d9145dbffdf6dd09a7a0aa52be46741825f5c97bdd4f73f12b" +checksum = "4fa202f2ef00074143e219d15b62ffc317d17cc33909feac471c044087cad7b0" dependencies = [ "cc", "libc", diff --git a/Cargo.toml b/Cargo.toml index 2f246d397..4aa925b33 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -18,6 +18,10 @@ path = "src/lib.rs" name = "lunatic" path = "src/main.rs" +[[bin]] +name = "cargo-lunatic" +path = "src/cargo_lunatic.rs" + [features] default = ["metrics"] metrics = [ @@ -25,6 +29,7 @@ metrics = [ "lunatic-process/metrics", "lunatic-registry-api/metrics", "lunatic-timer-api/metrics", + "dep:lunatic-metrics-api", ] prometheus = ["dep:metrics-exporter-prometheus", "metrics"] @@ -41,6 +46,7 @@ lunatic-registry-api = { workspace = true } lunatic-stdout-capture = { workspace = true } lunatic-timer-api = { workspace = true } lunatic-version-api = { workspace = true } +lunatic-metrics-api = { workspace = true, optional = true } lunatic-wasi-api = { workspace = true } anyhow = { workspace = true } @@ -96,6 +102,7 @@ lunatic-registry-api = { path = "crates/lunatic-registry-api", version = "0.12" lunatic-stdout-capture = { path = "crates/lunatic-stdout-capture", version = "0.12" } lunatic-timer-api = { path = "crates/lunatic-timer-api", version = "0.12" } lunatic-version-api = { path = "crates/lunatic-version-api", version = "0.12" } +lunatic-metrics-api = { path = "crates/lunatic-metrics-api", version = "0.12" } lunatic-wasi-api = { path = "crates/lunatic-wasi-api", version = "0.12" } anyhow = "1.0" @@ -105,5 +112,8 @@ metrics = "0.20.1" rustls-pemfile = "1.0" serde = "1.0" tokio = "1.20" -wasmtime = "2.0" -wasmtime-wasi = "2.0" +wasmtime = "3.0" +wasmtime-runtime = "3.0.1" +wasmtime-wasi = "3.0.1" +wasi-common = "3.0.1" +wiggle = "3.0.1" diff --git a/crates/lunatic-common-api/src/lib.rs b/crates/lunatic-common-api/src/lib.rs index 824a78cbd..02241c3b2 100644 --- a/crates/lunatic-common-api/src/lib.rs +++ b/crates/lunatic-common-api/src/lib.rs @@ -1,9 +1,9 @@ -use anyhow::Result; +use anyhow::{anyhow, Result}; use std::fmt::Display; -use wasmtime::{Caller, Memory, Trap}; +use wasmtime::{Caller, Memory}; // Get exported memory -pub fn get_memory(caller: &mut Caller) -> std::result::Result { +pub fn get_memory(caller: &mut Caller) -> Result { caller .get_export("memory") .or_trap("No export `memory` found")? @@ -12,30 +12,31 @@ pub fn get_memory(caller: &mut Caller) -> std::result::Result { - fn or_trap(self, info: S) -> Result; + fn or_trap(self, info: S) -> Result; } impl IntoTrap for Result { - fn or_trap(self, info: S) -> Result { + fn or_trap(self, info: S) -> Result { match self { Ok(result) => Ok(result), - Err(error) => Err(Trap::new(format!( + Err(error) => Err(anyhow!( "Trap raised during host call: {} ({}).", - error, info - ))), + error, + info + )), } } } impl IntoTrap for Option { - fn or_trap(self, info: S) -> Result { + fn or_trap(self, info: S) -> Result { match self { Some(result) => Ok(result), - None => Err(Trap::new(format!( + None => Err(anyhow!( "Trap raised during host call: Expected `Some({})` got `None` ({}).", std::any::type_name::(), info - ))), + )), } } } diff --git a/crates/lunatic-distributed-api/src/lib.rs b/crates/lunatic-distributed-api/src/lib.rs index 2c784883d..48846067a 100644 --- a/crates/lunatic-distributed-api/src/lib.rs +++ b/crates/lunatic-distributed-api/src/lib.rs @@ -13,7 +13,7 @@ use lunatic_process::{ }; use lunatic_process_api::ProcessCtx; use tokio::time::timeout; -use wasmtime::{Caller, Linker, ResourceLimiter, Trap}; +use wasmtime::{Caller, Linker, ResourceLimiter}; // Register the lunatic distributed APIs to the linker pub fn register(linker: &mut Linker) -> Result<()> @@ -63,7 +63,7 @@ where // // Traps: // * If any memory outside the guest heap space is referenced. -fn get_nodes(mut caller: Caller, nodes_ptr: u32, nodes_len: u32) -> Result +fn get_nodes(mut caller: Caller, nodes_ptr: u32, nodes_len: u32) -> Result where T: DistributedCtx, E: Environment, @@ -78,8 +78,7 @@ where memory .data_mut(&mut caller) .get_mut( - nodes_ptr as usize - ..(nodes_ptr as usize + std::mem::size_of::() * copy_nodes_len as usize), + nodes_ptr as usize..(nodes_ptr as usize + std::mem::size_of::() * copy_nodes_len), ) .or_trap("lunatic::distributed::get_nodes::memory")? .copy_from_slice(unsafe { node_ids[..copy_nodes_len].align_to::().1 }); @@ -101,7 +100,7 @@ fn exec_lookup_nodes( query_id_ptr: u32, nodes_len_ptr: u32, error_ptr: u32, -) -> Box> + Send + '_> +) -> Box> + Send + '_> where T: DistributedCtx + ErrorCtx + Send + 'static, E: Environment + 'static, @@ -151,7 +150,7 @@ fn copy_lookup_nodes_results( nodes_ptr: u32, nodes_len: u32, error_ptr: u32, -) -> Result +) -> Result where T: DistributedCtx + ErrorCtx, E: Environment, @@ -169,7 +168,7 @@ where .data_mut(&mut caller) .get_mut( nodes_ptr as usize - ..(nodes_ptr as usize + std::mem::size_of::() * copy_nodes_len as usize), + ..(nodes_ptr as usize + std::mem::size_of::() * copy_nodes_len), ) .or_trap("lunatic::distributed::copy_lookup_nodes_results::memory")? .copy_from_slice(unsafe { nodes[..copy_nodes_len].align_to::().1 }); @@ -220,7 +219,7 @@ fn spawn( params_ptr: u32, params_len: u32, id_ptr: u32, -) -> Box> + Send + '_> +) -> Box> + Send + '_> where T: DistributedCtx + ResourceLimiter + Send + ErrorCtx + 'static, E: Environment, @@ -228,7 +227,9 @@ where { Box::new(async move { if !caller.data().can_spawn() { - return Err(anyhow!("Process doesn't have permissions to spawn sub-processes").into()); + return Err(anyhow!( + "Process doesn't have permissions to spawn sub-processes" + )); } let memory = get_memory(&mut caller)?; let func_str = memory @@ -293,11 +294,11 @@ where Ok(process_id) => (process_id, 0), Err(error) => { let (code, message): (u32, String) = match error { - ClientError::Unexpected(cause) => Err(Trap::new(cause)), + ClientError::Unexpected(cause) => Err(anyhow!(cause)), ClientError::NodeNotFound => Ok((1, "Node does not exist.".to_string())), ClientError::ModuleNotFound => Ok((2, "Module does not exist.".to_string())), ClientError::Connection(cause) => Ok((9027, cause)), - _ => Err(Trap::new("unreachable")), + _ => Err(anyhow!("unreachable")), }?; ( caller @@ -338,7 +339,7 @@ fn send( mut caller: Caller, node_id: u64, process_id: u64, -) -> Box> + Send + '_> +) -> Box> + Send + '_> where T: DistributedCtx + ProcessCtx + Send + ErrorCtx + 'static, E: Environment, @@ -359,7 +360,7 @@ where }) = message { if !resources.is_empty() { - return Err(Trap::new("Cannot send resources to remote nodes.")); + return Err(anyhow!("Cannot send resources to remote nodes.")); } let state = caller.data(); @@ -371,15 +372,15 @@ where { Ok(_) => Ok(0), Err(error) => match error { - ClientError::Unexpected(cause) => Err(Trap::new(cause)), + ClientError::Unexpected(cause) => Err(anyhow!(cause)), ClientError::ProcessNotFound => Ok(1), ClientError::NodeNotFound => Ok(2), ClientError::Connection(_) => Ok(9027), - _ => Err(Trap::new("unreachable")), + _ => Err(anyhow!("unreachable")), }, } } else { - Err(Trap::new("Only Message::Data can be sent across nodes.")) + Err(anyhow!("Only Message::Data can be sent across nodes.")) } }) } @@ -410,7 +411,7 @@ fn send_receive_skip_search( node_id: u64, process_id: u64, timeout_duration: u64, -) -> Box> + Send + '_> +) -> Box> + Send + '_> where T: DistributedCtx + ProcessCtx + Send + 'static, E: Environment, @@ -439,7 +440,7 @@ where }) = message { if !resources.is_empty() { - return Err(Trap::new("Cannot send resources to remote nodes.")); + return Err(anyhow!("Cannot send resources to remote nodes.")); } let state = caller.data(); @@ -453,8 +454,8 @@ where Err(error) => match error { ClientError::ProcessNotFound => Ok(1), ClientError::NodeNotFound => Ok(2), - ClientError::Unexpected(cause) => Err(Trap::new(cause)), - _ => Err(Trap::new("unreachable")), + ClientError::Unexpected(cause) => Err(anyhow!(cause)), + _ => Err(anyhow!("unreachable")), }, }?; @@ -476,7 +477,7 @@ where Ok(9027) } } else { - Err(Trap::new("Only Message::Data can be sent across nodes.")) + Err(anyhow!("Only Message::Data can be sent across nodes.")) } }) } diff --git a/crates/lunatic-error-api/src/lib.rs b/crates/lunatic-error-api/src/lib.rs index f543b7df3..72cce322b 100644 --- a/crates/lunatic-error-api/src/lib.rs +++ b/crates/lunatic-error-api/src/lib.rs @@ -1,7 +1,6 @@ use anyhow::Result; use hash_map_id::HashMapId; use lunatic_common_api::{get_memory, IntoTrap}; -use wasmtime::Trap; use wasmtime::{Caller, Linker}; pub type ErrorResource = HashMapId; @@ -23,7 +22,7 @@ pub fn register(linker: &mut Linker) -> Result<()> { // // Traps: // * If the error ID doesn't exist. -fn string_size(caller: Caller, error_id: u64) -> Result { +fn string_size(caller: Caller, error_id: u64) -> Result { let error = caller .data() .error_resources() @@ -38,11 +37,7 @@ fn string_size(caller: Caller, error_id: u64) -> Result( - mut caller: Caller, - error_id: u64, - error_str_ptr: u32, -) -> Result<(), Trap> { +fn to_string(mut caller: Caller, error_id: u64, error_str_ptr: u32) -> Result<()> { let error = caller .data() .error_resources() @@ -60,7 +55,7 @@ fn to_string( // // Traps: // * If the error ID doesn't exist. -fn drop(mut caller: Caller, error_id: u64) -> Result<(), Trap> { +fn drop(mut caller: Caller, error_id: u64) -> Result<()> { caller .data_mut() .error_resources_mut() diff --git a/crates/lunatic-messaging-api/src/lib.rs b/crates/lunatic-messaging-api/src/lib.rs index ffa1645f5..0b44404ac 100644 --- a/crates/lunatic-messaging-api/src/lib.rs +++ b/crates/lunatic-messaging-api/src/lib.rs @@ -4,12 +4,12 @@ use std::{ io::{Read, Write}, }; -use anyhow::Result; +use anyhow::{anyhow, Result}; use lunatic_common_api::{get_memory, IntoTrap}; use lunatic_networking_api::NetworkingCtx; use lunatic_process_api::ProcessCtx; use tokio::time::{timeout, Duration}; -use wasmtime::{Caller, Linker, Trap}; +use wasmtime::{Caller, Linker}; use lunatic_process::{ message::{DataMessage, Message}, @@ -147,7 +147,7 @@ fn write_data>( mut caller: Caller, data_ptr: u32, data_len: u32, -) -> Result { +) -> Result { let memory = get_memory(&mut caller)?; let mut message = caller .data_mut() @@ -161,7 +161,7 @@ fn write_data>( let bytes = match &mut message { Message::Data(data) => data.write(buffer).or_trap("lunatic::message::write_data")?, Message::LinkDied(_) => { - return Err(Trap::new("Unexpected `Message::LinkDied` in scratch area")) + return Err(anyhow!("Unexpected `Message::LinkDied` in scratch area")) } }; // Put message back after writing to it. @@ -179,7 +179,7 @@ fn read_data>( mut caller: Caller, data_ptr: u32, data_len: u32, -) -> Result { +) -> Result { let memory = get_memory(&mut caller)?; let mut message = caller .data_mut() @@ -193,7 +193,7 @@ fn read_data>( let bytes = match &mut message { Message::Data(data) => data.read(buffer).or_trap("lunatic::message::read_data")?, Message::LinkDied(_) => { - return Err(Trap::new("Unexpected `Message::LinkDied` in scratch area")) + return Err(anyhow!("Unexpected `Message::LinkDied` in scratch area")) } }; // Put message back after reading from it. @@ -208,10 +208,7 @@ fn read_data>( // // Traps: // * If it's called without a data message being inside of the scratch area. -fn seek_data>( - mut caller: Caller, - index: u64, -) -> Result<(), Trap> { +fn seek_data>(mut caller: Caller, index: u64) -> Result<()> { let mut message = caller .data_mut() .message_scratch_area() @@ -220,7 +217,7 @@ fn seek_data>( match &mut message { Message::Data(data) => data.seek(index as usize), Message::LinkDied(_) => { - return Err(Trap::new("Unexpected `Message::LinkDied` in scratch area")) + return Err(anyhow!("Unexpected `Message::LinkDied` in scratch area")) } }; Ok(()) @@ -230,7 +227,7 @@ fn seek_data>( // // Traps: // * If it's called without a message being inside of the scratch area. -fn get_tag>(mut caller: Caller) -> Result { +fn get_tag>(mut caller: Caller) -> Result { let message = caller .data_mut() .message_scratch_area() @@ -246,7 +243,7 @@ fn get_tag>(mut caller: Caller) -> Result>(mut caller: Caller) -> Result { +fn data_size>(mut caller: Caller) -> Result { let message = caller .data_mut() .message_scratch_area() @@ -255,7 +252,7 @@ fn data_size>(mut caller: Caller) -> Result data.size(), Message::LinkDied(_) => { - return Err(Trap::new("Unexpected `Message::LinkDied` in scratch area")) + return Err(anyhow!("Unexpected `Message::LinkDied` in scratch area")) } }; @@ -271,7 +268,7 @@ fn data_size>(mut caller: Caller) -> Result + NetworkingCtx + 'static>( mut caller: Caller, module_id: u64, -) -> Result { +) -> Result { let module = caller .data() .module_resources() @@ -286,7 +283,7 @@ fn push_module + NetworkingCtx + 'static>( let index = match message { Message::Data(data) => data.add_resource(module) as u64, Message::LinkDied(_) => { - return Err(Trap::new("Unexpected `Message::LinkDied` in scratch area")) + return Err(anyhow!("Unexpected `Message::LinkDied` in scratch area")) } }; Ok(index) @@ -301,7 +298,7 @@ fn push_module + NetworkingCtx + 'static>( fn take_module + NetworkingCtx + 'static>( mut caller: Caller, index: u64, -) -> Result { +) -> Result { let message = caller .data_mut() .message_scratch_area() @@ -312,7 +309,7 @@ fn take_module + NetworkingCtx + 'static>( .take_module(index as usize) .or_trap("lunatic::message::take_module")?, Message::LinkDied(_) => { - return Err(Trap::new("Unexpected `Message::LinkDied` in scratch area")) + return Err(anyhow!("Unexpected `Message::LinkDied` in scratch area")) } }; Ok(caller.data_mut().module_resources_mut().add(module)) @@ -327,7 +324,7 @@ fn take_module + NetworkingCtx + 'static>( fn push_tcp_stream + NetworkingCtx>( mut caller: Caller, stream_id: u64, -) -> Result { +) -> Result { let stream = caller .data_mut() .tcp_stream_resources_mut() @@ -341,7 +338,7 @@ fn push_tcp_stream + NetworkingCtx>( let index = match message { Message::Data(data) => data.add_resource(stream) as u64, Message::LinkDied(_) => { - return Err(Trap::new("Unexpected `Message::LinkDied` in scratch area")) + return Err(anyhow!("Unexpected `Message::LinkDied` in scratch area")) } }; Ok(index) @@ -356,7 +353,7 @@ fn push_tcp_stream + NetworkingCtx>( fn take_tcp_stream + NetworkingCtx>( mut caller: Caller, index: u64, -) -> Result { +) -> Result { let message = caller .data_mut() .message_scratch_area() @@ -367,7 +364,7 @@ fn take_tcp_stream + NetworkingCtx>( .take_tcp_stream(index as usize) .or_trap("lunatic::message::take_tcp_stream")?, Message::LinkDied(_) => { - return Err(Trap::new("Unexpected `Message::LinkDied` in scratch area")) + return Err(anyhow!("Unexpected `Message::LinkDied` in scratch area")) } }; Ok(caller.data_mut().tcp_stream_resources_mut().add(tcp_stream)) @@ -384,7 +381,7 @@ fn take_tcp_stream + NetworkingCtx>( fn push_tls_stream + NetworkingCtx>( mut caller: Caller, stream_id: u64, -) -> Result { +) -> Result { let resources = caller.data_mut().tls_stream_resources_mut(); let stream = resources .remove(stream_id) @@ -397,7 +394,7 @@ fn push_tls_stream + NetworkingCtx>( let index = match message { Message::Data(data) => data.add_resource(stream) as u64, Message::LinkDied(_) => { - return Err(Trap::new("Unexpected `Message::LinkDied` in scratch area")) + return Err(anyhow!("Unexpected `Message::LinkDied` in scratch area")) } }; Ok(index) @@ -412,7 +409,7 @@ fn push_tls_stream + NetworkingCtx>( fn take_tls_stream + NetworkingCtx>( mut caller: Caller, index: u64, -) -> Result { +) -> Result { let message = caller .data_mut() .message_scratch_area() @@ -423,7 +420,7 @@ fn take_tls_stream + NetworkingCtx>( .take_tls_stream(index as usize) .or_trap("lunatic::message::take_tls_stream")?, Message::LinkDied(_) => { - return Err(Trap::new("Unexpected `Message::LinkDied` in scratch area")) + return Err(anyhow!("Unexpected `Message::LinkDied` in scratch area")) } }; Ok(caller.data_mut().tls_stream_resources_mut().add(tls_stream)) @@ -436,10 +433,7 @@ fn take_tls_stream + NetworkingCtx>( // Traps: // * If the process ID doesn't exist. // * If it's called before creating the next message. -fn send>( - mut caller: Caller, - process_id: u64, -) -> Result { +fn send>(mut caller: Caller, process_id: u64) -> Result { let message = caller .data_mut() .message_scratch_area() @@ -475,7 +469,7 @@ fn send_receive_skip_search + Send>( mut caller: Caller, process_id: u64, timeout_duration: u64, -) -> Box> + Send + '_> { +) -> Box> + Send + '_> { Box::new(async move { let message = caller .data_mut() @@ -535,7 +529,7 @@ fn receive + Send>( tag_ptr: u32, tag_len: u32, timeout_duration: u64, -) -> Box> + Send + '_> { +) -> Box> + Send + '_> { Box::new(async move { let tags = if tag_len > 0 { let memory = get_memory(&mut caller)?; @@ -583,7 +577,7 @@ fn receive + Send>( fn push_udp_socket + NetworkingCtx>( mut caller: Caller, socket_id: u64, -) -> Result { +) -> Result { let data = caller.data_mut(); let socket = data .udp_resources_mut() @@ -596,7 +590,7 @@ fn push_udp_socket + NetworkingCtx>( let index = match message { Message::Data(data) => data.add_resource(socket) as u64, Message::LinkDied(_) => { - return Err(Trap::new("Unexpected `Message::LinkDied` in scratch area")) + return Err(anyhow!("Unexpected `Message::LinkDied` in scratch area")) } }; Ok(index) @@ -611,7 +605,7 @@ fn push_udp_socket + NetworkingCtx>( fn take_udp_socket + NetworkingCtx>( mut caller: Caller, index: u64, -) -> Result { +) -> Result { let message = caller .data_mut() .message_scratch_area() @@ -622,7 +616,7 @@ fn take_udp_socket + NetworkingCtx>( .take_udp_socket(index as usize) .or_trap("lunatic::message::take_udp_socket")?, Message::LinkDied(_) => { - return Err(Trap::new("Unexpected `Message::LinkDied` in scratch area")) + return Err(anyhow!("Unexpected `Message::LinkDied` in scratch area")) } }; Ok(caller.data_mut().udp_resources_mut().add(udp_socket)) diff --git a/crates/lunatic-metrics-api/Cargo.toml b/crates/lunatic-metrics-api/Cargo.toml new file mode 100644 index 000000000..72860bf1e --- /dev/null +++ b/crates/lunatic-metrics-api/Cargo.toml @@ -0,0 +1,15 @@ +[package] +name = "lunatic-metrics-api" +version = "0.12.0" +edition = "2021" +description = "Lunatic host functions for metrics" +homepage = "https://lunatic.solutions" +repository = "https://github.com/lunatic-solutions/lunatic/tree/main/crates/lunatic-metrics" +license = "Apache-2.0/MIT" + +[dependencies] +anyhow = { workspace = true } +wasmtime = { workspace = true } +metrics = { workspace = true } +lunatic-common-api = { workspace = true } +log = { workspace = true } diff --git a/crates/lunatic-metrics-api/src/lib.rs b/crates/lunatic-metrics-api/src/lib.rs new file mode 100644 index 000000000..2da8d4271 --- /dev/null +++ b/crates/lunatic-metrics-api/src/lib.rs @@ -0,0 +1,161 @@ +use anyhow::Result; +use lunatic_common_api::{get_memory, IntoTrap}; +use metrics::{counter, decrement_gauge, gauge, histogram, increment_counter, increment_gauge}; +use wasmtime::{Caller, Linker}; + +/// Links the [Metrics](https://crates.io/crates/metrics) APIs +pub fn register(linker: &mut Linker) -> anyhow::Result<()> { + linker.func_wrap("lunatic::metrics", "counter", counter)?; + linker.func_wrap("lunatic::metrics", "increment_counter", increment_counter)?; + linker.func_wrap("lunatic::metrics", "gauge", gauge)?; + linker.func_wrap("lunatic::metrics", "increment_gauge", increment_gauge)?; + linker.func_wrap("lunatic::metrics", "decrement_gauge", decrement_gauge)?; + linker.func_wrap("lunatic::metrics", "histogram", histogram)?; + Ok(()) +} + +fn get_string_arg( + caller: &mut Caller, + name_str_ptr: u32, + name_str_len: u32, + func_name: &str, +) -> Result { + let memory = get_memory(caller)?; + let memory_slice = memory.data(caller); + let name = memory_slice + .get(name_str_ptr as usize..(name_str_ptr + name_str_len) as usize) + .or_trap(func_name)?; + let name = String::from_utf8(name.to_vec()).or_trap(func_name)?; + Ok(name) +} + +/// Sets a counter. +/// +/// Traps: +/// * If the name is not a valid utf8 string. +/// * If any memory outside the guest heap space is referenced. +fn counter( + mut caller: Caller<'_, T>, + name_str_ptr: u32, + name_str_len: u32, + value: u64, +) -> Result<()> { + let name = get_string_arg( + &mut caller, + name_str_ptr, + name_str_len, + "lunatic::metrics::counter", + )?; + + counter!(name, value); + Ok(()) +} + +/// Increments a counter. +/// +/// Traps: +/// * If the name is not a valid utf8 string. +/// * If any memory outside the guest heap space is referenced. +fn increment_counter( + mut caller: Caller<'_, T>, + name_str_ptr: u32, + name_str_len: u32, +) -> Result<()> { + let name = get_string_arg( + &mut caller, + name_str_ptr, + name_str_len, + "lunatic::metrics::increment_counter", + )?; + + increment_counter!(name); + Ok(()) +} + +/// Sets a gauge. +/// +/// Traps: +/// * If the name is not a valid utf8 string. +/// * If any memory outside the guest heap space is referenced. +fn gauge( + mut caller: Caller<'_, T>, + name_str_ptr: u32, + name_str_len: u32, + value: f64, +) -> Result<()> { + let name = get_string_arg( + &mut caller, + name_str_ptr, + name_str_len, + "lunatic::metrics::gauge", + )?; + + gauge!(name, value); + Ok(()) +} + +/// Increments a gauge. +/// +/// Traps: +/// * If the name is not a valid utf8 string. +/// * If any memory outside the guest heap space is referenced. +fn increment_gauge( + mut caller: Caller<'_, T>, + name_str_ptr: u32, + name_str_len: u32, + value: f64, +) -> Result<()> { + let name = get_string_arg( + &mut caller, + name_str_ptr, + name_str_len, + "lunatic::metrics::increment_gauge", + )?; + + increment_gauge!(name, value); + Ok(()) +} + +/// Decrements a gauge. +/// +/// Traps: +/// * If the name is not a valid utf8 string. +/// * If any memory outside the guest heap space is referenced. +fn decrement_gauge( + mut caller: Caller<'_, T>, + name_str_ptr: u32, + name_str_len: u32, + value: f64, +) -> Result<()> { + let name = get_string_arg( + &mut caller, + name_str_ptr, + name_str_len, + "lunatic::metrics::decrement_gauge", + )?; + + decrement_gauge!(name, value); + Ok(()) +} + +/// Sets a histogram. +/// +/// Traps: +/// * If the name is not a valid utf8 string. +/// * If any memory outside the guest heap space is referenced. +fn histogram( + mut caller: Caller<'_, T>, + name_str_ptr: u32, + name_str_len: u32, + value: f64, +) -> Result<()> { + let name = get_string_arg( + &mut caller, + name_str_ptr, + name_str_len, + "lunatic::metrics::histogram", + )?; + + histogram!(name, value); + Ok(()) +} diff --git a/crates/lunatic-networking-api/src/dns.rs b/crates/lunatic-networking-api/src/dns.rs index 2cbdba283..ae3852fb6 100644 --- a/crates/lunatic-networking-api/src/dns.rs +++ b/crates/lunatic-networking-api/src/dns.rs @@ -5,7 +5,6 @@ use std::vec::IntoIter; use anyhow::Result; use tokio::time::timeout; -use wasmtime::Trap; use wasmtime::{Caller, Linker}; use lunatic_common_api::{get_memory, IntoTrap}; @@ -65,7 +64,7 @@ fn resolve( name_str_len: u32, timeout_duration: u64, id_u64_ptr: u32, -) -> Box> + Send + '_> { +) -> Box> + Send + '_> { Box::new(async move { let memory = get_memory(&mut caller)?; let (memory_slice, state) = memory.data_and_store_mut(&mut caller); @@ -118,10 +117,7 @@ fn resolve( // // Traps: // * If the DNS iterator ID doesn't exist. -fn drop_dns_iterator( - mut caller: Caller, - dns_iter_id: u64, -) -> Result<(), Trap> { +fn drop_dns_iterator(mut caller: Caller, dns_iter_id: u64) -> Result<()> { caller .data_mut() .dns_resources_mut() @@ -151,7 +147,7 @@ fn resolve_next( port_u16_ptr: u32, flow_info_u32_ptr: u32, scope_id_u32_ptr: u32, -) -> Result { +) -> Result { let memory = get_memory(&mut caller)?; let dns_iter = caller .data_mut() diff --git a/crates/lunatic-networking-api/src/lib.rs b/crates/lunatic-networking-api/src/lib.rs index fa1102355..1a88c9d80 100644 --- a/crates/lunatic-networking-api/src/lib.rs +++ b/crates/lunatic-networking-api/src/lib.rs @@ -15,11 +15,12 @@ use tokio::io::{split, ReadHalf, WriteHalf}; use tokio::net::tcp::{OwnedReadHalf, OwnedWriteHalf}; use tokio::sync::Mutex; +use anyhow::anyhow; use tokio::net::{TcpListener, TcpStream, UdpSocket}; use tokio_rustls::rustls::{Certificate, PrivateKey}; use tokio_rustls::TlsStream; +use wasmtime::Memory; use wasmtime::{Caller, Linker}; -use wasmtime::{Memory, Trap}; use lunatic_common_api::IntoTrap; @@ -120,7 +121,7 @@ fn socket_address( port: u32, flow_info: u32, scope_id: u32, -) -> Result { +) -> Result { Ok(match addr_type { 4 => { let ip = memory @@ -138,6 +139,6 @@ fn socket_address( let addr = >::from(ip.try_into().expect("exactly 16 bytes")); SocketAddrV6::new(addr, port as u16, flow_info, scope_id).into() } - _ => return Err(Trap::new("Unsupported address type in socket_address*")), + _ => return Err(anyhow!("Unsupported address type in socket_address*")), }) } diff --git a/crates/lunatic-networking-api/src/tcp.rs b/crates/lunatic-networking-api/src/tcp.rs index 5e83ee0b7..5e87da29d 100644 --- a/crates/lunatic-networking-api/src/tcp.rs +++ b/crates/lunatic-networking-api/src/tcp.rs @@ -10,7 +10,6 @@ use tokio::{ io::{AsyncReadExt, AsyncWriteExt}, net::{TcpListener, TcpStream}, }; -use wasmtime::Trap; use wasmtime::{Caller, Linker}; use lunatic_common_api::{get_memory, IntoTrap}; @@ -79,7 +78,7 @@ fn tcp_bind( flow_info: u32, scope_id: u32, id_u64_ptr: u32, -) -> Box> + Send + '_> { +) -> Box> + Send + '_> { Box::new(async move { let memory = get_memory(&mut caller)?; let socket_addr = socket_address( @@ -114,10 +113,7 @@ fn tcp_bind( // // Traps: // * If the TCP listener ID doesn't exist. -fn drop_tcp_listener( - mut caller: Caller, - tcp_listener_id: u64, -) -> Result<(), Trap> { +fn drop_tcp_listener(mut caller: Caller, tcp_listener_id: u64) -> Result<()> { caller .data_mut() .tcp_listener_resources_mut() @@ -140,7 +136,7 @@ fn tcp_local_addr( mut caller: Caller, tcp_listener_id: u64, id_u64_ptr: u32, -) -> Result { +) -> Result { let tcp_listener = caller .data() .tcp_listener_resources() @@ -183,7 +179,7 @@ fn tcp_accept( listener_id: u64, id_u64_ptr: u32, socket_addr_id_ptr: u32, -) -> Box> + Send + '_> { +) -> Box> + Send + '_> { Box::new(async move { let tcp_listener = caller .data() @@ -250,7 +246,7 @@ fn tcp_connect( scope_id: u32, timeout_duration: u64, id_u64_ptr: u32, -) -> Box> + Send + '_> { +) -> Box> + Send + '_> { Box::new(async move { let memory = get_memory(&mut caller)?; let socket_addr = socket_address( @@ -300,10 +296,7 @@ fn tcp_connect( // // Traps: // * If the DNS iterator ID doesn't exist. -fn drop_tcp_stream( - mut caller: Caller, - tcp_stream_id: u64, -) -> Result<(), Trap> { +fn drop_tcp_stream(mut caller: Caller, tcp_stream_id: u64) -> Result<()> { caller .data_mut() .tcp_stream_resources_mut() @@ -316,10 +309,7 @@ fn drop_tcp_stream( // // Traps: // * If the stream ID doesn't exist. -fn clone_tcp_stream( - mut caller: Caller, - tcp_stream_id: u64, -) -> Result { +fn clone_tcp_stream(mut caller: Caller, tcp_stream_id: u64) -> Result { let stream = caller .data() .tcp_stream_resources() @@ -346,7 +336,7 @@ fn tcp_write_vectored( ciovec_array_ptr: u32, ciovec_array_len: u32, opaque_ptr: u32, -) -> Box> + Send + '_> { +) -> Box> + Send + '_> { Box::new(async move { let memory = get_memory(&mut caller)?; let buffer = memory @@ -415,7 +405,7 @@ fn set_write_timeout( mut caller: Caller, stream_id: u64, duration: u64, -) -> Box> + Send + '_> { +) -> Box> + Send + '_> { Box::new(async move { let stream = caller .data_mut() @@ -444,7 +434,7 @@ fn set_write_timeout( fn get_write_timeout( caller: Caller, stream_id: u64, -) -> Box> + Send + '_> { +) -> Box> + Send + '_> { Box::new(async move { let stream = caller .data() @@ -469,7 +459,7 @@ pub fn set_read_timeout( mut caller: Caller, stream_id: u64, duration: u64, -) -> Box> + Send + '_> { +) -> Box> + Send + '_> { Box::new(async move { let stream = caller .data_mut() @@ -498,7 +488,7 @@ pub fn set_read_timeout( fn get_read_timeout( caller: Caller, stream_id: u64, -) -> Box> + Send + '_> { +) -> Box> + Send + '_> { Box::new(async move { let stream = caller .data() @@ -523,7 +513,7 @@ pub fn set_peek_timeout( mut caller: Caller, stream_id: u64, duration: u64, -) -> Box> + Send + '_> { +) -> Box> + Send + '_> { Box::new(async move { let stream = caller .data_mut() @@ -552,7 +542,7 @@ pub fn set_peek_timeout( fn get_peek_timeout( caller: Caller, stream_id: u64, -) -> Box> + Send + '_> { +) -> Box> + Send + '_> { Box::new(async move { let stream = caller .data() @@ -583,7 +573,7 @@ fn tcp_read( buffer_ptr: u32, buffer_len: u32, opaque_ptr: u32, -) -> Box> + Send + '_> { +) -> Box> + Send + '_> { Box::new(async move { let stream = caller .data() @@ -639,7 +629,7 @@ fn tcp_peek( buffer_ptr: u32, buffer_len: u32, opaque_ptr: u32, -) -> Box> + Send + '_> { +) -> Box> + Send + '_> { Box::new(async move { let stream = caller .data() @@ -691,7 +681,7 @@ fn tcp_flush( mut caller: Caller, stream_id: u64, error_id_ptr: u32, -) -> Box> + Send + '_> { +) -> Box> + Send + '_> { Box::new(async move { let stream = caller .data() diff --git a/crates/lunatic-networking-api/src/tls_tcp.rs b/crates/lunatic-networking-api/src/tls_tcp.rs index d9491e223..ed0229efb 100644 --- a/crates/lunatic-networking-api/src/tls_tcp.rs +++ b/crates/lunatic-networking-api/src/tls_tcp.rs @@ -10,7 +10,6 @@ use tokio::{ io::{AsyncReadExt, AsyncWriteExt}, net::{TcpListener, TcpStream}, }; -use wasmtime::Trap; use wasmtime::{Caller, Linker}; use lunatic_common_api::{get_memory, IntoTrap}; @@ -80,7 +79,7 @@ fn tls_local_addr( mut caller: Caller, tls_listener_id: u64, id_u64_ptr: u32, -) -> Result { +) -> Result { let tls_listener = caller .data() .tls_listener_resources() @@ -134,7 +133,7 @@ fn tls_bind( certs_array_len: u32, keys_array_ptr: u32, keys_array_len: u32, -) -> Box> + Send + '_> { +) -> Box> + Send + '_> { Box::new(async move { let memory = get_memory(&mut caller)?; let certs = memory @@ -191,10 +190,7 @@ fn tls_bind( // // Traps: // * If the TLS listener ID doesn't exist. -fn drop_tls_listener( - mut caller: Caller, - tls_listener_id: u64, -) -> Result<(), Trap> { +fn drop_tls_listener(mut caller: Caller, tls_listener_id: u64) -> Result<()> { caller .data_mut() .tls_listener_resources_mut() @@ -217,7 +213,7 @@ fn tls_accept( listener_id: u64, id_u64_ptr: u32, socket_addr_id_ptr: u32, -) -> Box> + Send + '_> { +) -> Box> + Send + '_> { Box::new(async move { let tls_listener = caller .data() @@ -328,7 +324,7 @@ fn tls_connect( id_u64_ptr: u32, certs_array_ptr: u32, certs_array_len: u32, -) -> Box> + Send + '_> { +) -> Box> + Send + '_> { Box::new(async move { let memory = get_memory(&mut caller)?; @@ -389,7 +385,7 @@ fn tls_connect( ta.name_constraints, )) }) - .filter_map(|r: Result| r.ok()); + .filter_map(|r: Result| r.ok()); root_cert_store.add_server_trust_anchors(trust_anchors); } else { root_cert_store.add_server_trust_anchors(webpki_roots::TLS_SERVER_ROOTS.0.iter().map( @@ -456,10 +452,7 @@ fn tls_connect( // // Traps: // * If the DNS iterator ID doesn't exist. -fn drop_tls_stream( - mut caller: Caller, - tls_stream_id: u64, -) -> Result<(), Trap> { +fn drop_tls_stream(mut caller: Caller, tls_stream_id: u64) -> Result<()> { caller .data_mut() .tls_stream_resources_mut() @@ -472,10 +465,7 @@ fn drop_tls_stream( // // Traps: // * If the stream ID doesn't exist. -fn clone_tls_stream( - mut caller: Caller, - tls_stream_id: u64, -) -> Result { +fn clone_tls_stream(mut caller: Caller, tls_stream_id: u64) -> Result { let stream = caller .data() .tls_stream_resources() @@ -502,7 +492,7 @@ fn tls_write_vectored( ciovec_array_ptr: u32, ciovec_array_len: u32, opaque_ptr: u32, -) -> Box> + Send + '_> { +) -> Box> + Send + '_> { Box::new(async move { let memory = get_memory(&mut caller)?; let buffer = memory @@ -577,7 +567,7 @@ fn set_tls_write_timeout( mut caller: Caller, stream_id: u64, duration: u64, -) -> Box> + Send + '_> { +) -> Box> + Send + '_> { Box::new(async move { let stream = caller .data_mut() @@ -606,7 +596,7 @@ fn set_tls_write_timeout( fn get_tls_write_timeout( caller: Caller, stream_id: u64, -) -> Box> + Send + '_> { +) -> Box> + Send + '_> { Box::new(async move { let stream = caller .data() @@ -631,7 +621,7 @@ pub fn set_tls_read_timeout( mut caller: Caller, stream_id: u64, duration: u64, -) -> Box> + Send + '_> { +) -> Box> + Send + '_> { Box::new(async move { let stream = caller .data_mut() @@ -660,7 +650,7 @@ pub fn set_tls_read_timeout( fn get_tls_read_timeout( caller: Caller, stream_id: u64, -) -> Box> + Send + '_> { +) -> Box> + Send + '_> { Box::new(async move { let stream = caller .data() @@ -691,7 +681,7 @@ fn tls_read( buffer_ptr: u32, buffer_len: u32, opaque_ptr: u32, -) -> Box> + Send + '_> { +) -> Box> + Send + '_> { Box::new(async move { let stream = caller .data() @@ -743,7 +733,7 @@ fn tls_flush( mut caller: Caller, stream_id: u64, error_id_ptr: u32, -) -> Box> + Send + '_> { +) -> Box> + Send + '_> { Box::new(async move { let stream = caller .data() diff --git a/crates/lunatic-networking-api/src/udp.rs b/crates/lunatic-networking-api/src/udp.rs index c7e58aa2f..c35579cc1 100644 --- a/crates/lunatic-networking-api/src/udp.rs +++ b/crates/lunatic-networking-api/src/udp.rs @@ -5,7 +5,6 @@ use std::time::Duration; use anyhow::Result; use tokio::net::UdpSocket; use tokio::time::timeout; -use wasmtime::Trap; use wasmtime::{Caller, Linker}; use crate::dns::DnsIterator; @@ -70,7 +69,7 @@ fn udp_bind( flow_info: u32, scope_id: u32, id_u64_ptr: u32, -) -> Box> + Send + '_> { +) -> Box> + Send + '_> { Box::new(async move { let memory = get_memory(&mut caller)?; let socket_addr = socket_address( @@ -108,10 +107,7 @@ fn udp_bind( // // Traps: // * If the UDP socket ID doesn't exist. -fn drop_udp_socket( - mut caller: Caller, - udp_socket_id: u64, -) -> Result<(), Trap> { +fn drop_udp_socket(mut caller: Caller, udp_socket_id: u64) -> Result<()> { caller .data_mut() .udp_resources_mut() @@ -136,7 +132,7 @@ fn udp_receive( buffer_ptr: u32, buffer_len: u32, opaque_ptr: u32, -) -> Box> + Send + '_> { +) -> Box> + Send + '_> { Box::new(async move { let memory = get_memory(&mut caller)?; let (memory_slice, state) = memory.data_and_store_mut(&mut caller); @@ -181,7 +177,7 @@ fn udp_receive_from( buffer_len: u32, opaque_ptr: u32, dns_iter_ptr: u32, -) -> Box> + Send + '_> { +) -> Box> + Send + '_> { Box::new(async move { let memory = get_memory(&mut caller)?; let (memory_slice, state) = memory.data_and_store_mut(&mut caller); @@ -250,7 +246,7 @@ fn udp_connect( scope_id: u32, timeout_duration: u64, id_u64_ptr: u32, -) -> Box> + Send + '_> { +) -> Box> + Send + '_> { Box::new(async move { // Get the memory and the socket being connected to let memory = get_memory(&mut caller)?; @@ -296,10 +292,7 @@ fn udp_connect( // // Traps: // * If the stream ID doesn't exist. -fn clone_udp_socket( - mut caller: Caller, - udp_socket_id: u64, -) -> Result { +fn clone_udp_socket(mut caller: Caller, udp_socket_id: u64) -> Result { let stream = caller .data() .udp_resources() @@ -319,7 +312,7 @@ fn set_udp_socket_broadcast( caller: Caller, udp_socket_id: u64, broadcast: u32, -) -> Result<(), Trap> { +) -> Result<()> { caller .data() .udp_resources() @@ -338,7 +331,7 @@ fn set_udp_socket_broadcast( fn get_udp_socket_broadcast( caller: Caller, udp_socket_id: u64, -) -> Result { +) -> Result { let socket = caller .data() .udp_resources() @@ -362,7 +355,7 @@ fn set_udp_socket_ttl( caller: Caller, udp_socket_id: u64, ttl: u32, -) -> Result<(), Trap> { +) -> Result<()> { caller .data() .udp_resources() @@ -378,10 +371,7 @@ fn set_udp_socket_ttl( // Traps: // * If the socket ID doesn't exist. // * If ttl() traps. -fn get_udp_socket_ttl( - caller: Caller, - udp_socket_id: u64, -) -> Result { +fn get_udp_socket_ttl(caller: Caller, udp_socket_id: u64) -> Result { let result = caller .data() .udp_resources() @@ -414,7 +404,7 @@ fn udp_send_to( flow_info: u32, scope_id: u32, opaque_ptr: u32, -) -> Box> + Send + '_> { +) -> Box> + Send + '_> { Box::new(async move { let memory = get_memory(&mut caller)?; let socket_addr = socket_address( @@ -469,7 +459,7 @@ fn udp_send( buffer_ptr: u32, buffer_len: u32, opaque_ptr: u32, -) -> Box> + Send + '_> { +) -> Box> + Send + '_> { Box::new(async move { let memory = get_memory(&mut caller)?; @@ -512,7 +502,7 @@ fn udp_local_addr( mut caller: Caller, udp_socket_id: u64, id_u64_ptr: u32, -) -> Result { +) -> Result { let udp_socket = caller .data() .udp_resources() diff --git a/crates/lunatic-process-api/Cargo.toml b/crates/lunatic-process-api/Cargo.toml index 1a51bb3bf..b19562c7a 100644 --- a/crates/lunatic-process-api/Cargo.toml +++ b/crates/lunatic-process-api/Cargo.toml @@ -21,3 +21,4 @@ anyhow = { workspace = true } metrics = { workspace = true, optional = true } tokio = { workspace = true, features = ["time"] } wasmtime = { workspace = true } +wasmtime-runtime = { workspace = true } diff --git a/crates/lunatic-process-api/src/lib.rs b/crates/lunatic-process-api/src/lib.rs index f48d681b4..34042fb6d 100644 --- a/crates/lunatic-process-api/src/lib.rs +++ b/crates/lunatic-process-api/src/lib.rs @@ -2,7 +2,7 @@ use std::{ convert::{TryFrom, TryInto}, future::Future, sync::Arc, - time::{Duration, Instant}, + time::{Duration, Instant}, io::Write }; use anyhow::{anyhow, Result}; @@ -19,7 +19,8 @@ use lunatic_process::{ DeathReason, Process, Signal, WasmProcess, }; use lunatic_wasi_api::LunaticWasiCtx; -use wasmtime::{Caller, Linker, ResourceLimiter, Trap, Val}; +use wasmtime::{Caller, Linker, ResourceLimiter, Val, WasmBacktrace}; +use wasmtime_runtime::{ Backtrace }; pub type ProcessResources = HashMapId>; pub type ModuleResources = HashMapId>>; @@ -39,6 +40,7 @@ pub trait ProcessCtx { fn module_resources(&self) -> &ModuleResources; fn module_resources_mut(&mut self) -> &mut ModuleResources; fn environment(&self) -> Arc; + fn traces(&mut self) -> &mut HashMapId; } // Register the process APIs to the linker @@ -166,7 +168,11 @@ where linker.func_wrap("lunatic::process", "link", link)?; linker.func_wrap("lunatic::process", "unlink", unlink)?; linker.func_wrap("lunatic::process", "kill", kill)?; - + linker.func_wrap("lunatic::process", "exists", exists)?; + linker.func_wrap("lunatic::process", "trace_get", trace_get)?; + linker.func_wrap("lunatic::process", "trace_get_size", trace_get_size)?; + linker.func_wrap("lunatic::process", "trace_read", trace_read)?; + linker.func_wrap("lunatic::process", "drop_trace", drop_trace)?; Ok(()) } @@ -184,7 +190,7 @@ fn compile_module( module_data_ptr: u32, module_data_len: u32, id_ptr: u32, -) -> Result +) -> Result where T: ProcessState + ProcessCtx + ErrorCtx, T::Config: ProcessConfigCtx, @@ -238,7 +244,7 @@ where fn drop_module>( mut caller: Caller, module_id: u64, -) -> Result<(), Trap> { +) -> Result<()> { #[cfg(feature = "metrics")] metrics::increment_counter!("lunatic.process.modules.dropped"); @@ -283,7 +289,7 @@ where fn drop_config>( mut caller: Caller, config_id: u64, -) -> Result<(), Trap> { +) -> Result<()> { caller .data_mut() .config_resources_mut() @@ -305,7 +311,7 @@ fn config_set_max_memory>( mut caller: Caller, config_id: u64, max_memory: u64, -) -> Result<(), Trap> { +) -> Result<()> { let max_memory = usize::try_from(max_memory) .or_trap("lunatic::process::config_set_max_memory: max_memory exceeds platform max")?; caller @@ -324,7 +330,7 @@ fn config_set_max_memory>( fn config_get_max_memory>( caller: Caller, config_id: u64, -) -> Result { +) -> Result { let max_memory = caller .data() .config_resources() @@ -344,7 +350,7 @@ fn config_set_max_fuel>( mut caller: Caller, config_id: u64, max_fuel: u64, -) -> Result<(), Trap> { +) -> Result<()> { let max_fuel = match max_fuel { 0 => None, max_fuel => Some(max_fuel), @@ -368,7 +374,7 @@ fn config_set_max_fuel>( fn config_get_max_fuel>( caller: Caller, config_id: u64, -) -> Result { +) -> Result { let max_fuel = caller .data() .config_resources() @@ -385,7 +391,7 @@ fn config_get_max_fuel>( // // Traps: // * If the config ID doesn't exist. -fn config_can_compile_modules(caller: Caller, config_id: u64) -> Result +fn config_can_compile_modules(caller: Caller, config_id: u64) -> Result where T: ProcessState + ProcessCtx, T::Config: ProcessConfigCtx, @@ -404,11 +410,7 @@ where // // Traps: // * If the config ID doesn't exist. -fn config_set_can_compile_modules( - mut caller: Caller, - config_id: u64, - can: u32, -) -> Result<(), Trap> +fn config_set_can_compile_modules(mut caller: Caller, config_id: u64, can: u32) -> Result<()> where T: ProcessState + ProcessCtx, T::Config: ProcessConfigCtx, @@ -427,7 +429,7 @@ where // // Traps: // * If the config ID doesn't exist. -fn config_can_create_configs(caller: Caller, config_id: u64) -> Result +fn config_can_create_configs(caller: Caller, config_id: u64) -> Result where T: ProcessState + ProcessCtx, T::Config: ProcessConfigCtx, @@ -446,11 +448,7 @@ where // // Traps: // * If the config ID doesn't exist. -fn config_set_can_create_configs( - mut caller: Caller, - config_id: u64, - can: u32, -) -> Result<(), Trap> +fn config_set_can_create_configs(mut caller: Caller, config_id: u64, can: u32) -> Result<()> where T: ProcessState + ProcessCtx, T::Config: ProcessConfigCtx, @@ -468,7 +466,7 @@ where // // Traps: // * If the config ID doesn't exist. -fn config_can_spawn_processes(caller: Caller, config_id: u64) -> Result +fn config_can_spawn_processes(caller: Caller, config_id: u64) -> Result where T: ProcessState + ProcessCtx, T::Config: ProcessConfigCtx, @@ -487,11 +485,7 @@ where // // Traps: // * If the config ID doesn't exist. -fn config_set_can_spawn_processes( - mut caller: Caller, - config_id: u64, - can: u32, -) -> Result<(), Trap> +fn config_set_can_spawn_processes(mut caller: Caller, config_id: u64, can: u32) -> Result<()> where T: ProcessState + ProcessCtx, T::Config: ProcessConfigCtx, @@ -542,7 +536,7 @@ fn spawn( params_ptr: u32, params_len: u32, id_ptr: u32, -) -> Box> + Send + '_> +) -> Box> + Send + '_> where T: ProcessState + ProcessCtx + ErrorCtx + LunaticWasiCtx + ResourceLimiter + Send + 'static, for<'a> &'a T: Send, @@ -550,13 +544,15 @@ where { Box::new(async move { if !caller.data().config().can_spawn_processes() { - return Err(anyhow!("Process doesn't have permissions to spawn sub-processes").into()); + return Err(anyhow!( + "Process doesn't have permissions to spawn sub-processes" + )); } let state = caller.data(); if !state.is_initialized() { - return Err(anyhow!("Cannot spawn process during module initialization").into()); + return Err(anyhow!("Cannot spawn process during module initialization")); } let config = match config_id { @@ -610,8 +606,7 @@ where return Err(anyhow!( "Params array must be in chunks of 17 bytes, but {} bytes remained", params_chunks.remainder().len() - ) - .into()); + )); } // Should processes be linked together? let link: Option<(Option, Arc)> = match link { @@ -716,7 +711,7 @@ fn link>( mut caller: Caller, tag: i64, process_id: u64, -) -> Result<(), Trap> { +) -> Result<()> { let tag = match tag { 0 => None, tag => Some(tag), @@ -756,10 +751,7 @@ fn link>( // // Traps: // * If the process ID doesn't exist. -fn unlink>( - mut caller: Caller, - process_id: u64, -) -> Result<(), Trap> { +fn unlink>(mut caller: Caller, process_id: u64) -> Result<()> { // Create handle to itself let this_process_id = caller.data().id(); @@ -787,10 +779,90 @@ fn unlink>( // // Traps: // * If the process ID doesn't exist. -fn kill>(caller: Caller, process_id: u64) -> Result<(), Trap> { +fn kill>(caller: Caller, process_id: u64) -> Result<()> { // Send kill signal to process if let Some(process) = caller.data().environment().get_process(process_id) { process.send(Signal::Kill); } Ok(()) } + +// Checks to see if a process exists +fn exists>(caller: Caller, process_id: u64) -> i32 { + caller + .data() + .environment() + .get_process(process_id) + .is_some() as i32 +} + +// Obtain a stack trace and store it as a String on the hashmap id +// +// Traps: +// * If we cannot obtain a stack trace +// * If the referenced memory is out of range +fn trace_get>(mut caller: Caller, ptr: u32) -> Result<()> { + + // let output = format!(" Stack Trace: {backtrace:?}"); + let output = "Not implemented.".to_string(); + + + let id = caller.data_mut().traces().add(output); + + let memory = get_memory(&mut caller)?; + + memory.write(&mut caller, ptr as usize, &id.to_le_bytes()) + .or_trap("lunatic::proces::trace_get::write_id")?; + + Ok(()) +} + +// Obtain a stack trace and return it's length +// +// Traps: +// * If the referenced string cannot be found +fn trace_get_size>(mut caller: Caller, id: u64) -> Result { + let result = caller.data_mut() + .traces() + .get(id) + .or_trap("lunatic::process::trace_get_size::get_trace_by_id")?; + + Ok(result.len() as u32) +} + +// Obtain a stack trace and return it's length +// +// Traps: +// * If the referenced string cannot be found +fn trace_read>(mut caller: Caller, id: u64, data_ptr: u32, data_len: u32) -> Result { + let memory = get_memory(&mut caller)?; + let string = caller + .data_mut() + .traces() + .get(id) + .or_trap("lunatic::process::trace_read::get_trace")? + .to_owned(); + let bytes = string.as_bytes(); + + let mut buffer = memory + .data_mut(&mut caller) + .get_mut(data_ptr as usize..(data_ptr as usize + data_len as usize)) + .or_trap("lunatic::process::trace_read::get_memory_slice")?; + + let written = buffer.write(bytes) + .or_trap("lunatic::process:trace_read::write_into_memory")?; + + Ok(written as u32) +} + +// Drop a stack trace +// +// Traps: +// * If the referenced trace cannot be found +fn drop_trace>(mut caller: Caller, id: u64) -> Result<()> { + caller.data_mut() + .traces() + .remove(id) + .or_trap("lunatic::process::drop_trace::remove_trace")?; + Ok(()) +} diff --git a/crates/lunatic-process/Cargo.toml b/crates/lunatic-process/Cargo.toml index 2c291e7e3..997221749 100644 --- a/crates/lunatic-process/Cargo.toml +++ b/crates/lunatic-process/Cargo.toml @@ -29,3 +29,4 @@ tokio = { workspace = true, features = [ "net", ] } wasmtime = { workspace = true } +wasmtime-wasi = { workspace = true } diff --git a/crates/lunatic-process/src/runtimes/wasmtime.rs b/crates/lunatic-process/src/runtimes/wasmtime.rs index d1365cac6..45d46e5c5 100644 --- a/crates/lunatic-process/src/runtimes/wasmtime.rs +++ b/crates/lunatic-process/src/runtimes/wasmtime.rs @@ -154,20 +154,9 @@ where Ok(()) => ResultValue::Ok, Err(err) => { // If the trap is a result of calling `proc_exit(0)`, treat it as an no-error finish. - match err.downcast_ref::() { - Some(trap) => { - if trap.i32_exit_status().is_some() - && trap.i32_exit_status().unwrap() == 0 - { - ResultValue::Ok - } else { - ResultValue::Failed(trap.to_string()) - } - } - None => ResultValue::Failed(format!( - "Can't downcast trap ({}) to wasmtime::Trap", - err - )), + match err.downcast_ref::() { + Some(wasmtime_wasi::I32Exit(0)) => ResultValue::Ok, + _ => ResultValue::Failed(err.to_string()), } } }, diff --git a/crates/lunatic-registry-api/src/lib.rs b/crates/lunatic-registry-api/src/lib.rs index c332c758a..9f5faa128 100644 --- a/crates/lunatic-registry-api/src/lib.rs +++ b/crates/lunatic-registry-api/src/lib.rs @@ -2,7 +2,6 @@ use anyhow::Result; use lunatic_common_api::{get_memory, IntoTrap}; use lunatic_process::state::ProcessState; use lunatic_process_api::ProcessCtx; -use wasmtime::Trap; use wasmtime::{Caller, Linker}; // Register the registry APIs to the linker @@ -50,7 +49,7 @@ fn put>( name_str_len: u32, node_id: u64, process_id: u64, -) -> Result<(), Trap> { +) -> Result<()> { let memory = get_memory(&mut caller)?; let (memory_slice, state) = memory.data_and_store_mut(&mut caller); let name = memory_slice @@ -80,7 +79,7 @@ fn get>( name_str_len: u32, node_id_ptr: u32, process_id_ptr: u32, -) -> Result { +) -> Result { let memory = get_memory(&mut caller)?; let (memory_slice, state) = memory.data_and_store_mut(&mut caller); let name = memory_slice @@ -119,7 +118,7 @@ fn remove>( mut caller: Caller, name_str_ptr: u32, name_str_len: u32, -) -> Result<(), Trap> { +) -> Result<()> { let memory = get_memory(&mut caller)?; let (memory_slice, state) = memory.data_and_store_mut(&mut caller); let name = memory_slice diff --git a/crates/lunatic-stdout-capture/Cargo.toml b/crates/lunatic-stdout-capture/Cargo.toml index 661d364b3..e5844b74f 100644 --- a/crates/lunatic-stdout-capture/Cargo.toml +++ b/crates/lunatic-stdout-capture/Cargo.toml @@ -8,5 +8,5 @@ repository = "https://github.com/lunatic-solutions/lunatic/tree/main/crates/luna license = "Apache-2.0/MIT" [dependencies] -wasi-common = "2" -wiggle = "2" +wasi-common = { workspace = true } +wiggle = { workspace = true } diff --git a/crates/lunatic-timer-api/src/lib.rs b/crates/lunatic-timer-api/src/lib.rs index 219af6056..b43795fa5 100644 --- a/crates/lunatic-timer-api/src/lib.rs +++ b/crates/lunatic-timer-api/src/lib.rs @@ -11,7 +11,7 @@ use lunatic_common_api::IntoTrap; use lunatic_process::{state::ProcessState, Signal}; use lunatic_process_api::ProcessCtx; use tokio::task::JoinHandle; -use wasmtime::{Caller, Linker, Trap}; +use wasmtime::{Caller, Linker}; #[derive(Debug)] struct HeapValue { @@ -129,7 +129,7 @@ fn send_after + TimerCtx>( mut caller: Caller, process_id: u64, delay: u64, -) -> Result { +) -> Result { let message = caller .data_mut() .message_scratch_area() @@ -175,7 +175,7 @@ fn send_after + TimerCtx>( fn cancel_timer( mut caller: Caller, timer_id: u64, -) -> Box> + Send + '_> { +) -> Box> + Send + '_> { Box::new(async move { let timer_handle = caller.data_mut().timer_resources_mut().remove(timer_id); match timer_handle { diff --git a/crates/lunatic-wasi-api/src/lib.rs b/crates/lunatic-wasi-api/src/lib.rs index d48e138a2..e984a1985 100644 --- a/crates/lunatic-wasi-api/src/lib.rs +++ b/crates/lunatic-wasi-api/src/lib.rs @@ -2,7 +2,7 @@ use anyhow::Result; use lunatic_common_api::{get_memory, IntoTrap}; use lunatic_process::state::ProcessState; use lunatic_stdout_capture::StdoutCapture; -use wasmtime::{Caller, Linker, Trap}; +use wasmtime::{Caller, Linker}; use wasmtime_wasi::{ambient_authority, Dir, WasiCtx, WasiCtxBuilder}; /// Create a `WasiCtx` from configuration settings. @@ -81,7 +81,7 @@ fn add_environment_variable( key_len: u32, value_ptr: u32, value_len: u32, -) -> Result<(), Trap> +) -> Result<()> where T: ProcessState, T::Config: LunaticWasiConfigCtx, @@ -122,7 +122,7 @@ fn add_command_line_argument( config_id: u64, argument_ptr: u32, argument_len: u32, -) -> Result<(), Trap> +) -> Result<()> where T: ProcessState, T::Config: LunaticWasiConfigCtx, @@ -151,12 +151,7 @@ where // * If the config ID doesn't exist. // * If the directory string is not a valid utf8 string. // * If any of the memory slices falls outside the memory. -fn preopen_dir( - mut caller: Caller, - config_id: u64, - dir_ptr: u32, - dir_len: u32, -) -> Result<(), Trap> +fn preopen_dir(mut caller: Caller, config_id: u64, dir_ptr: u32, dir_len: u32) -> Result<()> where T: ProcessState, T::Config: LunaticWasiConfigCtx, diff --git a/src/cargo_lunatic.rs b/src/cargo_lunatic.rs new file mode 100644 index 000000000..3f3ea3d69 --- /dev/null +++ b/src/cargo_lunatic.rs @@ -0,0 +1,17 @@ +use std::{ + env::{args_os, set_var}, + process::{exit, Command}, +}; + +fn main() { + set_var("CARGO_BUILD_TARGET", "wasm32-wasi"); + set_var("CARGO_TARGET_WASM32_WASI_RUNNER", "lunatic"); + exit( + Command::new("cargo") + .args(args_os().skip(2)) + .status() + .unwrap() + .code() + .unwrap(), + ); +} diff --git a/src/mode/execution.rs b/src/mode/execution.rs index 6ada8c693..f6f41018d 100644 --- a/src/mode/execution.rs +++ b/src/mode/execution.rs @@ -79,7 +79,7 @@ struct Args { long, value_name = "PROMETHEUS_HTTP_ADDRESS", requires = "prometheus", - default_value_t = "0.0.0.0:9927" + default_value_t = String::from("0.0.0.0:9927") )] prometheus_http: String, } @@ -172,13 +172,13 @@ pub(crate) async fn execute() -> Result<()> { }; #[cfg(feature = "prometheus")] - if args.is_present("prometheus") { + if args.prometheus { let builder = metrics_exporter_prometheus::PrometheusBuilder::new(); - let builder = if let Some(addr) = args.value_of("prometheus_http") { - builder.with_http_listener(addr.parse::().unwrap()) - } else { - builder - }; + let builder = builder.with_http_listener( + args.prometheus_http + .parse::() + .unwrap(), + ); let builder = if let Some(node_id) = node_id { builder.add_global_label("node_id", node_id.to_string()) diff --git a/src/state.rs b/src/state.rs index ba796956f..36106d696 100644 --- a/src/state.rs +++ b/src/state.rs @@ -61,6 +61,7 @@ pub struct DefaultProcessState { initialized: bool, // Shared process registry registry: Arc>, + // stored stack traces } impl DefaultProcessState { @@ -174,6 +175,8 @@ impl ProcessState for DefaultProcessState { lunatic_wasi_api::register(linker)?; lunatic_registry_api::register(linker)?; lunatic_distributed_api::register(linker)?; + #[cfg(feature = "metrics")] + lunatic_metrics_api::register(linker)?; Ok(()) } @@ -290,6 +293,10 @@ impl ProcessCtx for DefaultProcessState { fn environment(&self) -> Arc { self.environment.clone() } + + fn traces(&mut self) -> &mut HashMapId { + &mut self.resources.traces + } } impl NetworkingCtx for DefaultProcessState { @@ -394,6 +401,7 @@ pub(crate) struct Resources { pub(crate) tls_streams: HashMapId>, pub(crate) udp_sockets: HashMapId>, pub(crate) errors: HashMapId, + pub(crate) traces: HashMapId, } impl DistributedCtx for DefaultProcessState { diff --git a/wat/all_imports.wat b/wat/all_imports.wat index 0c23a50fe..637c647ca 100644 --- a/wat/all_imports.wat +++ b/wat/all_imports.wat @@ -76,6 +76,7 @@ (import "lunatic::process" "link" (func (param i64 i64))) (import "lunatic::process" "unlink" (func (param i64))) (import "lunatic::process" "kill" (func (param i64))) + (import "lunatic::process" "exists" (func (param i64) (result i32))) (import "lunatic::version" "major" (func (result i32))) (import "lunatic::version" "minor" (func (result i32))) @@ -97,5 +98,12 @@ (import "lunatic::distributed" "send" (func (param i64 i64) (result i32))) (import "lunatic::distributed" "send_receive_skip_search" (func (param i64 i64 i64) (result i32))) + (import "lunatic::metrics" "counter" (func (param i32 i32 i64))) + (import "lunatic::metrics" "increment_counter" (func (param i32 i32))) + (import "lunatic::metrics" "gauge" (func (param i32 i32 f64))) + (import "lunatic::metrics" "increment_gauge" (func (param i32 i32 f64))) + (import "lunatic::metrics" "decrement_gauge" (func (param i32 i32 f64))) + (import "lunatic::metrics" "histogram" (func (param i32 i32 f64))) + (func (export "hello") nop) ) \ No newline at end of file