diff --git a/Cargo.lock b/Cargo.lock index 739849c..ed81ae6 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -35,6 +35,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" dependencies = [ "cfg-if", + "getrandom 0.2.15", "once_cell", "version_check", "zerocopy 0.7.35", @@ -195,6 +196,19 @@ dependencies = [ "pin-project-lite", ] +[[package]] +name = "async-compat" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7bab94bde396a3f7b4962e396fdad640e241ed797d4d8d77fc8c237d14c58fc0" +dependencies = [ + "futures-core", + "futures-io", + "once_cell", + "pin-project-lite", + "tokio", +] + [[package]] name = "async-recursion" version = "1.1.1" @@ -217,6 +231,17 @@ dependencies = [ "syn 2.0.98", ] +[[package]] +name = "async_io_stream" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6d7b9decdf35d8908a7e3ef02f64c5e9b1695e230154c0e8de3969142d9b94c" +dependencies = [ + "futures", + "pharos", + "rustc_version", +] + [[package]] name = "atomic-waker" version = "1.1.2" @@ -242,13 +267,13 @@ checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" [[package]] name = "axum" -version = "0.7.9" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edca88bc138befd0323b20752846e6587272d3b03b0343c8ea28a6f819e6e71f" +checksum = "021e862c184ae977658b36c4500f7feac3221ca5da43e3f25bd04ab6c79a29b5" dependencies = [ - "async-trait", "axum-core", "bytes", + "form_urlencoded", "futures-util", "http 1.2.0", "http-body", @@ -276,13 +301,12 @@ dependencies = [ [[package]] name = "axum-core" -version = "0.4.5" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09f2bd6146b97ae3359fa0cc6d6b376d9539582c7b4220f041a33ec24c226199" +checksum = "68464cd0412f486726fb3373129ef5d2993f90c34bc2bc1c1e9943b2f4fc7ca6" dependencies = [ - "async-trait", "bytes", - "futures-util", + "futures-core", "http 1.2.0", "http-body", "http-body-util", @@ -323,14 +347,14 @@ dependencies = [ [[package]] name = "bao-tree" -version = "0.13.0" +version = "0.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1f7a89a8ee5889d2593ae422ce6e1bb03e48a0e8a16e4fa0882dfcbe7e182ef" +checksum = "ff16d65e48353db458be63ee395c03028f24564fd48668389bd65fd945f5ac36" dependencies = [ + "blake3", "bytes", "futures-lite", "genawaiter", - "iroh-blake3", "iroh-io", "positioned-io", "range-collections", @@ -344,6 +368,12 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4c7f02d4ea65f2c1853089ffd8d2787bdbc63de2f0d29dedbcf8ccdfa0ccd4cf" +[[package]] +name = "base32" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "022dfe9eb35f19ebbcb51e0b40a5ab759f46ad60cadf7297e0bd085afb50e076" + [[package]] name = "base64" version = "0.22.1" @@ -389,6 +419,19 @@ version = "2.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8f68f53c83ab957f72c32642f3868eec03eb974d1fb82e453128456482613d36" +[[package]] +name = "blake3" +version = "1.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3888aaa89e4b2a40fca9848e400f6a658a5a3978de7be858e209cafa8be9a4a0" +dependencies = [ + "arrayref", + "arrayvec", + "cc", + "cfg-if", + "constant_time_eq", +] + [[package]] name = "block-buffer" version = "0.10.4" @@ -686,6 +729,12 @@ version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "19d374276b40fb8bbdee95aef7c7fa6b5316ec764510eb64b8dd0e2ed0d7e7f5" +[[package]] +name = "critical-section" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "790eea4361631c5e7d22598ecd5723ff611904e3344ce8720784c93e3d83d40b" + [[package]] name = "crossbeam-channel" version = "0.5.15" @@ -965,10 +1014,10 @@ dependencies = [ ] [[package]] -name = "dtoa" -version = "1.0.9" +name = "dyn-clone" +version = "1.0.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dcbb2bf8e87535c23f7a8a321e364ce21462d0ff10cb6407820e8e96dfff6653" +checksum = "1c7a8fb8a9fbf66c1f703fe16184d10ca0ee9d23be5b4436400408ba54a95005" [[package]] name = "ecdsa" @@ -1085,21 +1134,6 @@ version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" -[[package]] -name = "erased-serde" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c138974f9d5e7fe373eb04df7cae98833802ae4b11c24ac7039a21d5af4b26c" -dependencies = [ - "serde", -] - -[[package]] -name = "erased_set" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a02a5d186d7bf1cb21f1f95e1a9cfa5c1f2dcd803a47aad454423ceec13525c5" - [[package]] name = "errno" version = "0.3.10" @@ -1215,14 +1249,15 @@ dependencies = [ [[package]] name = "futures-buffered" -version = "0.2.9" +version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34acda8ae8b63fbe0b2195c998b180cff89a8212fb2622a78b572a9f1c6f7684" +checksum = "fe940397c8b744b9c2c974791c2c08bca2c3242ce0290393249e98f215a00472" dependencies = [ "cordyceps", "diatomic-waker", "futures-core", "pin-project-lite", + "spin", ] [[package]] @@ -1416,14 +1451,16 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.3.1" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43a49c392881ce6d5c3b8cb70f98717b7c07aabbdff06687b9030dbfbe2725f8" +checksum = "26145e563e54f2cadc477553f1ec5ee650b00862f0a58bcd12cbdc5f0ea2d2f4" dependencies = [ "cfg-if", + "js-sys", "libc", - "wasi 0.13.3+wasi-0.2.2", - "windows-targets 0.52.6", + "r-efi", + "wasi 0.14.2+wasi-0.2.4", + "wasm-bindgen", ] [[package]] @@ -1452,23 +1489,25 @@ dependencies = [ [[package]] name = "governor" -version = "0.7.0" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0746aa765db78b521451ef74221663b57ba595bf83f75d0ce23cc09447c8139f" +checksum = "be93b4ec2e4710b04d9264c0c7350cdd62a8c20e5e4ac732552ebb8f0debe8eb" dependencies = [ "cfg-if", "dashmap", "futures-sink", "futures-timer", "futures-util", + "getrandom 0.3.3", "no-std-compat", "nonzero_ext", "parking_lot", "portable-atomic", "quanta", - "rand 0.8.5", + "rand 0.9.0", "smallvec", "spinning_top", + "web-time", ] [[package]] @@ -1550,13 +1589,14 @@ checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" [[package]] name = "hickory-proto" -version = "0.25.0-alpha.5" +version = "0.25.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d00147af6310f4392a31680db52a3ed45a2e0f68eb18e8c3fe5537ecc96d9e2" +checksum = "6d844af74f7b799e41c78221be863bade11c430d46042c3b49ca8ae0c6d27287" dependencies = [ "async-recursion", "async-trait", "cfg-if", + "critical-section", "data-encoding", "enum-as-inner", "futures-channel", @@ -1566,6 +1606,7 @@ dependencies = [ "ipnet", "once_cell", "rand 0.9.0", + "ring", "thiserror 2.0.11", "tinyvec", "tokio", @@ -1575,9 +1616,9 @@ dependencies = [ [[package]] name = "hickory-resolver" -version = "0.25.0-alpha.5" +version = "0.25.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5762f69ebdbd4ddb2e975cd24690bf21fe6b2604039189c26acddbc427f12887" +checksum = "a128410b38d6f931fcc6ca5c107a3b02cabd6c05967841269a4ad65d23c44331" dependencies = [ "cfg-if", "futures-util", @@ -1734,9 +1775,9 @@ dependencies = [ [[package]] name = "hyper-util" -version = "0.1.10" +version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df2dcfbe0677734ab2f3ffa7fa7bfd4706bfdc1ef393f2ee30184aed67e631b4" +checksum = "497bbc33a26fdd4af9ed9c70d63f61cf56a938375fbb32df34db9b1cd6d643f2" dependencies = [ "bytes", "futures-channel", @@ -1744,6 +1785,7 @@ dependencies = [ "http 1.2.0", "http-body", "hyper", + "libc", "pin-project-lite", "socket2", "tokio", @@ -1915,9 +1957,9 @@ dependencies = [ [[package]] name = "igd-next" -version = "0.15.1" +version = "0.16.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76b0d7d4541def58a37bf8efc559683f21edce7c82f0d866c93ac21f7e098f93" +checksum = "d06464e726471718db9ad3fefc020529fabcde03313a0fc3967510e2db5add12" dependencies = [ "async-trait", "attohttpc", @@ -1928,7 +1970,7 @@ dependencies = [ "hyper", "hyper-util", "log", - "rand 0.8.5", + "rand 0.9.0", "tokio", "url", "xmltree", @@ -2008,9 +2050,9 @@ checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" [[package]] name = "iroh" -version = "0.34.0" +version = "0.35.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b7224d4eeec6c8b5b1a9b2347a4dff3588834a7fb17233044bff3e90e7b293d" +checksum = "6ca758f4ce39ae3f07de922be6c73de6a48a07f39554e78b5745585652ce38f5" dependencies = [ "aead", "anyhow", @@ -2025,21 +2067,22 @@ dependencies = [ "der", "derive_more", "ed25519-dalek", + "futures-buffered", "futures-util", + "getrandom 0.3.3", "hickory-resolver", "http 1.2.0", "igd-next", "instant", "iroh-base", "iroh-metrics", - "iroh-net-report", "iroh-quinn", "iroh-quinn-proto", "iroh-quinn-udp", "iroh-relay", "n0-future", "netdev", - "netwatch 0.4.0", + "netwatch", "pin-project", "pkarr", "portmapper", @@ -2051,8 +2094,10 @@ dependencies = [ "rustls-webpki", "serde", "smallvec", + "spki", "strum", "stun-rs", + "surge-ping", "thiserror 2.0.11", "time", "tokio", @@ -2068,9 +2113,9 @@ dependencies = [ [[package]] name = "iroh-base" -version = "0.34.0" +version = "0.35.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02bf2374c0f1d01cde6e60de7505e42a604acda1a1bb3f7be19806e466055517" +checksum = "f91ac4aaab68153d726c4e6b39c30f9f9253743f0e25664e52f4caeb46f48d11" dependencies = [ "curve25519-dalek", "data-encoding", @@ -2098,13 +2143,14 @@ dependencies = [ [[package]] name = "iroh-blobs" -version = "0.34.0" +version = "0.35.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8d7a6872c7ec4a2613d0386b4dc19b5f3cf4822d81361c5136a63fd56ba2372" +checksum = "817b785193b73c34ef1f2dcb5ddf8729ecef9b72a8fc0e706ee6d7a9bf8766a6" dependencies = [ "anyhow", "async-channel", "bao-tree", + "blake3", "bytes", "chrono", "data-encoding", @@ -2117,10 +2163,9 @@ dependencies = [ "hex", "iroh", "iroh-base", - "iroh-blake3", "iroh-io", "iroh-metrics", - "nested_enum_utils", + "nested_enum_utils 0.1.0", "num_cpus", "oneshot", "parking_lot", @@ -2174,7 +2219,7 @@ dependencies = [ "iroh-gossip", "iroh-io", "iroh-metrics", - "nested_enum_utils", + "nested_enum_utils 0.1.0", "num_enum", "parking_lot", "portable-atomic", @@ -2207,9 +2252,9 @@ dependencies = [ [[package]] name = "iroh-gossip" -version = "0.34.0" +version = "0.35.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46f02f4ab55d5f52a16253ad9d95fd6e89c1b1046a0f99a1afb14833f9b6e1a5" +checksum = "3ca43045ceb44b913369f417d56323fb1628ebf482ab4c1e9360e81f1b58cbc2" dependencies = [ "anyhow", "async-channel", @@ -2238,9 +2283,9 @@ dependencies = [ [[package]] name = "iroh-io" -version = "0.6.1" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17e302c5ad649c6a7aa9ae8468e1c4dc2469321af0c6de7341c1be1bdaab434b" +checksum = "e0a5feb781017b983ff1b155cd1faf8174da2acafd807aa482876da2d7e6577a" dependencies = [ "bytes", "futures-lite", @@ -2251,50 +2296,32 @@ dependencies = [ [[package]] name = "iroh-metrics" -version = "0.32.0" +version = "0.34.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0f7cd1ffe3b152a5f4f4c1880e01e07d96001f20e02cc143cb7842987c616b3" +checksum = "f70466f14caff7420a14373676947e25e2917af6a5b1bec45825beb2bf1eb6a7" dependencies = [ - "erased_set", "http-body-util", "hyper", "hyper-util", - "prometheus-client", + "iroh-metrics-derive", + "itoa", "reqwest", "serde", - "struct_iterable", - "thiserror 2.0.11", + "snafu", "tokio", "tracing", ] [[package]] -name = "iroh-net-report" -version = "0.34.0" +name = "iroh-metrics-derive" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "63407d73331e8e38980be7e39b1db8e173fc28545b3ea0c48c9a718f95877b8e" +checksum = "8d12f5c45c4ed2436302a4e03cad9a0ad34b2962ad0c5791e1019c0ee30eeb09" dependencies = [ - "anyhow", - "bytes", - "cfg_aliases", - "derive_more", - "hickory-resolver", - "iroh-base", - "iroh-metrics", - "iroh-quinn", - "iroh-relay", - "n0-future", - "netwatch 0.4.0", - "portmapper", - "rand 0.8.5", - "reqwest", - "rustls", - "surge-ping", - "thiserror 2.0.11", - "tokio", - "tokio-util", - "tracing", - "url", + "heck", + "proc-macro2", + "quote", + "syn 2.0.98", ] [[package]] @@ -2354,10 +2381,11 @@ dependencies = [ [[package]] name = "iroh-relay" -version = "0.34.0" +version = "0.35.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21d282c04a71a83a90b8fe6872ba30ae341853255aa908375a3e6181f7215d7b" +checksum = "c63f122cdfaa4b4e0e7d6d3921d2b878f42a0c6d3ee5a29456dc3f5ab5ec931f" dependencies = [ + "ahash", "anyhow", "bytes", "cfg_aliases", @@ -2365,6 +2393,7 @@ dependencies = [ "dashmap", "data-encoding", "derive_more", + "getrandom 0.3.3", "governor", "hickory-proto", "hickory-resolver", @@ -2376,7 +2405,7 @@ dependencies = [ "iroh-metrics", "iroh-quinn", "iroh-quinn-proto", - "lru", + "lru 0.12.5", "n0-future", "num_enum", "pin-project", @@ -2393,6 +2422,8 @@ dependencies = [ "rustls-pemfile", "rustls-webpki", "serde", + "sha1", + "simdutf8", "strum", "stun-rs", "thiserror 2.0.11", @@ -2400,14 +2431,14 @@ dependencies = [ "tokio", "tokio-rustls", "tokio-rustls-acme", - "tokio-tungstenite", - "tokio-tungstenite-wasm", "tokio-util", + "tokio-websockets", "toml", "tracing", "tracing-subscriber", "url", "webpki-roots", + "ws_stream_wasm", "z32", ] @@ -2466,9 +2497,9 @@ dependencies = [ [[package]] name = "libc" -version = "0.2.169" +version = "0.2.172" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5aba8db14291edd000dfcc4d620c7ebfb122c613afb886ca8803fa4e128a20a" +checksum = "d750af042f7ef4f724306de029d18836c26c1765a54a6a3f094cbd23a7267ffa" [[package]] name = "libm" @@ -2555,6 +2586,12 @@ dependencies = [ "hashbrown 0.15.2", ] +[[package]] +name = "lru" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "227748d55f2f0ab4735d87fd623798cb6b664512fe979705f829c9f81c934465" + [[package]] name = "match_cfg" version = "0.1.0" @@ -2572,9 +2609,9 @@ dependencies = [ [[package]] name = "matchit" -version = "0.7.3" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e7465ac9959cc2b1404e8e2367b43684a6d13790fe23056cc8c6c5a6b7bcb94" +checksum = "47e1ffaa40ddd1f3ed91f717a33c8c0ee23fff369e3aa8772b9605cc1d22f4c3" [[package]] name = "md5" @@ -2641,9 +2678,9 @@ dependencies = [ [[package]] name = "n0-future" -version = "0.1.2" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "399e11dc3b0e8d9d65b27170d22f5d779d52d9bed888db70d7e0c2c7ce3dfc52" +checksum = "7bb0e5d99e681ab3c938842b96fcb41bf8a7bb4bfdb11ccbd653a7e83e06c794" dependencies = [ "cfg_aliases", "derive_more", @@ -2681,6 +2718,18 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "nested_enum_utils" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43fa9161ed44d30e9702fe42bd78693bceac0fed02f647da749f36109023d3a3" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote", + "syn 1.0.109", +] + [[package]] name = "netdev" version = "0.31.0" @@ -2725,11 +2774,12 @@ dependencies = [ [[package]] name = "netlink-packet-route" -version = "0.19.0" +version = "0.23.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74c171cd77b4ee8c7708da746ce392440cb7bcf618d122ec9ecc607b12938bf4" +checksum = "0800eae8638a299eaa67476e1c6b6692922273e0f7939fd188fc861c837b9cd2" dependencies = [ "anyhow", + "bitflags 2.8.0", "byteorder", "libc", "log", @@ -2778,42 +2828,9 @@ dependencies = [ [[package]] name = "netwatch" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64da82edf903649e6cb6a77b5a6f7fe01387d8865065d411d139018510880302" -dependencies = [ - "anyhow", - "atomic-waker", - "bytes", - "derive_more", - "futures-lite", - "futures-sink", - "futures-util", - "iroh-quinn-udp", - "libc", - "netdev", - "netlink-packet-core", - "netlink-packet-route 0.19.0", - "netlink-sys", - "once_cell", - "rtnetlink 0.13.1", - "rtnetlink 0.14.1", - "serde", - "socket2", - "thiserror 2.0.11", - "time", - "tokio", - "tokio-util", - "tracing", - "windows 0.58.0", - "wmi", -] - -[[package]] -name = "netwatch" -version = "0.4.0" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b7879c2cfdf30d92f2be89efa3169b3d78107e3ab7f7b9a37157782569314e1" +checksum = "67eeaa5f7505c93c5a9b35ba84fd21fb8aa3f24678c76acfe8716af7862fb07a" dependencies = [ "atomic-waker", "bytes", @@ -2823,15 +2840,15 @@ dependencies = [ "js-sys", "libc", "n0-future", + "nested_enum_utils 0.2.2", "netdev", "netlink-packet-core", - "netlink-packet-route 0.19.0", + "netlink-packet-route 0.23.0", + "netlink-proto", "netlink-sys", - "rtnetlink 0.13.1", - "rtnetlink 0.14.1", "serde", + "snafu", "socket2", - "thiserror 2.0.11", "time", "tokio", "tokio-util", @@ -2842,28 +2859,6 @@ dependencies = [ "wmi", ] -[[package]] -name = "nix" -version = "0.26.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "598beaf3cc6fdd9a5dfb1630c2800c7acd31df7aaf0f565796fba2b53ca1af1b" -dependencies = [ - "bitflags 1.3.2", - "cfg-if", - "libc", -] - -[[package]] -name = "nix" -version = "0.27.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2eb04e9c688eff1c89d72b407f168cf79bb9e867a9d3323ed6c01519eb9cc053" -dependencies = [ - "bitflags 2.8.0", - "cfg-if", - "libc", -] - [[package]] name = "no-std-compat" version = "0.4.1" @@ -2901,6 +2896,21 @@ dependencies = [ "winapi", ] +[[package]] +name = "ntimestamp" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c50f94c405726d3e0095e89e72f75ce7f6587b94a8bd8dc8054b73f65c0fd68c" +dependencies = [ + "base32", + "document-features", + "getrandom 0.2.15", + "httpdate", + "js-sys", + "once_cell", + "serde", +] + [[package]] name = "nu-ansi-term" version = "0.46.0" @@ -3034,6 +3044,10 @@ name = "once_cell" version = "1.20.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "945462a4b81e43c4e3ba96bd7b49d834c6f61198356aa858733bc4acf3cbe62e" +dependencies = [ + "critical-section", + "portable-atomic", +] [[package]] name = "oneshot" @@ -3208,6 +3222,16 @@ dependencies = [ "sha2", ] +[[package]] +name = "pharos" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e9567389417feee6ce15dd6527a8a1ecac205ef62c2932bcf3d9f6fc5b78b414" +dependencies = [ + "futures", + "rustc_version", +] + [[package]] name = "pin-project" version = "1.1.9" @@ -3242,26 +3266,33 @@ checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" [[package]] name = "pkarr" -version = "2.3.1" +version = "3.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92eff194c72f00f3076855b413ad2d940e3a6e307fa697e5c7733e738341aed4" +checksum = "e32222ae3d617bf92414db29085f8a959a4515effce916e038e9399a335a0d6d" dependencies = [ + "async-compat", + "base32", "bytes", + "cfg_aliases", "document-features", + "dyn-clone", "ed25519-dalek", - "flume", - "futures", - "js-sys", - "lru", + "futures-buffered", + "futures-lite", + "getrandom 0.2.15", + "log", + "lru 0.13.0", + "ntimestamp", + "reqwest", "self_cell", + "serde", + "sha1_smol", "simple-dns", "thiserror 2.0.11", + "tokio", "tracing", - "ureq", - "wasm-bindgen", + "url", "wasm-bindgen-futures", - "web-sys", - "z32", ] [[package]] @@ -3346,28 +3377,31 @@ checksum = "280dc24453071f1b63954171985a0b0d30058d287960968b9b2aca264c8d4ee6" [[package]] name = "portmapper" -version = "0.4.0" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b715da165f399be093fecb2ca774b00713a3b32f6b27e0752fbf255e3be622af" +checksum = "7d6db66007eac4a0ec8331d0d20c734bd64f6445d64bbaf0d0a27fea7a054e36" dependencies = [ "base64", "bytes", "derive_more", "futures-lite", "futures-util", + "hyper-util", "igd-next", "iroh-metrics", "libc", - "netwatch 0.3.0", + "nested_enum_utils 0.2.2", + "netwatch", "num_enum", "rand 0.8.5", "serde", "smallvec", + "snafu", "socket2", - "thiserror 2.0.11", "time", "tokio", "tokio-util", + "tower-layer", "tracing", "url", ] @@ -3423,9 +3457,9 @@ dependencies = [ [[package]] name = "precis-core" -version = "0.1.10" +version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25a414cabc93f5f45d53463e73b3d89d3c5c0dc4a34dbf6901f0c6358f017203" +checksum = "9c2e7b31f132e0c6f8682cfb7bf4a5340dbe925b7986618d0826a56dfe0c8e56" dependencies = [ "precis-tools", "ucd-parse", @@ -3434,9 +3468,9 @@ dependencies = [ [[package]] name = "precis-profiles" -version = "0.1.11" +version = "0.1.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f58e2841ef58164e2626464d4fde67fa301d5e2c78a10300c1756312a03b169f" +checksum = "dc4f67f78f50388f03494794766ba824a704db16fb5d400fe8d545fa7bc0d3f1" dependencies = [ "lazy_static", "precis-core", @@ -3446,9 +3480,9 @@ dependencies = [ [[package]] name = "precis-tools" -version = "0.1.8" +version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "016da884bc4c2c4670211641abef402d15fa2b06c6e9088ff270dac93675aee2" +checksum = "6cc1eb2d5887ac7bfd2c0b745764db89edb84b856e4214e204ef48ef96d10c4a" dependencies = [ "lazy_static", "regex", @@ -3514,29 +3548,6 @@ dependencies = [ "unicode-ident", ] -[[package]] -name = "prometheus-client" -version = "0.22.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "504ee9ff529add891127c4827eb481bd69dc0ebc72e9a682e187db4caa60c3ca" -dependencies = [ - "dtoa", - "itoa", - "parking_lot", - "prometheus-client-derive-encode", -] - -[[package]] -name = "prometheus-client-derive-encode" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "440f724eba9f6996b75d63681b0a92b06947f1457076d503a4d2e2c8f56442b8" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.98", -] - [[package]] name = "proptest" version = "1.6.0" @@ -3574,9 +3585,9 @@ dependencies = [ [[package]] name = "quic-rpc" -version = "0.19.0" +version = "0.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89561e5343bcad1c9f84321d9d9bd1619128ad44293faad55a0001b0e52d312b" +checksum = "18bad98bd048264ceb1361ff9d77a031535d8c1e3fe8f12c6966ec825bf68eb7" dependencies = [ "anyhow", "document-features", @@ -3596,9 +3607,9 @@ dependencies = [ [[package]] name = "quic-rpc-derive" -version = "0.19.0" +version = "0.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a99f334af6f23b3de91f6df9ac17237e8b533b676f596c69dcb3b58c3cf8dea" +checksum = "abf13f1bced5f2f2642d9d89a29d75f2d81ab34c4acfcb434c209d6094b9b2b7" dependencies = [ "proc-macro2", "quic-rpc", @@ -3683,6 +3694,12 @@ dependencies = [ "pest_derive", ] +[[package]] +name = "r-efi" +version = "5.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74765f6d916ee2faa39bc8e68e4f3ed8949b48cccdac59983d287a7cb71ce9c5" + [[package]] name = "rand" version = "0.8.5" @@ -3740,7 +3757,7 @@ version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b08f3c9802962f7e1b25113931d94f43ed9725bebc59db9d0c3e9a23b67e15ff" dependencies = [ - "getrandom 0.3.1", + "getrandom 0.3.3", "zerocopy 0.8.18", ] @@ -3926,9 +3943,9 @@ dependencies = [ [[package]] name = "reqwest" -version = "0.12.12" +version = "0.12.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43e734407157c3c2034e0258f5e4473ddb361b1e85f95a66690d67264d7cd1da" +checksum = "d19c46a6fdd48bc4dab94b6103fccc55d34c67cc0ad04653aad4ea2a07cd7bbb" dependencies = [ "base64", "bytes", @@ -4024,42 +4041,6 @@ dependencies = [ "zeroize", ] -[[package]] -name = "rtnetlink" -version = "0.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a552eb82d19f38c3beed3f786bd23aa434ceb9ac43ab44419ca6d67a7e186c0" -dependencies = [ - "futures", - "log", - "netlink-packet-core", - "netlink-packet-route 0.17.1", - "netlink-packet-utils", - "netlink-proto", - "netlink-sys", - "nix 0.26.4", - "thiserror 1.0.69", - "tokio", -] - -[[package]] -name = "rtnetlink" -version = "0.14.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b684475344d8df1859ddb2d395dd3dac4f8f3422a1aa0725993cb375fc5caba5" -dependencies = [ - "futures", - "log", - "netlink-packet-core", - "netlink-packet-route 0.19.0", - "netlink-packet-utils", - "netlink-proto", - "netlink-sys", - "nix 0.27.1", - "thiserror 1.0.69", - "tokio", -] - [[package]] name = "rustc-demangle" version = "0.1.24" @@ -4344,9 +4325,9 @@ checksum = "cd0b0ec5f1c1ca621c432a25813d8d60c88abe6d3e08a3eb9cf37d97a0fe3d73" [[package]] name = "serde" -version = "1.0.217" +version = "1.0.219" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02fc4265df13d6fa1d00ecff087228cc0a2b5f3c0e87e258d8b94a156e984c70" +checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6" dependencies = [ "serde_derive", ] @@ -4362,9 +4343,9 @@ dependencies = [ [[package]] name = "serde_derive" -version = "1.0.217" +version = "1.0.219" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a9bf7cf98d04a2b28aead066b7496853d4779c9cc183c440dbac457641e19a0" +checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" dependencies = [ "proc-macro2", "quote", @@ -4435,6 +4416,12 @@ dependencies = [ "digest", ] +[[package]] +name = "sha1_smol" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbfa15b3dddfee50a0fff136974b3e1bde555604ba463834a7eb7deb6417705d" + [[package]] name = "sha2" version = "0.10.8" @@ -4495,6 +4482,12 @@ dependencies = [ "rand_core 0.6.4", ] +[[package]] +name = "simdutf8" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3a9fe34e3e7a50316060351f37187a3f546bce95496156754b601a5fa71b76e" + [[package]] name = "simple-dns" version = "0.9.3" @@ -4522,11 +4515,32 @@ dependencies = [ "serde", ] +[[package]] +name = "snafu" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "223891c85e2a29c3fe8fb900c1fae5e69c2e42415e3177752e8718475efa5019" +dependencies = [ + "snafu-derive", +] + +[[package]] +name = "snafu-derive" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03c3c6b7927ffe7ecaa769ee0e3994da3b8cafc8f444578982c83ecb161af917" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "syn 2.0.98", +] + [[package]] name = "socket2" -version = "0.5.8" +version = "0.5.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c970269d99b64e60ec3bd6ad27270092a5394c4e309314b18ae3fe575695fbe8" +checksum = "4f5fd57c80058a56cf5c777ab8a126398ece8e442983605d280a44ce79d0edef" dependencies = [ "libc", "windows-sys 0.52.0", @@ -4614,35 +4628,6 @@ version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" -[[package]] -name = "struct_iterable" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "849a064c6470a650b72e41fa6c057879b68f804d113af92900f27574828e7712" -dependencies = [ - "struct_iterable_derive", - "struct_iterable_internal", -] - -[[package]] -name = "struct_iterable_derive" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8bb939ce88a43ea4e9d012f2f6b4cc789deb2db9d47bad697952a85d6978662c" -dependencies = [ - "erased-serde", - "proc-macro2", - "quote", - "struct_iterable_internal", - "syn 2.0.98", -] - -[[package]] -name = "struct_iterable_internal" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e9426b2a0c03e6cc2ea8dbc0168dbbf943f88755e409fb91bcb8f6a268305f4a" - [[package]] name = "structmeta" version = "0.3.0" @@ -4690,9 +4675,9 @@ dependencies = [ [[package]] name = "stun-rs" -version = "0.1.9" +version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b79cc624c9a747353810310af44f1f03f71eb4561284a894acc0396e6d0de76e" +checksum = "fb921f10397d5669e1af6455e9e2d367bf1f9cebcd6b1dd1dc50e19f6a9ac2ac" dependencies = [ "base64", "bounded-integer", @@ -4709,7 +4694,7 @@ dependencies = [ "precis-core", "precis-profiles", "quoted-string-parser", - "rand 0.8.5", + "rand 0.9.0", ] [[package]] @@ -4836,7 +4821,7 @@ checksum = "38c246215d7d24f48ae091a2902398798e05d978b24315d6efbc00ede9a8bb91" dependencies = [ "cfg-if", "fastrand", - "getrandom 0.3.1", + "getrandom 0.3.3", "once_cell", "rustix", "windows-sys 0.59.0", @@ -5021,9 +5006,9 @@ dependencies = [ [[package]] name = "tokio-rustls-acme" -version = "0.6.0" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3184e8e292a828dd4bca5b2a60aba830ec5ed873a66c9ebb6e65038fa649e827" +checksum = "f296d48ff72e0df96e2d7ef064ad5904d016a130869e542f00b08c8e05cc18cf" dependencies = [ "async-trait", "base64", @@ -5060,49 +5045,41 @@ dependencies = [ ] [[package]] -name = "tokio-tungstenite" -version = "0.24.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edc5f74e248dc973e0dbb7b74c7e0d6fcc301c694ff50049504004ef4d0cdcd9" -dependencies = [ - "futures-util", - "log", - "tokio", - "tungstenite", -] - -[[package]] -name = "tokio-tungstenite-wasm" -version = "0.4.0" +name = "tokio-util" +version = "0.7.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e21a5c399399c3db9f08d8297ac12b500e86bca82e930253fdc62eaf9c0de6ae" +checksum = "66a539a9ad6d5d281510d5bd368c973d636c02dbf8a67300bfb6b950696ad7df" dependencies = [ - "futures-channel", + "bytes", + "futures-core", + "futures-sink", "futures-util", - "http 1.2.0", - "httparse", - "js-sys", - "thiserror 1.0.69", + "hashbrown 0.15.2", + "pin-project-lite", + "slab", "tokio", - "tokio-tungstenite", - "wasm-bindgen", - "web-sys", ] [[package]] -name = "tokio-util" -version = "0.7.13" +name = "tokio-websockets" +version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7fcaa8d55a2bdd6b83ace262b016eca0d79ee02818c5c1bcdf0305114081078" +checksum = "fbc46f9dc832c663a5db08513162001a29ac820913275d58943f942c2bc1c435" dependencies = [ + "base64", "bytes", "futures-core", "futures-sink", - "futures-util", - "hashbrown 0.14.5", - "pin-project-lite", - "slab", + "getrandom 0.3.3", + "http 1.2.0", + "httparse", + "rand 0.9.0", + "ring", + "rustls-pki-types", + "simdutf8", "tokio", + "tokio-rustls", + "tokio-util", ] [[package]] @@ -5266,24 +5243,6 @@ version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" -[[package]] -name = "tungstenite" -version = "0.24.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "18e5b8366ee7a95b16d32197d0b2604b43a0be89dc5fac9f8e96ccafbaedda8a" -dependencies = [ - "byteorder", - "bytes", - "data-encoding", - "http 1.2.0", - "httparse", - "log", - "rand 0.8.5", - "sha1", - "thiserror 1.0.69", - "utf-8", -] - [[package]] name = "typenum" version = "1.17.0" @@ -5354,21 +5313,6 @@ version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" -[[package]] -name = "ureq" -version = "2.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02d1a66277ed75f640d608235660df48c8e3c19f3b4edb6a263315626cc3c01d" -dependencies = [ - "base64", - "log", - "once_cell", - "rustls", - "rustls-pki-types", - "url", - "webpki-roots", -] - [[package]] name = "url" version = "2.5.4" @@ -5381,12 +5325,6 @@ dependencies = [ "serde", ] -[[package]] -name = "utf-8" -version = "0.7.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" - [[package]] name = "utf16_iter" version = "1.0.5" @@ -5411,7 +5349,7 @@ version = "1.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ced87ca4be083373936a67f8de945faa23b6b42384bd5b64434850802c6dccd0" dependencies = [ - "getrandom 0.3.1", + "getrandom 0.3.3", ] [[package]] @@ -5462,9 +5400,9 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasi" -version = "0.13.3+wasi-0.2.2" +version = "0.14.2+wasi-0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26816d2e1a4a36a2940b96c5296ce403917633dff8f3440e9b236ed6f6bacad2" +checksum = "9683f9a5a998d873c0d21fcbe3c083009670149a8fab228644b8bd36b2c48cb3" dependencies = [ "wit-bindgen-rt", ] @@ -5755,13 +5693,13 @@ dependencies = [ [[package]] name = "windows-registry" -version = "0.2.0" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e400001bb720a623c1c69032f8e3e4cf09984deec740f007dd2b03ec864804b0" +checksum = "4286ad90ddb45071efd1a66dfa43eb02dd0dfbae1545ad6cc3c51cf34d7e8ba3" dependencies = [ - "windows-result 0.2.0", - "windows-strings 0.1.0", - "windows-targets 0.52.6", + "windows-result 0.3.0", + "windows-strings 0.3.0", + "windows-targets 0.53.0", ] [[package]] @@ -6100,9 +6038,9 @@ dependencies = [ [[package]] name = "wit-bindgen-rt" -version = "0.33.0" +version = "0.39.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3268f3d866458b787f390cf61f4bbb563b922d091359f9608842999eaee3943c" +checksum = "6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1" dependencies = [ "bitflags 2.8.0", ] @@ -6134,6 +6072,25 @@ version = "0.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51" +[[package]] +name = "ws_stream_wasm" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7999f5f4217fe3818726b66257a4475f71e74ffd190776ad053fa159e50737f5" +dependencies = [ + "async_io_stream", + "futures", + "js-sys", + "log", + "pharos", + "rustc_version", + "send_wrapper", + "thiserror 1.0.69", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", +] + [[package]] name = "x509-parser" version = "0.16.0" diff --git a/Cargo.toml b/Cargo.toml index 9111cc1..756282c 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -35,11 +35,11 @@ futures-buffered = "0.2.4" futures-lite = "2.3.0" futures-util = { version = "0.3.25" } hex = "0.4" -iroh-base = { version = "0.34", features = ["ticket"] } -iroh-blobs = { version = "0.34" } -iroh-gossip = { version = "0.34", optional = true, features = ["net"] } -iroh-metrics = { version = "0.32", default-features = false } -iroh = { version = "0.34", optional = true } +iroh-base = { version = "0.35", features = ["ticket"] } +iroh-blobs = { version = "0.35" } +iroh-gossip = { version = "0.35", optional = true, features = ["net"] } +iroh-metrics = { version = "0.34", default-features = false } +iroh = { version = "0.35", optional = true } num_enum = "0.7" postcard = { version = "1", default-features = false, features = ["alloc", "use-std", "experimental-derive"] } rand = "0.8.5" @@ -58,8 +58,8 @@ tracing = "0.1" # rpc nested_enum_utils = { version = "0.1.0", optional = true } -quic-rpc = { version = "0.19", optional = true } -quic-rpc-derive = { version = "0.19", optional = true } +quic-rpc = { version = "0.20", optional = true } +quic-rpc-derive = { version = "0.20", optional = true } serde-error = { version = "0.1.3", optional = true } portable-atomic = { version = "1.9.0", optional = true } diff --git a/README.md b/README.md index f318b6e..336afff 100644 --- a/README.md +++ b/README.md @@ -72,8 +72,7 @@ async fn main() -> anyhow::Result<()> { .accept(BLOBS_ALPN, blobs) .accept(GOSSIP_ALPN, gossip) .accept(DOCS_ALPN, docs) - .spawn() - .await?; + .spawn(); // do fun stuff with docs! Ok(()) diff --git a/deny.toml b/deny.toml index 24769da..47ebcff 100644 --- a/deny.toml +++ b/deny.toml @@ -19,7 +19,8 @@ allow = [ "MIT", "Zlib", "MPL-2.0", # https://fossa.com/blog/open-source-software-licenses-101-mozilla-public-license-2-0/ - "Unicode-3.0" + "Unicode-3.0", + "Unlicense" # https://unlicense.org/ ] [[licenses.clarify]] diff --git a/src/actor.rs b/src/actor.rs index 5da84d4..195cbab 100644 --- a/src/actor.rs +++ b/src/actor.rs @@ -12,7 +12,6 @@ use anyhow::{anyhow, Context, Result}; use bytes::Bytes; use futures_util::FutureExt; use iroh_blobs::Hash; -use iroh_metrics::inc; use serde::{Deserialize, Serialize}; use tokio::{sync::oneshot, task::JoinSet}; use tracing::{debug, error, error_span, trace, warn}; @@ -224,6 +223,7 @@ struct OpenReplica { pub struct SyncHandle { tx: async_channel::Sender, join_handle: Arc>>, + metrics: Arc, } /// Options when opening a replica. @@ -255,6 +255,7 @@ impl SyncHandle { content_status_callback: Option, me: String, ) -> SyncHandle { + let metrics = Arc::new(Metrics::default()); let (action_tx, action_rx) = async_channel::bounded(ACTION_CAP); let actor = Actor { store, @@ -262,6 +263,7 @@ impl SyncHandle { action_rx, content_status_callback, tasks: Default::default(), + metrics: metrics.clone(), }; let join_handle = std::thread::Builder::new() .name("sync-actor".to_string()) @@ -278,9 +280,15 @@ impl SyncHandle { SyncHandle { tx: action_tx, join_handle, + metrics, } } + /// Returns the metrics collected in this sync actor. + pub fn metrics(&self) -> &Arc { + &self.metrics + } + pub async fn open(&self, namespace: NamespaceId, opts: OpenOpts) -> Result<()> { let (reply, rx) = oneshot::channel(); let action = ReplicaAction::Open { reply, opts }; @@ -599,6 +607,7 @@ struct Actor { action_rx: async_channel::Receiver, content_status_callback: Option, tasks: JoinSet<()>, + metrics: Arc, } impl Actor { @@ -634,7 +643,7 @@ impl Actor { } }; trace!(%action, "tick"); - inc!(Metrics, actor_tick_main); + self.metrics.actor_tick_main.inc(); match action { Action::Shutdown { reply } => { break reply; @@ -750,6 +759,8 @@ impl Actor { let author = get_author(&mut this.store, &author)?; let mut replica = this.states.replica(namespace, &mut this.store)?; replica.insert(&key, &author, hash, len)?; + this.metrics.new_entries_local.inc(); + this.metrics.new_entries_local_size.inc_by(len); Ok(()) }), ReplicaAction::DeletePrefix { author, key, reply } => { @@ -769,7 +780,10 @@ impl Actor { let mut replica = this .states .replica_if_syncing(&namespace, &mut this.store)?; + let len = entry.content_len(); replica.insert_remote_entry(entry, from, content_status)?; + this.metrics.new_entries_remote.inc(); + this.metrics.new_entries_remote_size.inc_by(len); Ok(()) }), diff --git a/src/engine.rs b/src/engine.rs index 0b83263..c8b59c4 100644 --- a/src/engine.rs +++ b/src/engine.rs @@ -28,7 +28,8 @@ pub use self::{ state::{Origin, SyncReason}, }; use crate::{ - actor::SyncHandle, Author, AuthorId, ContentStatus, ContentStatusCallback, Entry, NamespaceId, + actor::SyncHandle, metrics::Metrics, Author, AuthorId, ContentStatus, ContentStatusCallback, + Entry, NamespaceId, }; mod gossip; @@ -90,6 +91,7 @@ impl Engine { downloader, to_live_actor_recv, live_actor_tx.clone(), + sync.metrics().clone(), ); let actor_handle = tokio::task::spawn( async move { @@ -155,6 +157,11 @@ impl Engine { &self.blob_store } + /// Returns the metrics tracked for this engine. + pub fn metrics(&self) -> &Arc { + self.sync.metrics() + } + /// Start to sync a document. /// /// If `peers` is non-empty, it will both do an initial set-reconciliation sync with each peer, diff --git a/src/engine/live.rs b/src/engine/live.rs index dd2bf9a..31815bc 100644 --- a/src/engine/live.rs +++ b/src/engine/live.rs @@ -2,6 +2,7 @@ use std::{ collections::{HashMap, HashSet}, + sync::Arc, time::SystemTime, }; @@ -15,7 +16,6 @@ use iroh_blobs::{ Hash, HashAndFormat, }; use iroh_gossip::net::Gossip; -use iroh_metrics::inc; use serde::{Deserialize, Serialize}; use tokio::{ sync::{self, mpsc, oneshot}, @@ -180,6 +180,7 @@ pub struct LiveActor { /// Sync state per replica and peer state: NamespaceStates, + metrics: Arc, } impl LiveActor { /// Create the live actor. @@ -192,6 +193,7 @@ impl LiveActor { downloader: Downloader, inbox: mpsc::Receiver, sync_actor_tx: mpsc::Sender, + metrics: Arc, ) -> Self { let (replica_events_tx, replica_events_rx) = async_channel::bounded(1024); let gossip_state = GossipState::new(gossip, sync.clone(), sync_actor_tx.clone()); @@ -212,6 +214,7 @@ impl LiveActor { state: Default::default(), missing_hashes: Default::default(), queued_hashes: Default::default(), + metrics, } } @@ -236,13 +239,13 @@ impl LiveActor { loop { i += 1; trace!(?i, "tick wait"); - inc!(Metrics, doc_live_tick_main); + self.metrics.doc_live_tick_main.inc(); tokio::select! { biased; msg = self.inbox.recv() => { let msg = msg.context("to_actor closed")?; trace!(?i, %msg, "tick: to_actor"); - inc!(Metrics, doc_live_tick_actor); + self.metrics.doc_live_tick_actor.inc(); match msg { ToLiveActor::Shutdown { reply } => { break Ok(reply); @@ -254,7 +257,7 @@ impl LiveActor { } event = self.replica_events_rx.recv() => { trace!(?i, "tick: replica_event"); - inc!(Metrics, doc_live_tick_replica_event); + self.metrics.doc_live_tick_replica_event.inc(); let event = event.context("replica_events closed")?; if let Err(err) = self.on_replica_event(event).await { error!(?err, "Failed to process replica event"); @@ -262,20 +265,20 @@ impl LiveActor { } Some(res) = self.running_sync_connect.join_next(), if !self.running_sync_connect.is_empty() => { trace!(?i, "tick: running_sync_connect"); - inc!(Metrics, doc_live_tick_running_sync_connect); + self.metrics.doc_live_tick_running_sync_connect.inc(); let (namespace, peer, reason, res) = res.context("running_sync_connect closed")?; self.on_sync_via_connect_finished(namespace, peer, reason, res).await; } Some(res) = self.running_sync_accept.join_next(), if !self.running_sync_accept.is_empty() => { trace!(?i, "tick: running_sync_accept"); - inc!(Metrics, doc_live_tick_running_sync_accept); + self.metrics.doc_live_tick_running_sync_accept.inc(); let res = res.context("running_sync_accept closed")?; self.on_sync_via_accept_finished(res).await; } Some(res) = self.download_tasks.join_next(), if !self.download_tasks.is_empty() => { trace!(?i, "tick: pending_downloads"); - inc!(Metrics, doc_live_tick_pending_downloads); + self.metrics.doc_live_tick_pending_downloads.inc(); let (namespace, hash, res) = res.context("pending_downloads closed")?; self.on_download_ready(namespace, hash, res).await; } @@ -362,8 +365,16 @@ impl LiveActor { } let endpoint = self.endpoint.clone(); let sync = self.sync.clone(); + let metrics = self.metrics.clone(); let fut = async move { - let res = connect_and_sync(&endpoint, &sync, namespace, NodeAddr::new(peer)).await; + let res = connect_and_sync( + &endpoint, + &sync, + namespace, + NodeAddr::new(peer), + Some(&metrics), + ) + .await; (namespace, peer, reason, res) } .instrument(Span::current()); @@ -787,8 +798,9 @@ impl LiveActor { }; debug!("incoming connection"); let sync = self.sync.clone(); + let metrics = self.metrics.clone(); self.running_sync_accept.spawn( - async move { handle_connection(sync, conn, accept_request_cb).await } + async move { handle_connection(sync, conn, accept_request_cb, Some(&metrics)).await } .instrument(Span::current()), ); } diff --git a/src/metrics.rs b/src/metrics.rs index 69d7ab6..1b41a9c 100644 --- a/src/metrics.rs +++ b/src/metrics.rs @@ -1,85 +1,49 @@ //! Metrics for iroh-docs -use iroh_metrics::{ - core::{Counter, Metric}, - struct_iterable::Iterable, -}; +use iroh_metrics::{Counter, MetricsGroup}; /// Metrics for iroh-docs -#[allow(missing_docs)] -#[derive(Debug, Clone, Iterable)] +#[derive(Debug, Default, MetricsGroup)] pub struct Metrics { + /// Number of document entries added locally pub new_entries_local: Counter, + /// Number of document entries added by peers pub new_entries_remote: Counter, + /// Total size of entry contents added locally pub new_entries_local_size: Counter, + /// Total size of entry contents added by peers pub new_entries_remote_size: Counter, - pub sync_via_connect_success: Counter, - pub sync_via_connect_failure: Counter, + /// Number of successful syncs (via accept) pub sync_via_accept_success: Counter, + /// Number of failed syncs (via accept) pub sync_via_accept_failure: Counter, + /// Number of successful syncs (via connect) + pub sync_via_connect_success: Counter, + /// Number of failed syncs (via connect) + pub sync_via_connect_failure: Counter, + /// Number of times the main actor loop ticked pub actor_tick_main: Counter, + /// Number of times the gossip actor loop ticked pub doc_gossip_tick_main: Counter, + /// Number of times the gossip actor processed an event pub doc_gossip_tick_event: Counter, + /// Number of times the gossip actor processed an actor event pub doc_gossip_tick_actor: Counter, + /// Number of times the gossip actor processed a pending join pub doc_gossip_tick_pending_join: Counter, + /// Number of times the live actor loop ticked pub doc_live_tick_main: Counter, + /// Number of times the live actor processed an actor event pub doc_live_tick_actor: Counter, + /// Number of times the live actor processed a replica event pub doc_live_tick_replica_event: Counter, + /// Number of times the live actor processed a running sync connect pub doc_live_tick_running_sync_connect: Counter, + /// Number of times the live actor processed a running sync accept pub doc_live_tick_running_sync_accept: Counter, + /// Number of times the live actor processed a pending download pub doc_live_tick_pending_downloads: Counter, } - -impl Default for Metrics { - fn default() -> Self { - Self { - new_entries_local: Counter::new("Number of document entries added locally"), - new_entries_remote: Counter::new("Number of document entries added by peers"), - new_entries_local_size: Counter::new("Total size of entry contents added locally"), - new_entries_remote_size: Counter::new("Total size of entry contents added by peers"), - sync_via_accept_success: Counter::new("Number of successful syncs (via accept)"), - sync_via_accept_failure: Counter::new("Number of failed syncs (via accept)"), - sync_via_connect_success: Counter::new("Number of successful syncs (via connect)"), - sync_via_connect_failure: Counter::new("Number of failed syncs (via connect)"), - - actor_tick_main: Counter::new("Number of times the main actor loop ticked"), - - doc_gossip_tick_main: Counter::new("Number of times the gossip actor loop ticked"), - doc_gossip_tick_event: Counter::new( - "Number of times the gossip actor processed an event", - ), - doc_gossip_tick_actor: Counter::new( - "Number of times the gossip actor processed an actor event", - ), - doc_gossip_tick_pending_join: Counter::new( - "Number of times the gossip actor processed a pending join", - ), - - doc_live_tick_main: Counter::new("Number of times the live actor loop ticked"), - doc_live_tick_actor: Counter::new( - "Number of times the live actor processed an actor event", - ), - doc_live_tick_replica_event: Counter::new( - "Number of times the live actor processed a replica event", - ), - doc_live_tick_running_sync_connect: Counter::new( - "Number of times the live actor processed a running sync connect", - ), - doc_live_tick_running_sync_accept: Counter::new( - "Number of times the live actor processed a running sync accept", - ), - doc_live_tick_pending_downloads: Counter::new( - "Number of times the live actor processed a pending download", - ), - } - } -} - -impl Metric for Metrics { - fn name() -> &'static str { - "iroh_docs" - } -} diff --git a/src/net.rs b/src/net.rs index ac6020c..e8dc23f 100644 --- a/src/net.rs +++ b/src/net.rs @@ -6,15 +6,12 @@ use std::{ }; use iroh::{Endpoint, NodeAddr, PublicKey}; -#[cfg(feature = "metrics")] -use iroh_metrics::inc; use serde::{Deserialize, Serialize}; use tracing::{debug, error_span, trace, Instrument}; -#[cfg(feature = "metrics")] -use crate::metrics::Metrics; use crate::{ actor::SyncHandle, + metrics::Metrics, net::codec::{run_alice, BobState}, NamespaceId, SyncOutcome, }; @@ -30,6 +27,7 @@ pub async fn connect_and_sync( sync: &SyncHandle, namespace: NamespaceId, peer: NodeAddr, + metrics: Option<&Metrics>, ) -> Result { let t_start = Instant::now(); let peer_id = peer.node_id; @@ -54,11 +52,12 @@ pub async fn connect_and_sync( .await .map_err(ConnectError::close)?; - #[cfg(feature = "metrics")] - if res.is_ok() { - inc!(Metrics, sync_via_connect_success); - } else { - inc!(Metrics, sync_via_connect_failure); + if let Some(metrics) = metrics { + if res.is_ok() { + metrics.sync_via_connect_success.inc(); + } else { + metrics.sync_via_connect_failure.inc(); + } } let t_process = t_start.elapsed() - t_connect; @@ -108,6 +107,7 @@ pub async fn handle_connection( sync: SyncHandle, connection: iroh::endpoint::Connection, accept_cb: F, + metrics: Option<&Metrics>, ) -> Result where F: Fn(NamespaceId, PublicKey) -> Fut, @@ -132,11 +132,12 @@ where .instrument(span.clone()) .await; - #[cfg(feature = "metrics")] - if res.is_ok() { - inc!(Metrics, sync_via_accept_success); - } else { - inc!(Metrics, sync_via_accept_failure); + if let Some(metrics) = metrics { + if res.is_ok() { + metrics.sync_via_accept_success.inc(); + } else { + metrics.sync_via_accept_failure.inc(); + } } let namespace = state.namespace(); diff --git a/src/sync.rs b/src/sync.rs index 9e4ec81..382083a 100644 --- a/src/sync.rs +++ b/src/sync.rs @@ -17,13 +17,9 @@ use std::{ use bytes::{Bytes, BytesMut}; use ed25519_dalek::{Signature, SignatureError}; use iroh_blobs::Hash; -#[cfg(feature = "metrics")] -use iroh_metrics::{inc, inc_by}; use serde::{Deserialize, Serialize}; pub use crate::heads::AuthorHeads; -#[cfg(feature = "metrics")] -use crate::metrics::Metrics; use crate::{ keys::{Author, AuthorId, AuthorPublicKey, NamespaceId, NamespacePublicKey, NamespaceSecret}, ranger::{self, Fingerprint, InsertOutcome, RangeEntry, RangeKey, RangeValue, Store}, @@ -433,9 +429,6 @@ where ) -> Result { let namespace = self.id(); - #[cfg(feature = "metrics")] - let len = entry.content_len(); - let store = &self.store; validate_entry(system_time_now(), store, namespace, &entry, &origin)?; @@ -448,24 +441,11 @@ where }; let insert_event = match origin { - InsertOrigin::Local => { - #[cfg(feature = "metrics")] - { - inc!(Metrics, new_entries_local); - inc_by!(Metrics, new_entries_local_size, len); - } - Event::LocalInsert { namespace, entry } - } + InsertOrigin::Local => Event::LocalInsert { namespace, entry }, InsertOrigin::Sync { from, remote_content_status, } => { - #[cfg(feature = "metrics")] - { - inc!(Metrics, new_entries_remote); - inc_by!(Metrics, new_entries_remote_size, len); - } - let download_policy = self .store .get_download_policy(&self.id()) diff --git a/tests/util.rs b/tests/util.rs index 1a9c77a..5f83e78 100644 --- a/tests/util.rs +++ b/tests/util.rs @@ -160,7 +160,7 @@ impl Builder { router = router.accept(iroh_gossip::ALPN, gossip.clone()); // Build the router - let router = router.spawn().await?; + let router = router.spawn(); // Setup RPC let (internal_rpc, controller) =