diff --git a/Cargo.lock b/Cargo.lock index 23efd1eb251..4145e7bc91e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -13,9 +13,9 @@ dependencies = [ [[package]] name = "adler2" -version = "2.0.0" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" +checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" [[package]] name = "aead" @@ -61,6 +61,12 @@ dependencies = [ "memchr", ] +[[package]] +name = "allocator-api2" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" + [[package]] name = "anes" version = "0.1.6" @@ -69,9 +75,9 @@ checksum = "4b46cbb362ab8752921c97e041f5e366ee6297bd428a31275b9fcf1e380f7299" [[package]] name = "anstream" -version = "0.6.18" +version = "0.6.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8acc5369981196006228e28809f761875c0327210a891e941f4c683b3a99529b" +checksum = "3ae563653d1938f79b1ab1b5e668c87c76a9930414574a6583a7b7e11a8e6192" dependencies = [ "anstyle", "anstyle-parse", @@ -84,50 +90,50 @@ dependencies = [ [[package]] name = "anstyle" -version = "1.0.10" +version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55cc3b69f167a1ef2e161439aa98aed94e6028e5f9a59be9a6ffb47aef1651f9" +checksum = "862ed96ca487e809f1c8e5a8447f6ee2cf102f846893800b20cebdf541fc6bbd" [[package]] name = "anstyle-parse" -version = "0.2.6" +version = "0.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b2d16507662817a6a20a9ea92df6652ee4f94f914589377d69f3b21bc5798a9" +checksum = "4e7644824f0aa2c7b9384579234ef10eb7efb6a0deb83f9630a49594dd9c15c2" dependencies = [ "utf8parse", ] [[package]] name = "anstyle-query" -version = "1.1.2" +version = "1.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79947af37f4177cfead1110013d678905c37501914fba0efea834c3fe9a8d60c" +checksum = "9e231f6134f61b71076a3eab506c379d4f36122f2af15a9ff04415ea4c3339e2" dependencies = [ - "windows-sys 0.59.0", + "windows-sys 0.60.2", ] [[package]] name = "anstyle-wincon" -version = "3.0.7" +version = "3.0.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca3534e77181a9cc07539ad51f2141fe32f6c3ffd4df76db8ad92346b003ae4e" +checksum = "3e0633414522a32ffaac8ac6cc8f748e090c5717661fddeea04219e2344f5f2a" dependencies = [ "anstyle", - "once_cell", - "windows-sys 0.59.0", + "once_cell_polyfill", + "windows-sys 0.60.2", ] [[package]] name = "anyhow" -version = "1.0.97" +version = "1.0.99" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dcfed56ad506cb2c684a14971b8861fdc3baaaae314b9e5f9bb532cbe3ba7a4f" +checksum = "b0674a1ddeecb70197781e945de4b3b8ffb61fa939a5597bcf48503737663100" [[package]] name = "arbitrary" -version = "1.4.1" +version = "1.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dde20b3d026af13f561bdd0f15edf01fc734f0dafcedbaf42bba506a9517f223" +checksum = "c3d036a3c4ab069c7b410a2ce876bd74808d2d0888a82667669f8e783a898bf1" [[package]] name = "arc-swap" @@ -169,7 +175,7 @@ dependencies = [ "nom", "num-traits", "rusticata-macros", - "thiserror 2.0.12", + "thiserror 2.0.16", "time", ] @@ -216,9 +222,9 @@ checksum = "155a5a185e42c6b77ac7b88a15143d930a9e9727a5b7b77eed417404ab15c247" [[package]] name = "async-channel" -version = "2.3.1" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89b47800b0be77592da0afd425cc03468052844aff33b84e33cc696f64e77b6a" +checksum = "924ed96dd52d1b75e9c1a3e6275715fd320f5f9439fb5a4a11fa51f4221158d2" dependencies = [ "concurrent-queue", "event-listener-strategy", @@ -228,32 +234,20 @@ dependencies = [ [[package]] name = "async-io" -version = "2.4.0" +version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43a2b323ccce0a1d90b449fd71f2a06ca7faa7c54c2751f06c9bd851fc061059" +checksum = "456b8a8feb6f42d237746d4b3e9a178494627745c3c56c6ea55d92ba50d026fc" dependencies = [ - "async-lock", + "autocfg", "cfg-if", "concurrent-queue", "futures-io", "futures-lite", "parking", "polling", - "rustix 0.38.44", + "rustix", "slab", - "tracing", - "windows-sys 0.59.0", -] - -[[package]] -name = "async-lock" -version = "3.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff6e472cdea888a4bd64f342f09b3f50e1886d32afe8df3d663c01140b811b18" -dependencies = [ - "event-listener", - "event-listener-strategy", - "pin-project-lite", + "windows-sys 0.61.0", ] [[package]] @@ -280,9 +274,9 @@ dependencies = [ [[package]] name = "async-trait" -version = "0.1.88" +version = "0.1.89" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e539d3fca749fcee5236ab05e93a52867dd549cc157c8cb7f99595f3cedffdb5" +checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb" dependencies = [ "proc-macro2", "quote", @@ -310,20 +304,21 @@ checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" [[package]] name = "attohttpc" -version = "0.24.1" +version = "0.30.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d9a9bf8b79a749ee0b911b91b671cc2b6c670bdbc7e3dfd537576ddc94bb2a2" +checksum = "16e2cdb6d5ed835199484bb92bb8b3edd526effe995c61732580439c1a67e2e9" dependencies = [ - "http 0.2.12", + "base64", + "http", "log", "url", ] [[package]] name = "autocfg" -version = "1.4.0" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" +checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" [[package]] name = "autonat-example" @@ -362,7 +357,7 @@ dependencies = [ "axum-core", "bytes", "futures-util", - "http 1.3.1", + "http", "http-body", "http-body-util", "hyper", @@ -395,7 +390,7 @@ dependencies = [ "async-trait", "bytes", "futures-util", - "http 1.3.1", + "http", "http-body", "http-body-util", "mime", @@ -409,9 +404,9 @@ dependencies = [ [[package]] name = "backtrace" -version = "0.3.74" +version = "0.3.75" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d82cb332cdfaed17ae235a638438ac4d4839913cc2af585c3c6746e8f8bee1a" +checksum = "6806a6321ec58106fea15becdad98371e28d92ccbc7c8f1b3b6dd724fe8f1002" dependencies = [ "addr2line", "cfg-if", @@ -442,9 +437,9 @@ checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" [[package]] name = "base64ct" -version = "1.7.3" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89e25b6adfb930f02d1981565a6e5d9c547ac15a96606256d3b59040e5cd4ca3" +checksum = "55248b47b0caf0546f7988906588779981c43bb1bc9d0c44087278f80cdb44ba" [[package]] name = "bimap" @@ -469,9 +464,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.9.0" +version = "2.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c8214115b7bf84099f1309324e63141d4c5d7cc26862f97a0a857dbefe165bd" +checksum = "2261d10cca569e4643e526d8dc2e62e433cc8aba21ab764233731f8d369bf394" [[package]] name = "blake2" @@ -517,7 +512,7 @@ dependencies = [ "tokio", "tokio-util", "tower 0.4.13", - "tower-http", + "tower-http 0.5.2", "tracing", "tracing-subscriber", "tracing-wasm", @@ -547,9 +542,9 @@ dependencies = [ [[package]] name = "bumpalo" -version = "3.17.0" +version = "3.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1628fb46dfa0b37568d12e5edd512553eccf6a22a78e8bde00bb4aed84d5bdbf" +checksum = "46c5e41b57b8bba42a04676d81cb89e9ee8e859a1a66f80a5a72e1cb76b34d43" [[package]] name = "byteorder" @@ -592,10 +587,11 @@ dependencies = [ [[package]] name = "cc" -version = "1.2.19" +version = "1.2.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e3a13707ac958681c13b39b458c073d0d9bc8a22cb1b2f4c8e55eb72c13f362" +checksum = "65193589c6404eb80b450d618eaf9a2cafaaafd57ecce47370519ef674a7bd44" dependencies = [ + "find-msvc-tools", "shlex", ] @@ -613,9 +609,9 @@ dependencies = [ [[package]] name = "cfg-if" -version = "1.0.0" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" +checksum = "2fd1289c04a9ea8cb22300a459a72a385d7c73d3259e2ed7dcb2af674838cfa9" [[package]] name = "cfg_aliases" @@ -697,9 +693,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.35" +version = "4.5.47" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8aa86934b44c19c50f87cc2790e19f54f7a67aedb64101c2e1a2e5ecfb73944" +checksum = "7eac00902d9d136acd712710d71823fb8ac8004ca445a89e73a41d45aa712931" dependencies = [ "clap_builder", "clap_derive", @@ -707,9 +703,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.35" +version = "4.5.47" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2414dbb2dd0695280da6ea9261e327479e9d37b0630f6b53ba2a11c60c679fd9" +checksum = "2ad9bbf750e73b5884fb8a211a9424a1906c1e156724260fdae972f31d70e1d6" dependencies = [ "anstream", "anstyle", @@ -719,9 +715,9 @@ dependencies = [ [[package]] name = "clap_derive" -version = "4.5.32" +version = "4.5.47" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09176aae279615badda0765c0c0b3f6ed53f4709118af73cf4655d85d1530cd7" +checksum = "bbfd7eae0b0f1a6e63d4b13c9c478de77c2eb546fba158ad50b4203dc24b9f9c" dependencies = [ "heck", "proc-macro2", @@ -731,15 +727,15 @@ dependencies = [ [[package]] name = "clap_lex" -version = "0.7.4" +version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f46ad14479a25103f283c0f10005961cf086d8dc42205bb44c46ac563475dca6" +checksum = "b94f61472cee1439c0b966b47e3aca9ae07e45d070759512cd390ea2bebc6675" [[package]] name = "colorchoice" -version = "1.0.3" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b63caa9aa9397e2d9480a9b13673856c78d8ac123288526c37d7839f2a86990" +checksum = "b05b61dc5112cbb17e4b6cd61790d9845d13888356391624cbe7e41efeac1e75" [[package]] name = "combine" @@ -816,9 +812,9 @@ dependencies = [ [[package]] name = "crc" -version = "3.2.1" +version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69e6e4d7b33a94f0991c26729976b10ebde1d34c3ee82408fb536164fa10d636" +checksum = "9710d3b3739c2e349eb44fe848ad0b7c8cb1e42bd87ee49371df2f7acaf3e675" dependencies = [ "crc-catalog", ] @@ -909,9 +905,9 @@ checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" [[package]] name = "crunchy" -version = "0.2.3" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43da5946c66ffcc7745f48db692ffbb10a83bfe0afd96235c5c2a4fb23994929" +checksum = "460fbee9c2c2f33933d720630a6a0bac33ba7053db5344fac858d4b8952d77d5" [[package]] name = "crypto-bigint" @@ -985,15 +981,15 @@ dependencies = [ [[package]] name = "data-encoding" -version = "2.8.0" +version = "2.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "575f75dfd25738df5b91b8e43e14d44bda14637a58fae779fd2b064f8bf3e010" +checksum = "2a2330da5de22e8a3cb63252ce2abb30116bf5265e89c0e01bc17015ce30a476" [[package]] name = "data-encoding-macro" -version = "0.1.17" +version = "0.1.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f9724adfcf41f45bf652b3995837669d73c4d49a1b5ac1ff82905ac7d9b5558" +checksum = "47ce6c96ea0102f01122a185683611bd5ac8d99e62bc59dd12e6bda344ee673d" dependencies = [ "data-encoding", "data-encoding-macro-internal", @@ -1001,9 +997,9 @@ dependencies = [ [[package]] name = "data-encoding-macro-internal" -version = "0.1.15" +version = "0.1.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "18e4fdb82bd54a12e42fb58a800dcae6b9e13982238ce2296dc3570b92148e1f" +checksum = "8d162beedaa69905488a8da94f5ac3edb4dd4788b732fadb7bd120b2625c1976" dependencies = [ "data-encoding", "syn", @@ -1024,9 +1020,9 @@ dependencies = [ [[package]] name = "der" -version = "0.7.9" +version = "0.7.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f55bf8e7b65898637379c1b74eb1551107c8294ed26d855ceb9fd1a09cfc9bc0" +checksum = "e7c1832837b905bbfb5101e07cc24c8deddf52f93225eee6ead5f4d63d53ddcb" dependencies = [ "const-oid", "pem-rfc7468", @@ -1063,9 +1059,9 @@ dependencies = [ [[package]] name = "deranged" -version = "0.4.0" +version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c9e6a11ca8224451684bc0d7d5a7adbf8f2fd6887261a1cfc3c0432f9d4068e" +checksum = "d630bccd429a5bb5a64b5e94f693bfc48c9f8566418fda4c494cc94f911f87cc" dependencies = [ "powerfmt", ] @@ -1084,23 +1080,23 @@ dependencies = [ [[package]] name = "dirs" -version = "5.0.1" +version = "6.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44c45a9d03d6676652bcb5e724c7e988de1acad23a711b5217ab9cbecbec2225" +checksum = "c3e8aa94d75141228480295a7d0e7feb620b1a5ad9f12bc40be62411e38cce4e" dependencies = [ "dirs-sys", ] [[package]] name = "dirs-sys" -version = "0.4.1" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "520f05a5cbd335fae5a99ff7a6ab8627577660ee5cfd6a94a6a929b52ff0321c" +checksum = "e01a3366d27ee9890022452ee61b2b63a67e6f13f58900b651ff5665f0bb1fab" dependencies = [ "libc", "option-ext", "redox_users", - "windows-sys 0.48.0", + "windows-sys 0.61.0", ] [[package]] @@ -1156,9 +1152,9 @@ dependencies = [ [[package]] name = "ed25519-dalek" -version = "2.1.1" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a3daa8e81a3963a60642bcc1f90a670680bd4a77535faa384e9d1c79d620871" +checksum = "70e796c081cee67dc755e1a36a0a172b897fab85fc3f6bc48307991f64e4eca9" dependencies = [ "curve25519-dalek", "ed25519", @@ -1257,19 +1253,19 @@ checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" [[package]] name = "errno" -version = "0.3.11" +version = "0.3.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "976dd42dc7e85965fe702eb8164f21f450704bdde31faefd6471dba214cb594e" +checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" dependencies = [ "libc", - "windows-sys 0.59.0", + "windows-sys 0.61.0", ] [[package]] name = "event-listener" -version = "5.4.0" +version = "5.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3492acde4c3fc54c845eaab3eed8bd00c7a7d881f78bfc801e43a93dec1331ae" +checksum = "e13b66accf52311f30a0db42147dadea9850cb48cd070028831ae5f5d4b856ab" dependencies = [ "concurrent-queue", "parking", @@ -1320,6 +1316,12 @@ dependencies = [ "tracing-subscriber", ] +[[package]] +name = "find-msvc-tools" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7fd99930f64d146689264c637b5af2f0233a933bef0d8570e2526bf9e083192d" + [[package]] name = "fnv" version = "1.0.7" @@ -1349,9 +1351,9 @@ checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" [[package]] name = "form_urlencoded" -version = "1.2.1" +version = "1.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" +checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf" dependencies = [ "percent-encoding", ] @@ -1417,9 +1419,9 @@ checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" [[package]] name = "futures-lite" -version = "2.6.0" +version = "2.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f5edaec856126859abb19ed65f39e90fea3a9574b9707f13539acf4abf7eb532" +checksum = "f78e10609fe0e0b3f4157ffab1876319b5b0db102a2c60dc4626306dc46b44ad" dependencies = [ "futures-core", "pin-project-lite", @@ -1501,15 +1503,16 @@ dependencies = [ [[package]] name = "generator" -version = "0.8.4" +version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc6bd114ceda131d3b1d665eba35788690ad37f5916457286b32ab6fd3c438dd" +checksum = "605183a538e3e2a9c1038635cc5c2d194e2ee8fd0d1b66b8349fad7dbacce5a2" dependencies = [ + "cc", "cfg-if", "libc", "log", "rustversion", - "windows 0.58.0", + "windows 0.61.3", ] [[package]] @@ -1536,28 +1539,28 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.2.15" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" +checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592" dependencies = [ "cfg-if", "js-sys", "libc", - "wasi 0.11.0+wasi-snapshot-preview1", + "wasi 0.11.1+wasi-snapshot-preview1", "wasm-bindgen", ] [[package]] name = "getrandom" -version = "0.3.2" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73fea8450eea4bac3940448fb7ae50d91f034f941199fcd9d909a5a07aa455f0" +checksum = "26145e563e54f2cadc477553f1ec5ee650b00862f0a58bcd12cbdc5f0ea2d2f4" dependencies = [ "cfg-if", "js-sys", "libc", "r-efi", - "wasi 0.14.2+wasi-0.2.4", + "wasi 0.14.7+wasi-0.2.4", "wasm-bindgen", ] @@ -1579,9 +1582,9 @@ checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" [[package]] name = "glob" -version = "0.3.2" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8d1add55171497b4705a648c6b583acafb01d58050a51727785f0b2c8e0a2b2" +checksum = "0cc23270f6e1808e30a928bdc84dea0b9b4136a8bc82338574f23baf47bbd280" [[package]] name = "globset" @@ -1592,8 +1595,8 @@ dependencies = [ "aho-corasick", "bstr", "log", - "regex-automata 0.4.9", - "regex-syntax 0.8.5", + "regex-automata", + "regex-syntax", ] [[package]] @@ -1621,17 +1624,17 @@ dependencies = [ [[package]] name = "h2" -version = "0.4.8" +version = "0.4.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5017294ff4bb30944501348f6f8e42e6ad28f42c8bbef7a74029aff064a4e3c2" +checksum = "f3c0b69cfcb4e1b9f1bf2f53f95f766e4661169728ec61cd3fe5a0166f2d1386" dependencies = [ "atomic-waker", "bytes", "fnv", "futures-core", "futures-sink", - "http 1.3.1", - "indexmap 2.9.0", + "http", + "indexmap 2.11.3", "slab", "tokio", "tokio-util", @@ -1656,10 +1659,12 @@ checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" [[package]] name = "hashbrown" -version = "0.15.2" +version = "0.15.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" +checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" dependencies = [ + "allocator-api2", + "equivalent", "foldhash", ] @@ -1669,7 +1674,7 @@ version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7382cf6263419f2d8df38c55d7da83da5c18aef87fc7a7fc1fb1e344edfe14c1" dependencies = [ - "hashbrown 0.15.2", + "hashbrown 0.15.5", ] [[package]] @@ -1680,21 +1685,9 @@ checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" [[package]] name = "hermit-abi" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" - -[[package]] -name = "hermit-abi" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fbf6a919d6cf397374f7dfeeea91d974c7c0a7221d0d0f4f20d859d329e53fcc" - -[[package]] -name = "hermit-abi" -version = "0.5.0" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fbd780fe5cc30f81464441920d82ac8740e2e46b29a6fad543ddd075229ce37e" +checksum = "fc0fef456e4baa96da950455cd02c081ca953b141298e41db3fc7e36b1da849c" [[package]] name = "hex" @@ -1730,10 +1723,10 @@ dependencies = [ "idna", "ipnet", "once_cell", - "rand 0.9.0", + "rand 0.9.2", "ring", - "socket2 0.5.9", - "thiserror 2.0.12", + "socket2 0.5.10", + "thiserror 2.0.16", "tinyvec", "tokio", "tracing", @@ -1753,10 +1746,10 @@ dependencies = [ "moka", "once_cell", "parking_lot", - "rand 0.9.0", + "rand 0.9.2", "resolv-conf", "smallvec", - "thiserror 2.0.12", + "thiserror 2.0.16", "tokio", "tracing", ] @@ -1795,28 +1788,6 @@ dependencies = [ "tracing", ] -[[package]] -name = "hostname" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a56f203cd1c76362b69e3863fd987520ac36cf70a8c92627449b2f64a8cf7d65" -dependencies = [ - "cfg-if", - "libc", - "windows-link", -] - -[[package]] -name = "http" -version = "0.2.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "601cbb57e577e2f5ef5be8e7b83f0f63994f25aa94d673e54a92d5c516d101f1" -dependencies = [ - "bytes", - "fnv", - "itoa", -] - [[package]] name = "http" version = "1.3.1" @@ -1835,7 +1806,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" dependencies = [ "bytes", - "http 1.3.1", + "http", ] [[package]] @@ -1846,7 +1817,7 @@ checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a" dependencies = [ "bytes", "futures-core", - "http 1.3.1", + "http", "http-body", "pin-project-lite", ] @@ -1871,20 +1842,22 @@ checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" [[package]] name = "hyper" -version = "1.6.0" +version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc2b571658e38e0c01b1fdca3bbbe93c00d3d71693ff2770043f8c29bc7d6f80" +checksum = "eb3aa54a13a0dfe7fbe3a59e0c76093041720fdc77b110cc0fc260fafb4dc51e" dependencies = [ + "atomic-waker", "bytes", "futures-channel", - "futures-util", + "futures-core", "h2", - "http 1.3.1", + "http", "http-body", "httparse", "httpdate", "itoa", "pin-project-lite", + "pin-utils", "smallvec", "tokio", "want", @@ -1892,12 +1865,11 @@ dependencies = [ [[package]] name = "hyper-rustls" -version = "0.27.5" +version = "0.27.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d191583f3da1305256f22463b9bb0471acad48a4e534a5218b9963e9c1f59b2" +checksum = "e3c93eb611681b207e1fe55d5a71ecf91572ec8a6705cdb6857f7d8d5242cf58" dependencies = [ - "futures-util", - "http 1.3.1", + "http", "hyper", "hyper-util", "rustls", @@ -1905,7 +1877,7 @@ dependencies = [ "tokio", "tokio-rustls", "tower-service", - "webpki-roots", + "webpki-roots 1.0.2", ] [[package]] @@ -1939,41 +1911,48 @@ dependencies = [ [[package]] name = "hyper-util" -version = "0.1.11" +version = "0.1.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "497bbc33a26fdd4af9ed9c70d63f61cf56a938375fbb32df34db9b1cd6d643f2" +checksum = "3c6995591a8f1380fcb4ba966a252a4b29188d51d2b89e3a252f5305be65aea8" dependencies = [ + "base64", "bytes", "futures-channel", + "futures-core", "futures-util", - "http 1.3.1", + "http", "http-body", "hyper", + "ipnet", "libc", + "percent-encoding", "pin-project-lite", - "socket2 0.5.9", + "socket2 0.6.0", + "system-configuration", "tokio", "tower-service", "tracing", + "windows-registry", ] [[package]] name = "icu_collections" -version = "1.5.0" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db2fa452206ebee18c4b5c2274dbf1de17008e874b4dc4f0aea9d01ca79e4526" +checksum = "200072f5d0e3614556f94a9930d5dc3e0662a652823904c3a75dc3b0af7fee47" dependencies = [ "displaydoc", + "potential_utf", "yoke", "zerofrom", "zerovec", ] [[package]] -name = "icu_locid" -version = "1.5.0" +name = "icu_locale_core" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13acbb8371917fc971be86fc8057c41a64b521c184808a698c02acc242dbf637" +checksum = "0cde2700ccaed3872079a65fb1a78f6c0a36c91570f28755dda67bc8f7d9f00a" dependencies = [ "displaydoc", "litemap", @@ -1982,31 +1961,11 @@ dependencies = [ "zerovec", ] -[[package]] -name = "icu_locid_transform" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01d11ac35de8e40fdeda00d9e1e9d92525f3f9d887cdd7aa81d727596788b54e" -dependencies = [ - "displaydoc", - "icu_locid", - "icu_locid_transform_data", - "icu_provider", - "tinystr", - "zerovec", -] - -[[package]] -name = "icu_locid_transform_data" -version = "1.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7515e6d781098bf9f7205ab3fc7e9709d34554ae0b21ddbcb5febfa4bc7df11d" - [[package]] name = "icu_normalizer" -version = "1.5.0" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19ce3e0da2ec68599d193c93d088142efd7f9c5d6fc9b803774855747dc6a84f" +checksum = "436880e8e18df4d7bbc06d58432329d6458cc84531f7ac5f024e93deadb37979" dependencies = [ "displaydoc", "icu_collections", @@ -2014,67 +1973,54 @@ dependencies = [ "icu_properties", "icu_provider", "smallvec", - "utf16_iter", - "utf8_iter", - "write16", "zerovec", ] [[package]] name = "icu_normalizer_data" -version = "1.5.1" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5e8338228bdc8ab83303f16b797e177953730f601a96c25d10cb3ab0daa0cb7" +checksum = "00210d6893afc98edb752b664b8890f0ef174c8adbb8d0be9710fa66fbbf72d3" [[package]] name = "icu_properties" -version = "1.5.1" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93d6020766cfc6302c15dbbc9c8778c37e62c14427cb7f6e601d849e092aeef5" +checksum = "016c619c1eeb94efb86809b015c58f479963de65bdb6253345c1a1276f22e32b" dependencies = [ "displaydoc", "icu_collections", - "icu_locid_transform", + "icu_locale_core", "icu_properties_data", "icu_provider", - "tinystr", + "potential_utf", + "zerotrie", "zerovec", ] [[package]] name = "icu_properties_data" -version = "1.5.1" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85fb8799753b75aee8d2a21d7c14d9f38921b54b3dbda10f5a3c7a7b82dba5e2" +checksum = "298459143998310acd25ffe6810ed544932242d3f07083eee1084d83a71bd632" [[package]] name = "icu_provider" -version = "1.5.0" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ed421c8a8ef78d3e2dbc98a973be2f3770cb42b606e3ab18d6237c4dfde68d9" +checksum = "03c80da27b5f4187909049ee2d72f276f0d9f99a42c306bd0131ecfe04d8e5af" dependencies = [ "displaydoc", - "icu_locid", - "icu_provider_macros", + "icu_locale_core", "stable_deref_trait", "tinystr", "writeable", "yoke", "zerofrom", + "zerotrie", "zerovec", ] -[[package]] -name = "icu_provider_macros" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - [[package]] name = "identify-example" version = "0.1.0" @@ -2087,9 +2033,9 @@ dependencies = [ [[package]] name = "idna" -version = "1.0.3" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e" +checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de" dependencies = [ "idna_adapter", "smallvec", @@ -2098,9 +2044,9 @@ dependencies = [ [[package]] name = "idna_adapter" -version = "1.2.0" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "daca1df1c957320b2cf139ac61e7bd64fed304c5040df000a745aa1de3b4ef71" +checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344" dependencies = [ "icu_normalizer", "icu_properties", @@ -2141,20 +2087,20 @@ dependencies = [ [[package]] name = "igd-next" -version = "0.16.1" +version = "0.16.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d06464e726471718db9ad3fefc020529fabcde03313a0fc3967510e2db5add12" +checksum = "516893339c97f6011282d5825ac94fc1c7aad5cad26bdc2d0cee068c0bf97f97" dependencies = [ "async-trait", "attohttpc", "bytes", "futures", - "http 1.3.1", + "http", "http-body-util", "hyper", "hyper-util", "log", - "rand 0.9.0", + "rand 0.9.2", "tokio", "url", "xmltree", @@ -2172,12 +2118,12 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.9.0" +version = "2.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cea70ddb795996207ad57735b50c5982d8844f38ba9ee5f1aedcfb708a2aa11e" +checksum = "92119844f513ffa41556430369ab02c295a3578af21cf945caa3e9e0c2481ac3" dependencies = [ "equivalent", - "hashbrown 0.15.2", + "hashbrown 0.15.5", ] [[package]] @@ -2240,7 +2186,7 @@ dependencies = [ "serde_json", "thirtyfour", "tokio", - "tower-http", + "tower-http 0.5.2", "tracing", "tracing-subscriber", "wasm-bindgen", @@ -2249,13 +2195,24 @@ dependencies = [ "web-time 1.1.0", ] +[[package]] +name = "io-uring" +version = "0.7.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "046fa2d4d00aea763528b4950358d0ead425372445dc8ff86312b3c69ff7727b" +dependencies = [ + "bitflags 2.9.4", + "cfg-if", + "libc", +] + [[package]] name = "ipconfig" version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b58db92f96b720de98181bbbe63c831e87005ab460c1bf306eb2622b4707997f" dependencies = [ - "socket2 0.5.9", + "socket2 0.5.10", "widestring", "windows-sys 0.48.0", "winreg", @@ -2290,13 +2247,23 @@ version = "2.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" +[[package]] +name = "iri-string" +version = "0.7.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dbc5ebe9c3a1a7a5127f920a418f7585e9e758e911d0466ed004f393b0e380b2" +dependencies = [ + "memchr", + "serde", +] + [[package]] name = "is-terminal" version = "0.4.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e04d7f318608d35d4b61ddd75cbdaee86b023ebe2bd5a66ee0915f0bf93095a9" dependencies = [ - "hermit-abi 0.5.0", + "hermit-abi", "libc", "windows-sys 0.59.0", ] @@ -2333,9 +2300,9 @@ checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" [[package]] name = "jiff" -version = "0.2.6" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f33145a5cbea837164362c7bd596106eb7c5198f97d1ba6f6ebb3223952e488" +checksum = "be1f93b8b1eb69c77f24bbb0afdf66f54b632ee39af40ca21c4365a1d7347e49" dependencies = [ "jiff-static", "log", @@ -2346,9 +2313,9 @@ dependencies = [ [[package]] name = "jiff-static" -version = "0.2.6" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43ce13c40ec6956157a3635d97a1ee2df323b263f09ea14165131289cb0f5c19" +checksum = "03343451ff899767262ec32146f6d559dd759fdadf42ff0e227c7c48f72594b4" dependencies = [ "proc-macro2", "quote", @@ -2357,9 +2324,9 @@ dependencies = [ [[package]] name = "js-sys" -version = "0.3.77" +version = "0.3.78" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" +checksum = "0c0b063578492ceec17683ef2f8c5e89121fbd0b172cbc280635ab7567db2738" dependencies = [ "once_cell", "wasm-bindgen", @@ -2408,9 +2375,9 @@ checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" [[package]] name = "libc" -version = "0.2.174" +version = "0.2.175" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1171693293099992e19cddea4e8b849964e9846f4acee11b3948bcc337be8776" +checksum = "6a82ae493e598baaea5209805c49bbf2ea7de956d50d7da0da1164f9c6d28543" [[package]] name = "libp2p" @@ -2420,11 +2387,11 @@ dependencies = [ "either", "futures", "futures-timer", - "getrandom 0.2.15", + "getrandom 0.2.16", "libp2p-allow-block-list", "libp2p-autonat", "libp2p-connection-limits", - "libp2p-core", + "libp2p-core 0.43.1", "libp2p-dcutr", "libp2p-dns", "libp2p-floodsub", @@ -2438,14 +2405,14 @@ dependencies = [ "libp2p-mplex", "libp2p-noise", "libp2p-ping", - "libp2p-plaintext", + "libp2p-plaintext 0.43.0", "libp2p-pnet", "libp2p-quic", "libp2p-relay", "libp2p-rendezvous", "libp2p-request-response", - "libp2p-swarm", - "libp2p-tcp", + "libp2p-swarm 0.47.0", + "libp2p-tcp 0.44.0", "libp2p-tls", "libp2p-uds", "libp2p-upnp", @@ -2453,11 +2420,11 @@ dependencies = [ "libp2p-websocket", "libp2p-websocket-websys", "libp2p-webtransport-websys", - "libp2p-yamux", + "libp2p-yamux 0.47.0", "multiaddr", "pin-project", - "rw-stream-sink", - "thiserror 2.0.12", + "rw-stream-sink 0.4.0", + "thiserror 2.0.16", "tokio", "tracing-subscriber", ] @@ -2466,11 +2433,11 @@ dependencies = [ name = "libp2p-allow-block-list" version = "0.6.0" dependencies = [ - "libp2p-core", + "libp2p-core 0.43.1", "libp2p-identity", - "libp2p-swarm", + "libp2p-swarm 0.47.0", "libp2p-swarm-derive", - "libp2p-swarm-test", + "libp2p-swarm-test 0.6.0", "tokio", ] @@ -2484,17 +2451,17 @@ dependencies = [ "futures", "futures-bounded", "futures-timer", - "libp2p-core", + "libp2p-core 0.43.1", "libp2p-identify", "libp2p-identity", "libp2p-request-response", - "libp2p-swarm", - "libp2p-swarm-test", + "libp2p-swarm 0.47.0", + "libp2p-swarm-test 0.6.0", "quick-protobuf", - "quick-protobuf-codec", + "quick-protobuf-codec 0.3.1", "rand 0.8.5", "rand_core 0.6.4", - "thiserror 2.0.12", + "thiserror 2.0.16", "tokio", "tracing", "tracing-subscriber", @@ -2505,13 +2472,13 @@ dependencies = [ name = "libp2p-connection-limits" version = "0.6.0" dependencies = [ - "libp2p-core", + "libp2p-core 0.43.1", "libp2p-identify", "libp2p-identity", "libp2p-ping", - "libp2p-swarm", + "libp2p-swarm 0.47.0", "libp2p-swarm-derive", - "libp2p-swarm-test", + "libp2p-swarm-test 0.6.0", "quickcheck-ext", "rand 0.8.5", "tokio", @@ -2530,16 +2497,41 @@ dependencies = [ "libp2p-noise", "multiaddr", "multihash", - "multistream-select", + "multistream-select 0.13.0", "parking_lot", "pin-project", "quick-protobuf", "rand 0.8.5", - "rw-stream-sink", - "thiserror 2.0.12", + "rw-stream-sink 0.4.0", + "thiserror 2.0.16", "tokio", "tracing", - "unsigned-varint", + "unsigned-varint 0.8.0", + "web-time 1.1.0", +] + +[[package]] +name = "libp2p-core" +version = "0.43.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d28e2d2def7c344170f5c6450c0dbe3dfef655610dbfde2f6ac28a527abbe36" +dependencies = [ + "either", + "fnv", + "futures", + "futures-timer", + "libp2p-identity", + "multiaddr", + "multihash", + "multistream-select 0.13.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot", + "pin-project", + "quick-protobuf", + "rand 0.8.5", + "rw-stream-sink 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "thiserror 2.0.16", + "tracing", + "unsigned-varint 0.8.0", "web-time 1.1.0", ] @@ -2553,18 +2545,18 @@ dependencies = [ "futures-bounded", "futures-timer", "hashlink", - "libp2p-core", + "libp2p-core 0.43.1", "libp2p-identify", "libp2p-identity", - "libp2p-plaintext", + "libp2p-plaintext 0.43.0", "libp2p-relay", - "libp2p-swarm", - "libp2p-swarm-test", - "libp2p-tcp", - "libp2p-yamux", + "libp2p-swarm 0.47.0", + "libp2p-swarm-test 0.6.0", + "libp2p-tcp 0.44.0", + "libp2p-yamux 0.47.0", "quick-protobuf", - "quick-protobuf-codec", - "thiserror 2.0.12", + "quick-protobuf-codec 0.3.1", + "thiserror 2.0.16", "tokio", "tracing", "tracing-subscriber", @@ -2578,7 +2570,7 @@ dependencies = [ "async-trait", "futures", "hickory-resolver", - "libp2p-core", + "libp2p-core 0.43.1", "libp2p-identity", "parking_lot", "smallvec", @@ -2596,14 +2588,14 @@ dependencies = [ "cuckoofilter", "fnv", "futures", - "libp2p-core", + "libp2p-core 0.43.1", "libp2p-identity", - "libp2p-swarm", + "libp2p-swarm 0.47.0", "quick-protobuf", - "quick-protobuf-codec", + "quick-protobuf-codec 0.3.1", "rand 0.8.5", "smallvec", - "thiserror 2.0.12", + "thiserror 2.0.16", "tracing", ] @@ -2620,16 +2612,16 @@ dependencies = [ "fnv", "futures", "futures-timer", - "getrandom 0.2.15", + "getrandom 0.2.16", "hashlink", "hex_fmt", - "libp2p-core", + "libp2p-core 0.43.1 (registry+https://github.com/rust-lang/crates.io-index)", "libp2p-identity", - "libp2p-swarm", - "libp2p-swarm-test", + "libp2p-swarm 0.47.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-swarm-test 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", "prometheus-client", "quick-protobuf", - "quick-protobuf-codec", + "quick-protobuf-codec 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "quickcheck-ext", "rand 0.8.5", "regex", @@ -2650,14 +2642,14 @@ dependencies = [ "futures", "futures-bounded", "futures-timer", - "libp2p-core", + "libp2p-core 0.43.1", "libp2p-identity", - "libp2p-swarm", - "libp2p-swarm-test", + "libp2p-swarm 0.47.0", + "libp2p-swarm-test 0.6.0", "quick-protobuf", - "quick-protobuf-codec", + "quick-protobuf-codec 0.3.1", "smallvec", - "thiserror 2.0.12", + "thiserror 2.0.16", "tokio", "tracing", "tracing-subscriber", @@ -2685,7 +2677,7 @@ dependencies = [ "serde", "serde_json", "sha2", - "thiserror 2.0.12", + "thiserror 2.0.16", "tracing", "zeroize", ] @@ -2701,21 +2693,21 @@ dependencies = [ "futures", "futures-bounded", "futures-timer", - "libp2p-core", + "libp2p-core 0.43.1", "libp2p-identify", "libp2p-identity", "libp2p-noise", - "libp2p-swarm", - "libp2p-swarm-test", - "libp2p-yamux", + "libp2p-swarm 0.47.0", + "libp2p-swarm-test 0.6.0", + "libp2p-yamux 0.47.0", "quick-protobuf", - "quick-protobuf-codec", + "quick-protobuf-codec 0.3.1", "quickcheck-ext", "rand 0.8.5", "serde", "sha2", "smallvec", - "thiserror 2.0.12", + "thiserror 2.0.16", "tokio", "tracing", "tracing-subscriber", @@ -2730,10 +2722,10 @@ dependencies = [ "futures", "hickory-proto", "if-watch", - "libp2p-core", + "libp2p-core 0.43.1", "libp2p-identity", - "libp2p-swarm", - "libp2p-swarm-test", + "libp2p-swarm 0.47.0", + "libp2p-swarm-test 0.6.0", "rand 0.8.5", "smallvec", "socket2 0.6.0", @@ -2746,12 +2738,12 @@ dependencies = [ name = "libp2p-memory-connection-limits" version = "0.5.0" dependencies = [ - "libp2p-core", + "libp2p-core 0.43.1", "libp2p-identify", "libp2p-identity", - "libp2p-swarm", + "libp2p-swarm 0.47.0", "libp2p-swarm-derive", - "libp2p-swarm-test", + "libp2p-swarm-test 0.6.0", "memory-stats", "sysinfo", "tokio", @@ -2763,7 +2755,7 @@ name = "libp2p-metrics" version = "0.17.0" dependencies = [ "futures", - "libp2p-core", + "libp2p-core 0.43.1", "libp2p-dcutr", "libp2p-gossipsub", "libp2p-identify", @@ -2771,7 +2763,7 @@ dependencies = [ "libp2p-kad", "libp2p-ping", "libp2p-relay", - "libp2p-swarm", + "libp2p-swarm 0.47.0", "pin-project", "prometheus-client", "web-time 1.1.0", @@ -2785,11 +2777,11 @@ dependencies = [ "bytes", "criterion", "futures", - "libp2p-core", + "libp2p-core 0.43.1", "libp2p-identity", "libp2p-muxer-test-harness", - "libp2p-plaintext", - "libp2p-tcp", + "libp2p-plaintext 0.43.0", + "libp2p-tcp 0.44.0", "nohash-hasher", "parking_lot", "quickcheck-ext", @@ -2798,7 +2790,7 @@ dependencies = [ "tokio", "tracing", "tracing-subscriber", - "unsigned-varint", + "unsigned-varint 0.8.0", ] [[package]] @@ -2808,7 +2800,7 @@ dependencies = [ "futures", "futures-timer", "futures_ringbuf", - "libp2p-core", + "libp2p-core 0.43.1", "tracing", ] @@ -2820,7 +2812,7 @@ dependencies = [ "bytes", "futures", "futures_ringbuf", - "libp2p-core", + "libp2p-core 0.43.1", "libp2p-identity", "multiaddr", "multihash", @@ -2829,7 +2821,7 @@ dependencies = [ "rand 0.8.5", "snow", "static_assertions", - "thiserror 2.0.12", + "thiserror 2.0.16", "tracing", "tracing-subscriber", "x25519-dalek", @@ -2842,10 +2834,10 @@ version = "0.1.0" dependencies = [ "hashlink", "libp2p", - "libp2p-core", + "libp2p-core 0.43.1", "libp2p-identity", - "libp2p-swarm", - "libp2p-swarm-test", + "libp2p-swarm 0.47.0", + "libp2p-swarm-test 0.6.0", "serde_json", "tokio", ] @@ -2860,16 +2852,16 @@ dependencies = [ "futures-bounded", "futures-timer", "libp2p", - "libp2p-core", + "libp2p-core 0.43.1", "libp2p-identity", - "libp2p-swarm", - "libp2p-swarm-test", - "libp2p-tcp", + "libp2p-swarm 0.47.0", + "libp2p-swarm-test 0.6.0", + "libp2p-tcp 0.44.0", "libp2p-tls", - "libp2p-yamux", + "libp2p-yamux 0.47.0", "serde", "serde_json", - "thiserror 2.0.12", + "thiserror 2.0.16", "tokio", "tracing", "tracing-subscriber", @@ -2882,10 +2874,10 @@ version = "0.47.0" dependencies = [ "futures", "futures-timer", - "libp2p-core", + "libp2p-core 0.43.1", "libp2p-identity", - "libp2p-swarm", - "libp2p-swarm-test", + "libp2p-swarm 0.47.0", + "libp2p-swarm-test 0.6.0", "quickcheck-ext", "rand 0.8.5", "tokio", @@ -2901,27 +2893,43 @@ dependencies = [ "bytes", "futures", "futures_ringbuf", - "libp2p-core", + "libp2p-core 0.43.1", "libp2p-identity", "quick-protobuf", - "quick-protobuf-codec", + "quick-protobuf-codec 0.3.1", "quickcheck-ext", "tracing", "tracing-subscriber", ] +[[package]] +name = "libp2p-plaintext" +version = "0.43.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e659439578fc6d305da8303834beb9d62f155f40e7f5b9d81c9f2b2c69d1926" +dependencies = [ + "asynchronous-codec", + "bytes", + "futures", + "libp2p-core 0.43.1 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-identity", + "quick-protobuf", + "quick-protobuf-codec 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "tracing", +] + [[package]] name = "libp2p-pnet" version = "0.26.0" dependencies = [ "futures", - "libp2p-core", + "libp2p-core 0.43.1", "libp2p-identity", "libp2p-noise", - "libp2p-swarm", - "libp2p-tcp", + "libp2p-swarm 0.47.0", + "libp2p-tcp 0.44.0", "libp2p-websocket", - "libp2p-yamux", + "libp2p-yamux 0.47.0", "pin-project", "quickcheck-ext", "rand 0.8.5", @@ -2938,20 +2946,20 @@ dependencies = [ "futures", "futures-timer", "if-watch", - "libp2p-core", + "libp2p-core 0.43.1", "libp2p-identity", "libp2p-muxer-test-harness", "libp2p-noise", - "libp2p-tcp", + "libp2p-tcp 0.44.0", "libp2p-tls", - "libp2p-yamux", + "libp2p-yamux 0.47.0", "quickcheck", "quinn", "rand 0.8.5", "ring", "rustls", "socket2 0.6.0", - "thiserror 2.0.12", + "thiserror 2.0.16", "tokio", "tracing", "tracing-subscriber", @@ -2967,19 +2975,19 @@ dependencies = [ "futures", "futures-bounded", "futures-timer", - "libp2p-core", + "libp2p-core 0.43.1", "libp2p-identity", "libp2p-ping", - "libp2p-plaintext", - "libp2p-swarm", - "libp2p-swarm-test", - "libp2p-yamux", + "libp2p-plaintext 0.43.0", + "libp2p-swarm 0.47.0", + "libp2p-swarm-test 0.6.0", + "libp2p-yamux 0.47.0", "quick-protobuf", - "quick-protobuf-codec", + "quick-protobuf-codec 0.3.1", "quickcheck-ext", "rand 0.8.5", "static_assertions", - "thiserror 2.0.12", + "thiserror 2.0.16", "tokio", "tracing", "tracing-subscriber", @@ -2995,15 +3003,15 @@ dependencies = [ "bimap", "futures", "futures-timer", - "libp2p-core", + "libp2p-core 0.43.1", "libp2p-identity", "libp2p-request-response", - "libp2p-swarm", - "libp2p-swarm-test", + "libp2p-swarm 0.47.0", + "libp2p-swarm-test 0.6.0", "quick-protobuf", - "quick-protobuf-codec", + "quick-protobuf-codec 0.3.1", "rand 0.8.5", - "thiserror 2.0.12", + "thiserror 2.0.16", "tokio", "tracing", "tracing-subscriber", @@ -3020,10 +3028,10 @@ dependencies = [ "futures", "futures-bounded", "futures_ringbuf", - "libp2p-core", + "libp2p-core 0.43.1", "libp2p-identity", - "libp2p-swarm", - "libp2p-swarm-test", + "libp2p-swarm 0.47.0", + "libp2p-swarm-test 0.6.0", "rand 0.8.5", "serde", "serde_json", @@ -3056,10 +3064,10 @@ name = "libp2p-stream" version = "0.4.0-alpha" dependencies = [ "futures", - "libp2p-core", + "libp2p-core 0.43.1", "libp2p-identity", - "libp2p-swarm", - "libp2p-swarm-test", + "libp2p-swarm 0.47.0", + "libp2p-swarm-test 0.6.0", "rand 0.8.5", "tokio", "tracing", @@ -3075,18 +3083,18 @@ dependencies = [ "fnv", "futures", "futures-timer", - "getrandom 0.2.15", + "getrandom 0.2.16", "hashlink", - "libp2p-core", + "libp2p-core 0.43.1", "libp2p-identify", "libp2p-identity", "libp2p-kad", "libp2p-ping", - "libp2p-plaintext", + "libp2p-plaintext 0.43.0", "libp2p-swarm-derive", - "libp2p-swarm-test", - "libp2p-yamux", - "multistream-select", + "libp2p-swarm-test 0.6.0", + "libp2p-yamux 0.47.0", + "multistream-select 0.13.0", "quickcheck-ext", "rand 0.8.5", "smallvec", @@ -3098,6 +3106,27 @@ dependencies = [ "web-time 1.1.0", ] +[[package]] +name = "libp2p-swarm" +version = "0.47.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6aa762e5215919a34e31c35d4b18bf2e18566ecab7f8a3d39535f4a3068f8b62" +dependencies = [ + "either", + "fnv", + "futures", + "futures-timer", + "libp2p-core 0.43.1 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-identity", + "lru", + "multistream-select 0.13.0 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.8.5", + "smallvec", + "tokio", + "tracing", + "web-time 1.1.0", +] + [[package]] name = "libp2p-swarm-derive" version = "0.35.1" @@ -3114,12 +3143,30 @@ dependencies = [ "async-trait", "futures", "futures-timer", - "libp2p-core", + "libp2p-core 0.43.1", + "libp2p-identity", + "libp2p-plaintext 0.43.0", + "libp2p-swarm 0.47.0", + "libp2p-tcp 0.44.0", + "libp2p-yamux 0.47.0", + "tracing", +] + +[[package]] +name = "libp2p-swarm-test" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b149112570d507efe305838c7130835955a0b1147aa8051c1c3867a83175cf6" +dependencies = [ + "async-trait", + "futures", + "futures-timer", + "libp2p-core 0.43.1 (registry+https://github.com/rust-lang/crates.io-index)", "libp2p-identity", - "libp2p-plaintext", - "libp2p-swarm", - "libp2p-tcp", - "libp2p-yamux", + "libp2p-plaintext 0.43.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-swarm 0.47.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-tcp 0.44.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-yamux 0.47.0 (registry+https://github.com/rust-lang/crates.io-index)", "tracing", ] @@ -3131,13 +3178,29 @@ dependencies = [ "futures-timer", "if-watch", "libc", - "libp2p-core", + "libp2p-core 0.43.1", "socket2 0.6.0", "tokio", "tracing", "tracing-subscriber", ] +[[package]] +name = "libp2p-tcp" +version = "0.44.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "65b4e030c52c46c8d01559b2b8ca9b7c4185f10576016853129ca1fe5cd1a644" +dependencies = [ + "futures", + "futures-timer", + "if-watch", + "libc", + "libp2p-core 0.43.1 (registry+https://github.com/rust-lang/crates.io-index)", + "socket2 0.5.10", + "tokio", + "tracing", +] + [[package]] name = "libp2p-tls" version = "0.6.2" @@ -3145,15 +3208,15 @@ dependencies = [ "futures", "futures-rustls", "hex-literal", - "libp2p-core", + "libp2p-core 0.43.1", "libp2p-identity", - "libp2p-swarm", - "libp2p-yamux", + "libp2p-swarm 0.47.0", + "libp2p-yamux 0.47.0", "rcgen", "ring", "rustls", "rustls-webpki", - "thiserror 2.0.12", + "thiserror 2.0.16", "tokio", "x509-parser 0.17.0", "yasna", @@ -3164,7 +3227,7 @@ name = "libp2p-uds" version = "0.43.0" dependencies = [ "futures", - "libp2p-core", + "libp2p-core 0.43.1", "tempfile", "tokio", "tracing", @@ -3177,8 +3240,8 @@ dependencies = [ "futures", "futures-timer", "igd-next", - "libp2p-core", - "libp2p-swarm", + "libp2p-core 0.43.1", + "libp2p-swarm 0.47.0", "tokio", "tracing", ] @@ -3192,7 +3255,7 @@ dependencies = [ "futures-timer", "hex", "if-watch", - "libp2p-core", + "libp2p-core 0.43.1", "libp2p-identity", "libp2p-noise", "libp2p-webrtc-utils", @@ -3201,7 +3264,7 @@ dependencies = [ "rand 0.8.5", "rcgen", "stun", - "thiserror 2.0.12", + "thiserror 2.0.16", "tokio", "tokio-util", "tracing", @@ -3218,11 +3281,11 @@ dependencies = [ "futures", "hex", "hex-literal", - "libp2p-core", + "libp2p-core 0.43.1", "libp2p-identity", "libp2p-noise", "quick-protobuf", - "quick-protobuf-codec", + "quick-protobuf-codec 0.3.1", "rand 0.8.5", "serde", "sha2", @@ -3236,14 +3299,14 @@ version = "0.4.0" dependencies = [ "bytes", "futures", - "getrandom 0.2.15", + "getrandom 0.2.16", "hex", "js-sys", - "libp2p-core", + "libp2p-core 0.43.1", "libp2p-identity", "libp2p-webrtc-utils", "send_wrapper 0.6.0", - "thiserror 2.0.12", + "thiserror 2.0.16", "tracing", "wasm-bindgen", "wasm-bindgen-futures", @@ -3257,20 +3320,20 @@ dependencies = [ "either", "futures", "futures-rustls", - "libp2p-core", + "libp2p-core 0.43.1", "libp2p-dns", "libp2p-identity", - "libp2p-tcp", + "libp2p-tcp 0.44.0", "parking_lot", "pin-project-lite", "rcgen", - "rw-stream-sink", + "rw-stream-sink 0.4.0", "soketto", - "thiserror 2.0.12", + "thiserror 2.0.16", "tokio", "tracing", "url", - "webpki-roots", + "webpki-roots 0.26.11", ] [[package]] @@ -3280,12 +3343,12 @@ dependencies = [ "bytes", "futures", "js-sys", - "libp2p-core", + "libp2p-core 0.43.1", "libp2p-identity", "libp2p-noise", - "libp2p-yamux", + "libp2p-yamux 0.47.0", "send_wrapper 0.6.0", - "thiserror 2.0.12", + "thiserror 2.0.16", "tracing", "wasm-bindgen", "web-sys", @@ -3297,14 +3360,14 @@ version = "0.5.1" dependencies = [ "futures", "js-sys", - "libp2p-core", + "libp2p-core 0.43.1", "libp2p-identity", "libp2p-noise", "multiaddr", "multibase", "multihash", "send_wrapper 0.6.0", - "thiserror 2.0.12", + "thiserror 2.0.16", "tracing", "wasm-bindgen", "wasm-bindgen-futures", @@ -3317,48 +3380,57 @@ version = "0.47.0" dependencies = [ "either", "futures", - "libp2p-core", + "libp2p-core 0.43.1", "libp2p-muxer-test-harness", - "thiserror 2.0.12", + "thiserror 2.0.16", "tokio", "tracing", "yamux 0.12.1", - "yamux 0.13.4", + "yamux 0.13.6", +] + +[[package]] +name = "libp2p-yamux" +version = "0.47.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f15df094914eb4af272acf9adaa9e287baa269943f32ea348ba29cfb9bfc60d8" +dependencies = [ + "either", + "futures", + "libp2p-core 0.43.1 (registry+https://github.com/rust-lang/crates.io-index)", + "thiserror 2.0.16", + "tracing", + "yamux 0.12.1", + "yamux 0.13.6", ] [[package]] name = "libredox" -version = "0.1.3" +version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" +checksum = "416f7e718bdb06000964960ffa43b4335ad4012ae8b99060261aa4a8088d5ccb" dependencies = [ - "bitflags 2.9.0", + "bitflags 2.9.4", "libc", ] [[package]] name = "linux-raw-sys" -version = "0.4.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab" - -[[package]] -name = "linux-raw-sys" -version = "0.9.4" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd945864f07fe9f5371a27ad7b52a172b4b499999f1d97574c9fa68373937e12" +checksum = "df1d3c3b53da64cf5760482273a98e575c651a67eec7f77df96b5b642de8f039" [[package]] name = "litemap" -version = "0.7.5" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23fb14cb19457329c82206317a5663005a4d404783dc74f4252769b0d5f42856" +checksum = "241eaef5fd12c88705a01fc1066c48c4b36e0dd4377dcdc7ec3942cea7a69956" [[package]] name = "lock_api" -version = "0.4.12" +version = "0.4.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" +checksum = "96936507f153605bddfcda068dd804796c84324ed2510809e5b2a624c81da765" dependencies = [ "autocfg", "scopeguard", @@ -3366,9 +3438,9 @@ dependencies = [ [[package]] name = "log" -version = "0.4.27" +version = "0.4.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94" +checksum = "34080505efa8e45a4b816c349525ebe327ceaa8559756f0356cba97ef3bf7432" [[package]] name = "loom" @@ -3383,13 +3455,28 @@ dependencies = [ "tracing-subscriber", ] +[[package]] +name = "lru" +version = "0.12.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "234cf4f4a04dc1f57e24b96cc0cd600cf2af460d4161ac5ecdd0af8e1f3b2a38" +dependencies = [ + "hashbrown 0.15.5", +] + +[[package]] +name = "lru-slab" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "112b39cec0b298b6c1999fee3e31427f74f676e4cb9879ed1a121b43661a4154" + [[package]] name = "matchers" -version = "0.1.0" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558" +checksum = "d1525a2a28c7f4fa0fc98bb91ae755d1e2d1505079e05539e35bc876b5d65ae9" dependencies = [ - "regex-automata 0.1.10", + "regex-automata", ] [[package]] @@ -3410,9 +3497,9 @@ dependencies = [ [[package]] name = "memchr" -version = "2.7.4" +version = "2.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" +checksum = "32a282da65faaf38286cf3be983213fcf1d2e2a58700e808f83f4ea9a4804bc0" [[package]] name = "memoffset" @@ -3484,22 +3571,22 @@ checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" [[package]] name = "miniz_oxide" -version = "0.8.8" +version = "0.8.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3be647b768db090acb35d5ec5db2b0e1f1de11133ca123b9eacf5137868f892a" +checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" dependencies = [ "adler2", ] [[package]] name = "mio" -version = "1.0.3" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2886843bf800fba2e3377cff24abf6379b4c4d5c6681eaf9ea5b0d15090450bd" +checksum = "78bed444cc8a2160f01cbcf811ef18cac863ad68ae8ca62092e8db51d51c761c" dependencies = [ "libc", - "wasi 0.11.0+wasi-snapshot-preview1", - "windows-sys 0.52.0", + "wasi 0.11.1+wasi-snapshot-preview1", + "windows-sys 0.59.0", ] [[package]] @@ -3536,7 +3623,7 @@ dependencies = [ "percent-encoding", "serde", "static_assertions", - "unsigned-varint", + "unsigned-varint 0.8.0", "url", ] @@ -3562,7 +3649,7 @@ dependencies = [ "quickcheck", "rand 0.8.5", "serde", - "unsigned-varint", + "unsigned-varint 0.8.0", ] [[package]] @@ -3574,13 +3661,27 @@ dependencies = [ "futures_ringbuf", "pin-project", "quickcheck-ext", - "rw-stream-sink", + "rw-stream-sink 0.4.0", "smallvec", "tokio", "tokio-util", "tracing", "tracing-subscriber", - "unsigned-varint", + "unsigned-varint 0.8.0", +] + +[[package]] +name = "multistream-select" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea0df8e5eec2298a62b326ee4f0d7fe1a6b90a09dfcf9df37b38f947a8c42f19" +dependencies = [ + "bytes", + "futures", + "log", + "pin-project", + "smallvec", + "unsigned-varint 0.7.2", ] [[package]] @@ -3648,7 +3749,7 @@ dependencies = [ "log", "netlink-packet-core", "netlink-sys", - "thiserror 2.0.12", + "thiserror 2.0.16", ] [[package]] @@ -3704,12 +3805,11 @@ dependencies = [ [[package]] name = "nu-ansi-term" -version = "0.46.0" +version = "0.50.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84" +checksum = "d4a28e057d01f97e61255210fcff094d74ed0466038633e95017f5beb68e4399" dependencies = [ - "overload", - "winapi", + "windows-sys 0.52.0", ] [[package]] @@ -3748,11 +3848,11 @@ dependencies = [ [[package]] name = "num_cpus" -version = "1.16.0" +version = "1.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" +checksum = "91df4bbde75afed763b708b7eee1e8e7651e02d97f6d5dd763e89367e957b23b" dependencies = [ - "hermit-abi 0.3.9", + "hermit-abi", "libc", ] @@ -3793,6 +3893,12 @@ dependencies = [ "portable-atomic", ] +[[package]] +name = "once_cell_polyfill" +version = "1.70.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4895175b425cb1f87721b59f0f286c2092bd4af812243672510e1ac53e2e0ad" + [[package]] name = "oorandom" version = "11.1.5" @@ -3807,11 +3913,11 @@ checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381" [[package]] name = "openssl" -version = "0.10.72" +version = "0.10.73" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fedfea7d58a1f73118430a55da6a286e7b044961736ce96a16a17068ea25e5da" +checksum = "8505734d46c8ab1e19a1dce3aef597ad87dcb4c37e7188231769bd6bd51cebf8" dependencies = [ - "bitflags 2.9.0", + "bitflags 2.9.4", "cfg-if", "foreign-types", "libc", @@ -3839,9 +3945,9 @@ checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e" [[package]] name = "openssl-sys" -version = "0.9.107" +version = "0.9.109" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8288979acd84749c744a9014b4382d42b8f7b2592847b5afb2ed29e5d16ede07" +checksum = "90096e2e47630d78b7d1c20952dc621f957103f8bc2c8359ec81290d75238571" dependencies = [ "cc", "libc", @@ -3857,7 +3963,7 @@ checksum = "1e32339a5dc40459130b3bd269e9892439f55b33e772d2a9d402a789baaf4e8a" dependencies = [ "futures-core", "futures-sink", - "indexmap 2.9.0", + "indexmap 2.11.3", "js-sys", "once_cell", "pin-project-lite", @@ -3903,7 +4009,7 @@ checksum = "91cf61a1868dacc576bf2b2a1c3e9ab150af7272909e80085c3173384fe11f76" dependencies = [ "async-trait", "futures-core", - "http 1.3.1", + "http", "opentelemetry 0.27.1", "opentelemetry-proto", "opentelemetry_sdk 0.27.1", @@ -4002,12 +4108,6 @@ dependencies = [ "num-traits", ] -[[package]] -name = "overload" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" - [[package]] name = "p256" version = "0.13.2" @@ -4040,9 +4140,9 @@ checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" [[package]] name = "parking_lot" -version = "0.12.3" +version = "0.12.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" +checksum = "70d58bf43669b5795d1576d0641cfb6fbb2057bf629506267a92807158584a13" dependencies = [ "lock_api", "parking_lot_core", @@ -4050,9 +4150,9 @@ dependencies = [ [[package]] name = "parking_lot_core" -version = "0.9.10" +version = "0.9.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" +checksum = "bc838d2a56b5b1a6c25f55575dfc605fabb63bb2365f6c2353ef9159aa69e4a5" dependencies = [ "cfg-if", "libc", @@ -4088,9 +4188,9 @@ dependencies = [ [[package]] name = "percent-encoding" -version = "2.3.1" +version = "2.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" +checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" [[package]] name = "pin-project" @@ -4180,17 +4280,16 @@ dependencies = [ [[package]] name = "polling" -version = "3.7.4" +version = "3.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a604568c3202727d1507653cb121dbd627a58684eb09a820fd746bee38b4442f" +checksum = "5d0e4f59085d47d8241c88ead0f274e8a0cb551f3625263c05eb8dd897c34218" dependencies = [ "cfg-if", "concurrent-queue", - "hermit-abi 0.4.0", + "hermit-abi", "pin-project-lite", - "rustix 0.38.44", - "tracing", - "windows-sys 0.59.0", + "rustix", + "windows-sys 0.61.0", ] [[package]] @@ -4218,9 +4317,9 @@ dependencies = [ [[package]] name = "portable-atomic" -version = "1.11.0" +version = "1.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "350e9b48cbc6b0e028b0473b114454c6316e57336ee184ceab6e53f72c178b3e" +checksum = "f84267b20a16ea918e43c6a88433c2d54fa145c92a811b5b047ccbe153674483" [[package]] name = "portable-atomic-util" @@ -4231,6 +4330,15 @@ dependencies = [ "portable-atomic", ] +[[package]] +name = "potential_utf" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "84df19adbe5b5a0782edcab45899906947ab039ccf4573713735ee7de1e6b08a" +dependencies = [ + "zerovec", +] + [[package]] name = "powerfmt" version = "0.2.0" @@ -4257,9 +4365,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.94" +version = "1.0.101" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a31971752e70b8b2686d7e46ec17fb38dad4051d94024c88df49b667caea9c84" +checksum = "89ae43fd86e4158d6db51ad8e2b80f313af9cc74f5c0e03ccb87de09998732de" dependencies = [ "unicode-ident", ] @@ -4329,8 +4437,21 @@ dependencies = [ "futures", "quick-protobuf", "quickcheck-ext", - "thiserror 2.0.12", - "unsigned-varint", + "thiserror 2.0.16", + "unsigned-varint 0.8.0", +] + +[[package]] +name = "quick-protobuf-codec" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "15a0580ab32b169745d7a39db2ba969226ca16738931be152a3209b409de2474" +dependencies = [ + "asynchronous-codec", + "bytes", + "quick-protobuf", + "thiserror 1.0.69", + "unsigned-varint 0.8.0", ] [[package]] @@ -4354,9 +4475,9 @@ dependencies = [ [[package]] name = "quinn" -version = "0.11.7" +version = "0.11.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3bd15a6f2967aef83887dcb9fec0014580467e33720d073560cf015a5683012" +checksum = "b9e20a958963c291dc322d98411f541009df2ced7b5a4f2bd52337638cfccf20" dependencies = [ "bytes", "cfg_aliases", @@ -4366,8 +4487,8 @@ dependencies = [ "quinn-udp", "rustc-hash", "rustls", - "socket2 0.5.9", - "thiserror 2.0.12", + "socket2 0.6.0", + "thiserror 2.0.16", "tokio", "tracing", "web-time 1.1.0", @@ -4375,19 +4496,20 @@ dependencies = [ [[package]] name = "quinn-proto" -version = "0.11.10" +version = "0.11.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b820744eb4dc9b57a3398183639c511b5a26d2ed702cedd3febaa1393caa22cc" +checksum = "f1906b49b0c3bc04b5fe5d86a77925ae6524a19b816ae38ce1e426255f1d8a31" dependencies = [ "bytes", - "getrandom 0.3.2", - "rand 0.9.0", + "getrandom 0.3.3", + "lru-slab", + "rand 0.9.2", "ring", "rustc-hash", "rustls", "rustls-pki-types", "slab", - "thiserror 2.0.12", + "thiserror 2.0.16", "tinyvec", "tracing", "web-time 1.1.0", @@ -4395,16 +4517,16 @@ dependencies = [ [[package]] name = "quinn-udp" -version = "0.5.11" +version = "0.5.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "541d0f57c6ec747a90738a52741d3221f7960e8ac2f0ff4b1a63680e033b4ab5" +checksum = "addec6a0dcad8a8d96a771f815f0eaf55f9d1805756410b39f5fa81332574cbd" dependencies = [ "cfg_aliases", "libc", "once_cell", - "socket2 0.5.9", + "socket2 0.6.0", "tracing", - "windows-sys 0.59.0", + "windows-sys 0.60.2", ] [[package]] @@ -4418,9 +4540,9 @@ dependencies = [ [[package]] name = "r-efi" -version = "5.2.0" +version = "5.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74765f6d916ee2faa39bc8e68e4f3ed8949b48cccdac59983d287a7cb71ce9c5" +checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" [[package]] name = "rand" @@ -4448,13 +4570,12 @@ dependencies = [ [[package]] name = "rand" -version = "0.9.0" +version = "0.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3779b94aeb87e8bd4e834cee3650289ee9e0d5677f976ecdb6d219e5f4f6cd94" +checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1" dependencies = [ "rand_chacha 0.9.0", "rand_core 0.9.3", - "zerocopy", ] [[package]] @@ -4502,7 +4623,7 @@ version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" dependencies = [ - "getrandom 0.2.15", + "getrandom 0.2.16", ] [[package]] @@ -4511,7 +4632,7 @@ version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" dependencies = [ - "getrandom 0.3.2", + "getrandom 0.3.3", ] [[package]] @@ -4525,9 +4646,9 @@ dependencies = [ [[package]] name = "rayon" -version = "1.10.0" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b418a60154510ca1a002a752ca9714984e21e4241e804d32555251faf8b78ffa" +checksum = "368f01d005bf8fd9b1206fb6fa653e6c4a81ceb1466406b81792d87c5677a58f" dependencies = [ "either", "rayon-core", @@ -4535,9 +4656,9 @@ dependencies = [ [[package]] name = "rayon-core" -version = "1.12.1" +version = "1.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2" +checksum = "22e18b0f0062d30d4230b2e85ff77fdfe4326feb054b9783a3460d8435c8ab91" dependencies = [ "crossbeam-deque", "crossbeam-utils", @@ -4578,67 +4699,52 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.5.11" +version = "0.5.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2f103c6d277498fbceb16e84d317e2a400f160f46904d5f5410848c829511a3" +checksum = "5407465600fb0548f1442edf71dd20683c6ed326200ace4b1ef0763521bb3b77" dependencies = [ - "bitflags 2.9.0", + "bitflags 2.9.4", ] [[package]] name = "redox_users" -version = "0.4.6" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43" +checksum = "a4e608c6638b9c18977b00b475ac1f28d14e84b27d8d42f70e0bf1e3dec127ac" dependencies = [ - "getrandom 0.2.15", + "getrandom 0.2.16", "libredox", - "thiserror 1.0.69", + "thiserror 2.0.16", ] [[package]] name = "regex" -version = "1.11.1" +version = "1.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" +checksum = "23d7fd106d8c02486a8d64e778353d1cffe08ce79ac2e82f540c86d0facf6912" dependencies = [ "aho-corasick", "memchr", - "regex-automata 0.4.9", - "regex-syntax 0.8.5", -] - -[[package]] -name = "regex-automata" -version = "0.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" -dependencies = [ - "regex-syntax 0.6.29", + "regex-automata", + "regex-syntax", ] [[package]] name = "regex-automata" -version = "0.4.9" +version = "0.4.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" +checksum = "6b9458fa0bfeeac22b5ca447c63aaf45f28439a709ccd244698632f9aa6394d6" dependencies = [ "aho-corasick", "memchr", - "regex-syntax 0.8.5", + "regex-syntax", ] [[package]] name = "regex-syntax" -version = "0.6.29" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" - -[[package]] -name = "regex-syntax" -version = "0.8.5" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" +checksum = "caf4aa5b0f434c91fe5c7f1ecb6a5ece2130b02ad2a590589dda5146df959001" [[package]] name = "relay-server-example" @@ -4664,61 +4770,53 @@ dependencies = [ [[package]] name = "reqwest" -version = "0.12.15" +version = "0.12.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d19c46a6fdd48bc4dab94b6103fccc55d34c67cc0ad04653aad4ea2a07cd7bbb" +checksum = "d429f34c8092b2d42c7c93cec323bb4adeb7c67698f70839adec842ec10c7ceb" dependencies = [ "base64", "bytes", "encoding_rs", "futures-core", - "futures-util", "h2", - "http 1.3.1", + "http", "http-body", "http-body-util", "hyper", "hyper-rustls", "hyper-tls", "hyper-util", - "ipnet", "js-sys", "log", "mime", "native-tls", - "once_cell", "percent-encoding", "pin-project-lite", "quinn", "rustls", - "rustls-pemfile", "rustls-pki-types", "serde", "serde_json", "serde_urlencoded", "sync_wrapper", - "system-configuration", "tokio", "tokio-native-tls", "tokio-rustls", "tower 0.5.2", + "tower-http 0.6.6", "tower-service", "url", "wasm-bindgen", "wasm-bindgen-futures", "web-sys", - "webpki-roots", - "windows-registry", + "webpki-roots 1.0.2", ] [[package]] name = "resolv-conf" -version = "0.7.1" +version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48375394603e3dd4b2d64371f7148fd8c7baa2680e28741f2cb8d23b59e3d4c4" -dependencies = [ - "hostname", -] +checksum = "6b3789b30bd25ba102de4beabd95d21ac45b69b1be7d14522bab988c526d6799" [[package]] name = "rfc6979" @@ -4738,7 +4836,7 @@ checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" dependencies = [ "cc", "cfg-if", - "getrandom 0.2.15", + "getrandom 0.2.16", "libc", "untrusted", "windows-sys 0.52.0", @@ -4821,9 +4919,9 @@ dependencies = [ [[package]] name = "rust-embed" -version = "8.7.0" +version = "8.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5fbc0ee50fcb99af7cebb442e5df7b5b45e9460ffa3f8f549cd26b862bec49d" +checksum = "025908b8682a26ba8d12f6f2d66b987584a4a87bc024abc5bbc12553a8cd178a" dependencies = [ "rust-embed-impl", "rust-embed-utils", @@ -4832,9 +4930,9 @@ dependencies = [ [[package]] name = "rust-embed-impl" -version = "8.7.0" +version = "8.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6bf418c9a2e3f6663ca38b8a7134cc2c2167c9d69688860e8961e3faa731702e" +checksum = "6065f1a4392b71819ec1ea1df1120673418bf386f50de1d6f54204d836d4349c" dependencies = [ "proc-macro2", "quote", @@ -4846,9 +4944,9 @@ dependencies = [ [[package]] name = "rust-embed-utils" -version = "8.7.0" +version = "8.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08d55b95147fe01265d06b3955db798bdaed52e60e2211c41137701b3aba8e21" +checksum = "f6cc0c81648b20b70c491ff8cce00c1c3b223bb8ed2b5d41f0e54c6c4c0a3594" dependencies = [ "globset", "sha2", @@ -4857,9 +4955,9 @@ dependencies = [ [[package]] name = "rustc-demangle" -version = "0.1.24" +version = "0.1.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" +checksum = "56f7d92ca342cea22a06f2121d944b4fd82af56988c270852495420f961d4ace" [[package]] name = "rustc-hash" @@ -4887,35 +4985,22 @@ dependencies = [ [[package]] name = "rustix" -version = "0.38.44" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154" -dependencies = [ - "bitflags 2.9.0", - "errno", - "libc", - "linux-raw-sys 0.4.15", - "windows-sys 0.59.0", -] - -[[package]] -name = "rustix" -version = "1.0.5" +version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d97817398dd4bb2e6da002002db259209759911da105da92bec29ccb12cf58bf" +checksum = "cd15f8a2c5551a84d56efdc1cd049089e409ac19a3072d5037a17fd70719ff3e" dependencies = [ - "bitflags 2.9.0", + "bitflags 2.9.4", "errno", "libc", - "linux-raw-sys 0.9.4", - "windows-sys 0.59.0", + "linux-raw-sys", + "windows-sys 0.61.0", ] [[package]] name = "rustls" -version = "0.23.26" +version = "0.23.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df51b5869f3a441595eac5e8ff14d486ff285f7b8c0df8770e49c3b56351f0f0" +checksum = "c0ebcbd2f03de0fc1122ad9bb24b127a5a6cd51d72604a3f3c50ac459762b6cc" dependencies = [ "once_cell", "ring", @@ -4925,29 +5010,21 @@ dependencies = [ "zeroize", ] -[[package]] -name = "rustls-pemfile" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dce314e5fee3f39953d46bb63bb8a46d40c2f8fb7cc5a3b6cab2bde9721d6e50" -dependencies = [ - "rustls-pki-types", -] - [[package]] name = "rustls-pki-types" -version = "1.11.0" +version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "917ce264624a4b4db1c364dcc35bfca9ded014d0a958cd47ad3e960e988ea51c" +checksum = "229a4a4c221013e7e1f1a043678c5cc39fe5171437c88fb47151a21e6f5b5c79" dependencies = [ "web-time 1.1.0", + "zeroize", ] [[package]] name = "rustls-webpki" -version = "0.103.1" +version = "0.103.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fef8b8769aaccf73098557a87cd1816b4f9c7c16811c9c77142aa695c16f2c03" +checksum = "8572f3c2cb9934231157b45499fc41e1f58c589fdfb81a844ba873265e80f8eb" dependencies = [ "ring", "rustls-pki-types", @@ -4956,9 +5033,9 @@ dependencies = [ [[package]] name = "rustversion" -version = "1.0.20" +version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eded382c5f5f786b989652c49544c4877d9f015cc22e145a5ea8ea66c2921cd2" +checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" [[package]] name = "rw-stream-sink" @@ -4970,6 +5047,17 @@ dependencies = [ "tokio", ] +[[package]] +name = "rw-stream-sink" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8c9026ff5d2f23da5e45bbc283f156383001bfb09c4e44256d02c1a685fe9a1" +dependencies = [ + "futures", + "pin-project", + "static_assertions", +] + [[package]] name = "ryu" version = "1.0.20" @@ -4996,11 +5084,11 @@ dependencies = [ [[package]] name = "schannel" -version = "0.1.27" +version = "0.1.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f29ebaa345f945cec9fbbc532eb307f0fdad8161f281b6369539c8d84876b3d" +checksum = "891d81b926048e76efe18581bf793546b4c0eaf8448d72be8de2bbee5fd166e1" dependencies = [ - "windows-sys 0.59.0", + "windows-sys 0.61.0", ] [[package]] @@ -5047,7 +5135,7 @@ version = "2.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" dependencies = [ - "bitflags 2.9.0", + "bitflags 2.9.4", "core-foundation", "core-foundation-sys", "libc", @@ -5056,9 +5144,9 @@ dependencies = [ [[package]] name = "security-framework-sys" -version = "2.14.0" +version = "2.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49db231d56a190491cb4aeda9527f1ad45345af50b0851622a7adb8c03b01c32" +checksum = "cc1f0cbffaac4852523ce30d8bd3c5cdc873501d96ff467ca09b6767bb8cd5c0" dependencies = [ "core-foundation-sys", "libc", @@ -5066,9 +5154,9 @@ dependencies = [ [[package]] name = "semver" -version = "1.0.26" +version = "1.0.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56e6fa9c48d24d85fb3de5ad847117517440f6beceb7798af16b4a87d616b8d0" +checksum = "d767eb0aabc880b29956c35734170f26ed551a859dbd361d140cdbeca61ab1e2" [[package]] name = "send_wrapper" @@ -5087,18 +5175,28 @@ dependencies = [ [[package]] name = "serde" -version = "1.0.219" +version = "1.0.224" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6aaeb1e94f53b16384af593c71e20b095e958dab1d26939c1b70645c5cfbcc0b" +dependencies = [ + "serde_core", + "serde_derive", +] + +[[package]] +name = "serde_core" +version = "1.0.224" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6" +checksum = "32f39390fa6346e24defbcdd3d9544ba8a19985d0af74df8501fbfe9a64341ab" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.219" +version = "1.0.224" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" +checksum = "87ff78ab5e8561c9a675bfc1785cb07ae721f0ee53329a595cefd8c04c2ac4e0" dependencies = [ "proc-macro2", "quote", @@ -5107,25 +5205,27 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.140" +version = "1.0.145" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20068b6e96dc6c9bd23e01df8827e6c7e1f2fddd43c21810382803c136b99373" +checksum = "402a6f66d8c709116cf22f558eab210f5a50187f702eb4d7e5ef38d9a7f1c79c" dependencies = [ - "indexmap 2.9.0", + "indexmap 2.11.3", "itoa", "memchr", "ryu", "serde", + "serde_core", ] [[package]] name = "serde_path_to_error" -version = "0.1.17" +version = "0.1.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59fab13f937fa393d08645bf3a84bdfe86e296747b506ada67bb15f10f218b2a" +checksum = "10a9ff822e371bb5403e391ecd83e182e0e77ba7f6fe0160b795797109d1b457" dependencies = [ "itoa", "serde", + "serde_core", ] [[package]] @@ -5141,11 +5241,11 @@ dependencies = [ [[package]] name = "serde_spanned" -version = "0.6.8" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87607cb1398ed59d48732e575a4c28a7a8ebf2454b964fe3f224f2afc07909e1" +checksum = "2789234a13a53fc4be1b51ea1bab45a3c338bdb884862a257d10e5a74ae009e6" dependencies = [ - "serde", + "serde_core", ] [[package]] @@ -5173,9 +5273,9 @@ dependencies = [ [[package]] name = "sha2" -version = "0.10.8" +version = "0.10.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" +checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" dependencies = [ "cfg-if", "cpufeatures", @@ -5203,9 +5303,9 @@ dependencies = [ [[package]] name = "shellexpand" -version = "3.1.0" +version = "3.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da03fa3b94cc19e3ebfc88c4229c49d8f08cdbd1228870a45f0ffdf84988e14b" +checksum = "8b1fdf65dd6331831494dd616b30351c38e96e45921a27745cf98490458b90bb" dependencies = [ "dirs", ] @@ -5218,9 +5318,9 @@ checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" [[package]] name = "signal-hook-registry" -version = "1.4.2" +version = "1.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9e9e0b4211b72e7b8b6e85c807d36c212bdb33ea8587f7569562a84df5465b1" +checksum = "b2a4719bff48cee6b39d12c020eeb490953ad2443b7055bd0b21fca26bd8c28b" dependencies = [ "libc", ] @@ -5237,18 +5337,15 @@ dependencies = [ [[package]] name = "slab" -version = "0.4.9" +version = "0.4.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" -dependencies = [ - "autocfg", -] +checksum = "7a2ae44ef20feb57a68b23d846850f861394c2e02dc425a50098ae8c90267589" [[package]] name = "smallvec" -version = "1.15.0" +version = "1.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8917285742e9f3e1683f0a9c4e6b57960b7314d0b08d30d1ecd426713ee2eee9" +checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" [[package]] name = "smol_str" @@ -5278,9 +5375,9 @@ dependencies = [ [[package]] name = "socket2" -version = "0.5.9" +version = "0.5.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f5fd57c80058a56cf5c777ab8a126398ece8e442983605d280a44ce79d0edef" +checksum = "e22376abed350d73dd1cd119b57ffccad95b4e585a7cda43e286245ce23c0678" dependencies = [ "libc", "windows-sys 0.52.0", @@ -5420,9 +5517,9 @@ checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" [[package]] name = "syn" -version = "2.0.100" +version = "2.0.106" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b09a44accad81e1ba1cd74a32461ba89dee89095ba17b32f5d03683b1b1fc2a0" +checksum = "ede7c438028d4436d71104916910f5bb611972c5cfd7f89b8300a8186e6fada6" dependencies = [ "proc-macro2", "quote", @@ -5440,9 +5537,9 @@ dependencies = [ [[package]] name = "synstructure" -version = "0.13.1" +version = "0.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" +checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" dependencies = [ "proc-macro2", "quote", @@ -5469,7 +5566,7 @@ version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3c879d448e9d986b661742763247d3693ed13609438cf3d006f51f5368a5ba6b" dependencies = [ - "bitflags 2.9.0", + "bitflags 2.9.4", "core-foundation", "system-configuration-sys", ] @@ -5498,15 +5595,15 @@ checksum = "1ac9aa371f599d22256307c24a9d748c041e548cbf599f35d890f9d365361790" [[package]] name = "tempfile" -version = "3.19.1" +version = "3.22.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7437ac7763b9b123ccf33c338a5cc1bac6f69b45a136c19bdd8a65e3916435bf" +checksum = "84fa4d11fadde498443cca10fd3ac23c951f0dc59e080e9f4b93d4df4e4eea53" dependencies = [ "fastrand", - "getrandom 0.3.2", + "getrandom 0.3.3", "once_cell", - "rustix 1.0.5", - "windows-sys 0.59.0", + "rustix", + "windows-sys 0.61.0", ] [[package]] @@ -5527,8 +5624,8 @@ dependencies = [ "async-trait", "base64", "futures", - "http 1.3.1", - "indexmap 2.9.0", + "http", + "indexmap 2.11.3", "parking_lot", "paste", "reqwest", @@ -5566,11 +5663,11 @@ dependencies = [ [[package]] name = "thiserror" -version = "2.0.12" +version = "2.0.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "567b8a2dae586314f7be2a752ec7474332959c6460e02bde30d702a66d488708" +checksum = "3467d614147380f2e4e374161426ff399c91084acd2363eaf549172b3d5e60c0" dependencies = [ - "thiserror-impl 2.0.12", + "thiserror-impl 2.0.16", ] [[package]] @@ -5586,9 +5683,9 @@ dependencies = [ [[package]] name = "thiserror-impl" -version = "2.0.12" +version = "2.0.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f7cf42b4507d8ea322120659672cf1b9dbb93f8f2d4ecfd6e51350ff5b17a1d" +checksum = "6c5e1be1c48b9172ee610da68fd9cd2770e7a4056cb3fc98710ee6906f0c7960" dependencies = [ "proc-macro2", "quote", @@ -5597,12 +5694,11 @@ dependencies = [ [[package]] name = "thread_local" -version = "1.1.8" +version = "1.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b9ef9bad013ada3808854ceac7b46812a6465ba368859a37e2100283d2d719c" +checksum = "f60246a4944f24f6e018aa17cdeffb7818b76356965d03b07d6a9886e8962185" dependencies = [ "cfg-if", - "once_cell", ] [[package]] @@ -5629,12 +5725,11 @@ dependencies = [ [[package]] name = "time" -version = "0.3.41" +version = "0.3.43" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a7619e19bc266e0f9c5e6686659d394bc57973859340060a69221e57dbc0c40" +checksum = "83bde6f1ec10e72d583d91623c939f623002284ef622b87de38cfd546cbf2031" dependencies = [ "deranged", - "itoa", "num-conv", "powerfmt", "serde", @@ -5644,15 +5739,15 @@ dependencies = [ [[package]] name = "time-core" -version = "0.1.4" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9e9a38711f559d9e3ce1cdb06dd7c5b8ea546bc90052da6d06bb76da74bb07c" +checksum = "40868e7c1d2f0b8d73e4a8c7f0ff63af4f6d19be117e90bd73eb1d62cf831c6b" [[package]] name = "time-macros" -version = "0.2.22" +version = "0.2.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3526739392ec93fd8b359c8e98514cb3e8e021beb4e5f597b00a0221f8ed8a49" +checksum = "30cfb0125f12d9c277f35663a0a33f8c30190f4e4574868a330595412d34ebf3" dependencies = [ "num-conv", "time-core", @@ -5660,9 +5755,9 @@ dependencies = [ [[package]] name = "tinystr" -version = "0.7.6" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9117f5d4db391c1cf6927e7bea3db74b9a1c1add8f7eda9ffd5364f40f57b82f" +checksum = "5d4f6d1145dcb577acf783d4e601bc1d76a13337bb54e6233add580b07344c8b" dependencies = [ "displaydoc", "zerovec", @@ -5680,9 +5775,9 @@ dependencies = [ [[package]] name = "tinyvec" -version = "1.9.0" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09b3661f17e86524eccd4371ab0429194e0d7c008abb45f7a7495b1719463c71" +checksum = "bfa5fdc3bce6191a1dbc8c02d5c8bffcf557bafa17c124c5264a458f1b0613fa" dependencies = [ "tinyvec_macros", ] @@ -5695,20 +5790,22 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.44.2" +version = "1.47.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6b88822cbe49de4185e3a4cbf8321dd487cf5fe0c5c65695fef6346371e9c48" +checksum = "89e49afdadebb872d3145a5638b59eb0691ea23e46ca484037cfab3b76b95038" dependencies = [ "backtrace", "bytes", + "io-uring", "libc", "mio", "parking_lot", "pin-project-lite", "signal-hook-registry", - "socket2 0.5.9", + "slab", + "socket2 0.6.0", "tokio-macros", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -5755,9 +5852,9 @@ dependencies = [ [[package]] name = "tokio-util" -version = "0.7.14" +version = "0.7.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b9590b93e6fcc1739458317cccd391ad3955e2bde8913edf6f95f9e65a8f034" +checksum = "14307c986784f72ef81c89db7d9e28d6ac26d16213b109ea501696195e6e3ce5" dependencies = [ "bytes", "futures-core", @@ -5769,38 +5866,43 @@ dependencies = [ [[package]] name = "toml" -version = "0.8.20" +version = "0.9.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd87a5cdd6ffab733b2f74bc4fd7ee5fff6634124999ac278c35fc78c6120148" +checksum = "ae2a4cf385da23d1d53bc15cdfa5c2109e93d8d362393c801e87da2f72f0e201" dependencies = [ - "serde", + "indexmap 2.11.3", + "serde_core", "serde_spanned", "toml_datetime", - "toml_edit", + "toml_parser", + "toml_writer", + "winnow", ] [[package]] name = "toml_datetime" -version = "0.6.8" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0dd7358ecb8fc2f8d014bf86f6f638ce72ba252a2c3a2572f2a795f1d23efb41" +checksum = "a197c0ec7d131bfc6f7e82c8442ba1595aeab35da7adbf05b6b73cd06a16b6be" dependencies = [ - "serde", + "serde_core", ] [[package]] -name = "toml_edit" -version = "0.22.24" +name = "toml_parser" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17b4795ff5edd201c7cd6dca065ae59972ce77d1b80fa0a84d94950ece7d1474" +checksum = "b551886f449aa90d4fe2bdaa9f4a2577ad2dde302c61ecf262d80b116db95c10" dependencies = [ - "indexmap 2.9.0", - "serde", - "serde_spanned", - "toml_datetime", "winnow", ] +[[package]] +name = "toml_writer" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fcc842091f2def52017664b53082ecbbeb5c7731092bad69d2c63050401dfd64" + [[package]] name = "tonic" version = "0.12.3" @@ -5813,7 +5915,7 @@ dependencies = [ "base64", "bytes", "h2", - "http 1.3.1", + "http", "http-body", "http-body-util", "hyper", @@ -5822,7 +5924,7 @@ dependencies = [ "percent-encoding", "pin-project", "prost", - "socket2 0.5.9", + "socket2 0.5.10", "tokio", "tokio-stream", "tower 0.4.13", @@ -5873,10 +5975,10 @@ version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1e9cd434a998747dd2c4276bc96ee2e0c7a2eadf3cae88e52be55a05fa9053f5" dependencies = [ - "bitflags 2.9.0", + "bitflags 2.9.4", "bytes", "futures-util", - "http 1.3.1", + "http", "http-body", "http-body-util", "http-range-header", @@ -5892,6 +5994,24 @@ dependencies = [ "tracing", ] +[[package]] +name = "tower-http" +version = "0.6.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "adc82fd73de2a9722ac5da747f12383d2bfdb93591ee6c58486e0097890f05f2" +dependencies = [ + "bitflags 2.9.4", + "bytes", + "futures-util", + "http", + "http-body", + "iri-string", + "pin-project-lite", + "tower 0.5.2", + "tower-layer", + "tower-service", +] + [[package]] name = "tower-layer" version = "0.3.3" @@ -5918,9 +6038,9 @@ dependencies = [ [[package]] name = "tracing-attributes" -version = "0.1.28" +version = "0.1.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "395ae124c09f9e6918a2310af6038fba074bcf474ac352496d5910dd59a2226d" +checksum = "81383ab64e72a7a8b8e13130c49e3dab29def6d0c7d76a03087b3cf71c5c6903" dependencies = [ "proc-macro2", "quote", @@ -5929,9 +6049,9 @@ dependencies = [ [[package]] name = "tracing-core" -version = "0.1.33" +version = "0.1.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e672c95779cf947c5311f83787af4fa8fffd12fb27e4993211a84bdfd9610f9c" +checksum = "b9d12581f227e93f094d3af2ae690a574abb8a2b9b7a96e7cfe9647b2b617678" dependencies = [ "once_cell", "valuable", @@ -5986,14 +6106,14 @@ dependencies = [ [[package]] name = "tracing-subscriber" -version = "0.3.19" +version = "0.3.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8189decb5ac0fa7bc8b96b7cb9b2701d60d48805aca84a238004d665fcc4008" +checksum = "2054a14f5307d601f88daf0553e1cbf472acc4f2c51afab632431cdcd72124d5" dependencies = [ "matchers", "nu-ansi-term", "once_cell", - "regex", + "regex-automata", "sharded-slab", "smallvec", "thread_local", @@ -6021,9 +6141,9 @@ checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" [[package]] name = "trybuild" -version = "1.0.104" +version = "1.0.111" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ae08be68c056db96f0e6c6dd820727cca756ced9e1f4cc7fdd20e2a55e23898" +checksum = "0ded9fdb81f30a5708920310bfcd9ea7482ff9cba5f54601f7a19a877d5c2392" dependencies = [ "glob", "serde", @@ -6081,9 +6201,9 @@ checksum = "75b844d17643ee918803943289730bec8aac480150456169e647ed0b576ba539" [[package]] name = "unicode-ident" -version = "1.0.18" +version = "1.0.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" +checksum = "f63a545481291138910575129486daeaf8ac54aee4387fe7906919f7830c7d9d" [[package]] name = "universal-hash" @@ -6095,6 +6215,12 @@ dependencies = [ "subtle", ] +[[package]] +name = "unsigned-varint" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6889a77d49f1f013504cec6bf97a2c730394adedaeb1deb5ea08949a50541105" + [[package]] name = "unsigned-varint" version = "0.8.0" @@ -6123,13 +6249,14 @@ dependencies = [ [[package]] name = "url" -version = "2.5.4" +version = "2.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60" +checksum = "08bc136a29a3d1758e07a9cca267be308aeebf5cfd5a10f3f67ab2097683ef5b" dependencies = [ "form_urlencoded", "idna", "percent-encoding", + "serde", ] [[package]] @@ -6138,12 +6265,6 @@ version = "2.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "daf8dba3b7eb870caf1ddeed7bc9d2a049f3cfdfae7cb521b087cc33ae4c49da" -[[package]] -name = "utf16_iter" -version = "1.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8232dd3cdaed5356e0f716d285e4b40b932ac434100fe9b7e0e8e935b9e6246" - [[package]] name = "utf8_iter" version = "1.0.4" @@ -6158,11 +6279,13 @@ checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" [[package]] name = "uuid" -version = "1.16.0" +version = "1.18.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "458f7a779bf54acc9f347480ac654f68407d3aab21269a6e3c9f922acd9e2da9" +checksum = "2f87b8aa10b915a06587d0dec516c282ff295b475d94abf425d62b57710070a2" dependencies = [ - "getrandom 0.3.2", + "getrandom 0.3.3", + "js-sys", + "wasm-bindgen", ] [[package]] @@ -6219,36 +6342,46 @@ checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" [[package]] name = "wasi" -version = "0.11.0+wasi-snapshot-preview1" +version = "0.11.1+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" +checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" [[package]] name = "wasi" -version = "0.14.2+wasi-0.2.4" +version = "0.14.7+wasi-0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "883478de20367e224c0090af9cf5f9fa85bed63a95c1abf3afc5c083ebc06e8c" +dependencies = [ + "wasip2", +] + +[[package]] +name = "wasip2" +version = "1.0.1+wasi-0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9683f9a5a998d873c0d21fcbe3c083009670149a8fab228644b8bd36b2c48cb3" +checksum = "0562428422c63773dad2c345a1882263bbf4d65cf3f42e90921f787ef5ad58e7" dependencies = [ - "wit-bindgen-rt", + "wit-bindgen", ] [[package]] name = "wasm-bindgen" -version = "0.2.100" +version = "0.2.101" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" +checksum = "7e14915cadd45b529bb8d1f343c4ed0ac1de926144b746e2710f9cd05df6603b" dependencies = [ "cfg-if", "once_cell", "rustversion", "wasm-bindgen-macro", + "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-backend" -version = "0.2.100" +version = "0.2.101" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6" +checksum = "e28d1ba982ca7923fd01448d5c30c6864d0a14109560296a162f80f305fb93bb" dependencies = [ "bumpalo", "log", @@ -6260,9 +6393,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-futures" -version = "0.4.50" +version = "0.4.51" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "555d470ec0bc3bb57890405e5d4322cc9ea83cebb085523ced7be4144dac1e61" +checksum = "0ca85039a9b469b38336411d6d6ced91f3fc87109a2a27b0c197663f5144dffe" dependencies = [ "cfg-if", "js-sys", @@ -6273,9 +6406,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.100" +version = "0.2.101" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407" +checksum = "7c3d463ae3eff775b0c45df9da45d68837702ac35af998361e2c84e7c5ec1b0d" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -6283,9 +6416,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.100" +version = "0.2.101" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" +checksum = "7bb4ce89b08211f923caf51d527662b75bdc9c9c7aab40f86dcb9fb85ac552aa" dependencies = [ "proc-macro2", "quote", @@ -6296,18 +6429,18 @@ dependencies = [ [[package]] name = "wasm-bindgen-shared" -version = "0.2.100" +version = "0.2.101" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d" +checksum = "f143854a3b13752c6950862c906306adb27c7e839f7414cec8fea35beab624c1" dependencies = [ "unicode-ident", ] [[package]] name = "wasm-bindgen-test" -version = "0.3.50" +version = "0.3.51" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "66c8d5e33ca3b6d9fa3b4676d774c5778031d27a578c2b007f905acf816152c3" +checksum = "80cc7f8a4114fdaa0c58383caf973fc126cf004eba25c9dc639bccd3880d55ad" dependencies = [ "js-sys", "minicov", @@ -6318,9 +6451,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-test-macro" -version = "0.3.50" +version = "0.3.51" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17d5042cc5fa009658f9a7333ef24291b1291a25b6382dd68862a7f3b969f69b" +checksum = "c5ada2ab788d46d4bda04c9d567702a79c8ced14f51f221646a16ed39d0e6a5d" dependencies = [ "proc-macro2", "quote", @@ -6340,9 +6473,9 @@ dependencies = [ [[package]] name = "web-sys" -version = "0.3.77" +version = "0.3.78" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33b6dd2ef9186f1f2072e409e99cd22a975331a6b3591b12c764e0e55c60d5d2" +checksum = "77e4b637749ff0d92b8fad63aa1f7cff3cbe125fd49c175cd6345e7272638b12" dependencies = [ "js-sys", "wasm-bindgen", @@ -6370,9 +6503,18 @@ dependencies = [ [[package]] name = "webpki-roots" -version = "0.26.8" +version = "0.26.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2210b291f7ea53617fbafcc4939f10914214ec15aace5ba62293a668f322c5c9" +checksum = "521bc38abb08001b01866da9f51eb7c5d647a19260e00054a8c7fd5f9e57f7a9" +dependencies = [ + "webpki-roots 1.0.2", +] + +[[package]] +name = "webpki-roots" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e8983c3ab33d6fb807cfcdad2491c4ea8cbc8ed839181c7dfd9c67c83e261b2" dependencies = [ "rustls-pki-types", ] @@ -6507,7 +6649,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e6dfe9686c6c9c51428da4de415cb6ca2dc0591ce2b63212e23fd9cccf0e316b" dependencies = [ "log", - "socket2 0.5.9", + "socket2 0.5.10", "thiserror 1.0.69", "tokio", "webrtc-util", @@ -6593,8 +6735,8 @@ name = "webtransport-tests" version = "0.1.0" dependencies = [ "futures", - "getrandom 0.2.15", - "libp2p-core", + "getrandom 0.2.16", + "libp2p-core 0.43.1", "libp2p-identity", "libp2p-noise", "libp2p-webtransport-websys", @@ -6630,11 +6772,11 @@ checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" [[package]] name = "winapi-util" -version = "0.1.9" +version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" +checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" dependencies = [ - "windows-sys 0.59.0", + "windows-sys 0.61.0", ] [[package]] @@ -6665,12 +6807,24 @@ dependencies = [ [[package]] name = "windows" -version = "0.58.0" +version = "0.61.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd04d41d93c4992d421894c18c8b43496aa748dd4c081bac0dc93eb0489272b6" +checksum = "9babd3a767a4c1aef6900409f85f5d53ce2544ccdfaa86dad48c91782c6d6893" dependencies = [ - "windows-core 0.58.0", - "windows-targets 0.52.6", + "windows-collections", + "windows-core 0.61.2", + "windows-future", + "windows-link 0.1.3", + "windows-numerics", +] + +[[package]] +name = "windows-collections" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3beeceb5e5cfd9eb1d76b381630e82c4241ccd0d27f1a39ed41b2760b255c5e8" +dependencies = [ + "windows-core 0.61.2", ] [[package]] @@ -6697,15 +6851,26 @@ dependencies = [ [[package]] name = "windows-core" -version = "0.58.0" +version = "0.61.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ba6d44ec8c2591c134257ce647b7ea6b20335bf6379a27dac5f1641fcf59f99" +checksum = "c0fdd3ddb90610c7638aa2b3a3ab2904fb9e5cdbecc643ddb3647212781c4ae3" dependencies = [ - "windows-implement 0.58.0", - "windows-interface 0.58.0", - "windows-result 0.2.0", - "windows-strings 0.1.0", - "windows-targets 0.52.6", + "windows-implement 0.60.0", + "windows-interface 0.59.1", + "windows-link 0.1.3", + "windows-result 0.3.4", + "windows-strings", +] + +[[package]] +name = "windows-future" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc6a41e98427b19fe4b73c550f060b59fa592d7d686537eebf9385621bfbad8e" +dependencies = [ + "windows-core 0.61.2", + "windows-link 0.1.3", + "windows-threading", ] [[package]] @@ -6721,9 +6886,9 @@ dependencies = [ [[package]] name = "windows-implement" -version = "0.58.0" +version = "0.60.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2bbd5b46c938e506ecbce286b6628a02171d56153ba733b6c741fc627ec9579b" +checksum = "a47fddd13af08290e67f4acabf4b459f647552718f683a7b415d290ac744a836" dependencies = [ "proc-macro2", "quote", @@ -6743,9 +6908,9 @@ dependencies = [ [[package]] name = "windows-interface" -version = "0.58.0" +version = "0.59.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "053c4c462dc91d3b1504c6fe5a726dd15e216ba718e84a0e46a88fbe5ded3515" +checksum = "bd9211b69f8dcdfa817bfd14bf1c97c9188afa36f4750130fcdf3f400eca9fa8" dependencies = [ "proc-macro2", "quote", @@ -6754,65 +6919,62 @@ dependencies = [ [[package]] name = "windows-link" -version = "0.1.1" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76840935b766e1b0a05c0066835fb9ec80071d4c09a16f6bd5f7e655e3c14c38" +checksum = "5e6ad25900d524eaabdbbb96d20b4311e1e7ae1699af4fb28c17ae66c80d798a" [[package]] -name = "windows-registry" -version = "0.4.0" +name = "windows-link" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4286ad90ddb45071efd1a66dfa43eb02dd0dfbae1545ad6cc3c51cf34d7e8ba3" -dependencies = [ - "windows-result 0.3.2", - "windows-strings 0.3.1", - "windows-targets 0.53.0", -] +checksum = "45e46c0661abb7180e7b9c281db115305d49ca1709ab8242adf09666d2173c65" [[package]] -name = "windows-result" -version = "0.1.2" +name = "windows-numerics" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e383302e8ec8515204254685643de10811af0ed97ea37210dc26fb0032647f8" +checksum = "9150af68066c4c5c07ddc0ce30421554771e528bde427614c61038bc2c92c2b1" dependencies = [ - "windows-targets 0.52.6", + "windows-core 0.61.2", + "windows-link 0.1.3", ] [[package]] -name = "windows-result" -version = "0.2.0" +name = "windows-registry" +version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d1043d8214f791817bab27572aaa8af63732e11bf84aa21a45a78d6c317ae0e" +checksum = "5b8a9ed28765efc97bbc954883f4e6796c33a06546ebafacbabee9696967499e" dependencies = [ - "windows-targets 0.52.6", + "windows-link 0.1.3", + "windows-result 0.3.4", + "windows-strings", ] [[package]] name = "windows-result" -version = "0.3.2" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c64fd11a4fd95df68efcfee5f44a294fe71b8bc6a91993e2791938abcc712252" +checksum = "5e383302e8ec8515204254685643de10811af0ed97ea37210dc26fb0032647f8" dependencies = [ - "windows-link", + "windows-targets 0.52.6", ] [[package]] -name = "windows-strings" -version = "0.1.0" +name = "windows-result" +version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4cd9b125c486025df0eabcb585e62173c6c9eddcec5d117d3b6e8c30e2ee4d10" +checksum = "56f42bd332cc6c8eac5af113fc0c1fd6a8fd2aa08a0119358686e5160d0586c6" dependencies = [ - "windows-result 0.2.0", - "windows-targets 0.52.6", + "windows-link 0.1.3", ] [[package]] name = "windows-strings" -version = "0.3.1" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87fa48cc5d406560701792be122a10132491cff9d0aeb23583cc2dcafc847319" +checksum = "56e6c93f3a0c3b36176cb1327a4958a0353d5d166c2a35cb268ace15e91d3b57" dependencies = [ - "windows-link", + "windows-link 0.1.3", ] [[package]] @@ -6842,6 +7004,24 @@ dependencies = [ "windows-targets 0.52.6", ] +[[package]] +name = "windows-sys" +version = "0.60.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" +dependencies = [ + "windows-targets 0.53.3", +] + +[[package]] +name = "windows-sys" +version = "0.61.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e201184e40b2ede64bc2ea34968b28e33622acdbbf37104f0e4a33f7abe657aa" +dependencies = [ + "windows-link 0.2.0", +] + [[package]] name = "windows-targets" version = "0.48.5" @@ -6875,10 +7055,11 @@ dependencies = [ [[package]] name = "windows-targets" -version = "0.53.0" +version = "0.53.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1e4c7e8ceaaf9cb7d7507c974735728ab453b67ef8f18febdd7c11fe59dca8b" +checksum = "d5fe6031c4041849d7c496a8ded650796e7b6ecc19df1a431c1a363342e5dc91" dependencies = [ + "windows-link 0.1.3", "windows_aarch64_gnullvm 0.53.0", "windows_aarch64_msvc 0.53.0", "windows_i686_gnu 0.53.0", @@ -6889,6 +7070,15 @@ dependencies = [ "windows_x86_64_msvc 0.53.0", ] +[[package]] +name = "windows-threading" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b66463ad2e0ea3bbf808b7f1d371311c80e115c0b71d60efc142cafbcfb057a6" +dependencies = [ + "windows-link 0.1.3", +] + [[package]] name = "windows_aarch64_gnullvm" version = "0.48.5" @@ -7029,12 +7219,9 @@ checksum = "271414315aff87387382ec3d271b52d7ae78726f5d44ac98b4f4030c91880486" [[package]] name = "winnow" -version = "0.7.6" +version = "0.7.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "63d3fcd9bba44b03821e7d699eeee959f3126dcc4aa8e4ae18ec617c2a5cea10" -dependencies = [ - "memchr", -] +checksum = "21a0236b59786fed61e2a80582dd500fe61f18b5dca67a4a067d0bc9039339cf" [[package]] name = "winreg" @@ -7047,25 +7234,16 @@ dependencies = [ ] [[package]] -name = "wit-bindgen-rt" -version = "0.39.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1" -dependencies = [ - "bitflags 2.9.0", -] - -[[package]] -name = "write16" -version = "1.0.0" +name = "wit-bindgen" +version = "0.46.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d1890f4022759daae28ed4fe62859b1236caebfc61ede2f63ed4e695f3f6d936" +checksum = "f17a85883d4e6d00e8a97c586de764dabcc06133f7f1d55dce5cdc070ad7fe59" [[package]] name = "writeable" -version = "0.5.5" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51" +checksum = "ea2f10b9bb0928dfb1b42b65e1f9e36f7f54dbdf08457afefb38afcdec4fa2bb" [[package]] name = "x25519-dalek" @@ -7110,15 +7288,15 @@ dependencies = [ "nom", "oid-registry 0.8.1", "rusticata-macros", - "thiserror 2.0.12", + "thiserror 2.0.16", "time", ] [[package]] name = "xml-rs" -version = "0.8.26" +version = "0.8.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a62ce76d9b56901b19a74f19431b0d8b3bc7ca4ad685a746dfd78ca8f4fc6bda" +checksum = "6fd8403733700263c6eb89f192880191f1b83e332f7a20371ddcf421c4a337c7" [[package]] name = "xmltree" @@ -7146,16 +7324,16 @@ dependencies = [ [[package]] name = "yamux" -version = "0.13.4" +version = "0.13.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17610762a1207ee816c6fadc29220904753648aba0a9ed61c7b8336e80a559c4" +checksum = "2b2dd50a6d6115feb3e5d7d0efd45e8ca364b6c83722c1e9c602f5764e0e9597" dependencies = [ "futures", "log", "nohash-hasher", "parking_lot", "pin-project", - "rand 0.8.5", + "rand 0.9.2", "static_assertions", "web-time 1.1.0", ] @@ -7171,9 +7349,9 @@ dependencies = [ [[package]] name = "yoke" -version = "0.7.5" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "120e6aef9aa629e3d4f52dc8cc43a015c7724194c97dfaf45180d2daf2b77f40" +checksum = "5f41bb01b8226ef4bfd589436a297c53d118f65921786300e427be8d487695cc" dependencies = [ "serde", "stable_deref_trait", @@ -7183,9 +7361,9 @@ dependencies = [ [[package]] name = "yoke-derive" -version = "0.7.5" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154" +checksum = "38da3c9736e16c5d3c8c597a9aaa5d1fa565d0532ae05e27c24aa62fb32c0ab6" dependencies = [ "proc-macro2", "quote", @@ -7195,18 +7373,18 @@ dependencies = [ [[package]] name = "zerocopy" -version = "0.8.24" +version = "0.8.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2586fea28e186957ef732a5f8b3be2da217d65c5969d4b1e17f973ebbe876879" +checksum = "0894878a5fa3edfd6da3f88c4805f4c8558e2b996227a3d864f47fe11e38282c" dependencies = [ "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.8.24" +version = "0.8.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a996a8f63c5c4448cd959ac1bab0aaa3306ccfd060472f85943ee0750f0169be" +checksum = "88d2b8d9c68ad2b9e4340d7832716a4d21a22a1154777ad56ea55c51a9cf3831" dependencies = [ "proc-macro2", "quote", @@ -7254,11 +7432,22 @@ dependencies = [ "syn", ] +[[package]] +name = "zerotrie" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "36f0bbd478583f79edad978b407914f61b2972f5af6fa089686016be8f9af595" +dependencies = [ + "displaydoc", + "yoke", + "zerofrom", +] + [[package]] name = "zerovec" -version = "0.10.4" +version = "0.11.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa2b893d79df23bfb12d5461018d408ea19dfafe76c2c7ef6d4eba614f8ff079" +checksum = "e7aa2bd55086f1ab526693ecbe444205da57e25f4489879da80635a46d90e73b" dependencies = [ "yoke", "zerofrom", @@ -7267,9 +7456,9 @@ dependencies = [ [[package]] name = "zerovec-derive" -version = "0.10.3" +version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" +checksum = "5b96237efa0c878c64bd89c436f661be4e46b2f3eff1ebb976f7ef2321d2f58f" dependencies = [ "proc-macro2", "quote", diff --git a/protocols/gossipsub/CHANGELOG.md b/protocols/gossipsub/CHANGELOG.md index a72eef56fe0..d66c76fe466 100644 --- a/protocols/gossipsub/CHANGELOG.md +++ b/protocols/gossipsub/CHANGELOG.md @@ -11,6 +11,9 @@ - Fix incorrect default values in ConfigBuilder See [PR 6113](https://github.com/libp2p/rust-libp2p/pull/6113) +- Switch the internal `async-channel` used to dispatch messages from `NetworkBehaviour` to the `ConnectionHandler` + with an internal priority queue. See [PR XXXX](https://github.com/libp2p/rust-libp2p/pull/XXXX) + ## 0.49.2 - Relax `Behaviour::with_metrics` requirements, do not require DataTransform and TopicSubscriptionFilter to also impl Default @@ -31,6 +34,7 @@ - Feature gate metrics related code. This changes some `Behaviour` constructor methods. See [PR 6020](https://github.com/libp2p/rust-libp2p/pull/6020) + - Send IDONTWANT before Publishing a new message. See [PR 6017](https://github.com/libp2p/rust-libp2p/pull/6017) diff --git a/protocols/gossipsub/Cargo.toml b/protocols/gossipsub/Cargo.toml index 911b453f477..1e75a65c143 100644 --- a/protocols/gossipsub/Cargo.toml +++ b/protocols/gossipsub/Cargo.toml @@ -28,23 +28,23 @@ getrandom = { workspace = true } hashlink = { workspace = true } hex_fmt = "0.3.0" web-time = { workspace = true } -libp2p-core = { workspace = true } -libp2p-identity = { workspace = true, features = ["rand"] } -libp2p-swarm = { workspace = true } +# Libp2p crates, updated to use crates.io versions so that we can use this gossipsub fork with +# crates.io libp2p +libp2p-core = "0.43" +libp2p-identity = { version = "0.2", features = ["rand"] } +libp2p-swarm = "0.47" quick-protobuf = "0.8" -quick-protobuf-codec = { workspace = true } +quick-protobuf-codec = "0.3.1" rand = "0.8" regex = "1.10.5" serde = { version = "1", optional = true, features = ["derive"] } sha2 = "0.10.8" tracing = { workspace = true } -# Metrics dependencies -prometheus-client = { workspace = true, optional = true } +prometheus-client = { version = "0.23", optional = true } [dev-dependencies] -libp2p-core = { workspace = true } -libp2p-swarm-test = { path = "../../swarm-test" } +libp2p-swarm-test = { version = "0.6.0", features = ["tokio"] } quickcheck = { workspace = true } tracing-subscriber = { workspace = true, features = ["env-filter"] } tokio = { workspace = true, features = ["rt", "rt-multi-thread", "time", "macros"] } diff --git a/protocols/gossipsub/src/behaviour.rs b/protocols/gossipsub/src/behaviour.rs index 9d7d6356211..a0a3a16f0e7 100644 --- a/protocols/gossipsub/src/behaviour.rs +++ b/protocols/gossipsub/src/behaviour.rs @@ -61,7 +61,7 @@ use crate::{ mcache::MessageCache, peer_score::{PeerScore, PeerScoreParams, PeerScoreState, PeerScoreThresholds, RejectReason}, protocol::SIGNING_PREFIX, - rpc::Sender, + queue::Queue, rpc_proto::proto, subscription_filter::{AllowAllSubscriptionFilter, TopicSubscriptionFilter}, time_cache::DuplicateCache, @@ -751,6 +751,7 @@ where if self.send_message( *peer_id, RpcOut::Publish { + message_id: msg_id.clone(), message: raw_message.clone(), timeout: Delay::new(self.config.publish_queue_duration()), }, @@ -1341,6 +1342,7 @@ where self.send_message( *peer_id, RpcOut::Forward { + message_id: id.clone(), message: msg, timeout: Delay::new(self.config.forward_queue_duration()), }, @@ -2081,9 +2083,9 @@ where // steady-state size of the queues. #[cfg(feature = "metrics")] if let Some(m) = &mut self.metrics { - for sender_queue in self.connected_peers.values().map(|v| &v.sender) { - m.observe_priority_queue_size(sender_queue.priority_queue_len()); - m.observe_non_priority_queue_size(sender_queue.non_priority_queue_len()); + for sender_queue in self.connected_peers.values().map(|v| &v.messages) { + m.observe_priority_queue_size(sender_queue.priority_len()); + m.observe_non_priority_queue_size(sender_queue.non_priority_len()); } } @@ -2499,6 +2501,11 @@ where // Report expired messages for (peer_id, failed_messages) in self.failed_messages.drain() { tracing::debug!("Peer couldn't consume messages: {:?}", failed_messages); + #[cfg(feature = "metrics")] + if let Some(metrics) = self.metrics.as_mut() { + metrics.observe_failed_priority_messages(failed_messages.priority); + metrics.observe_failed_non_priority_messages(failed_messages.non_priority); + } self.events .push_back(ToSwarm::GenerateEvent(Event::SlowPeer { peer_id, @@ -2746,6 +2753,7 @@ where self.send_message( *peer_id, RpcOut::Forward { + message_id: msg_id.clone(), message: message.clone(), timeout: Delay::new(self.config.forward_queue_duration()), }, @@ -2874,8 +2882,9 @@ where return false; } - // Try sending the message to the connection handler. - match peer.sender.send_message(rpc) { + // Try sending the message to the connection handler, + // High priority messages should not fail. + match peer.messages.try_push(rpc) { Ok(()) => true, Err(rpc) => { // Sending failed because the channel is full. @@ -2883,24 +2892,10 @@ where // Update failed message counter. let failed_messages = self.failed_messages.entry(peer_id).or_default(); - match rpc { - RpcOut::Publish { .. } => { - failed_messages.priority += 1; - failed_messages.publish += 1; - } - RpcOut::Forward { .. } => { - failed_messages.non_priority += 1; - failed_messages.forward += 1; - } - RpcOut::IWant(_) | RpcOut::IHave(_) | RpcOut::IDontWant(_) => { - failed_messages.non_priority += 1; - } - RpcOut::Graft(_) - | RpcOut::Prune(_) - | RpcOut::Subscribe(_) - | RpcOut::Unsubscribe(_) => { - unreachable!("Channel for highpriority control messages is unbounded and should always be open.") - } + if rpc.priority() { + failed_messages.priority += 1; + } else { + failed_messages.non_priority += 1; } // Update peer score. @@ -3129,16 +3124,18 @@ where kind: PeerKind::Floodsub, connections: vec![], outbound: false, - sender: Sender::new(self.config.connection_handler_queue_len()), + messages: Queue::new(self.config.connection_handler_queue_len()), topics: Default::default(), dont_send: LinkedHashMap::new(), }); // Add the new connection connected_peer.connections.push(connection_id); + // This clones a reference to the Queue so any new handlers reference the same underlying + // queue. No data is actually cloned here. Ok(Handler::new( self.config.protocol_config(), - connected_peer.sender.new_receiver(), + connected_peer.messages.clone(), )) } @@ -3156,16 +3153,18 @@ where // Diverging from the go implementation we only want to consider a peer as outbound peer // if its first connection is outbound. outbound: !self.px_peers.contains(&peer_id), - sender: Sender::new(self.config.connection_handler_queue_len()), + messages: Queue::new(self.config.connection_handler_queue_len()), topics: Default::default(), dont_send: LinkedHashMap::new(), }); // Add the new connection connected_peer.connections.push(connection_id); + // This clones a reference to the Queue so any new handlers reference the same underlying + // queue. No data is actually cloned here. Ok(Handler::new( self.config.protocol_config(), - connected_peer.sender.new_receiver(), + connected_peer.messages.clone(), )) } @@ -3207,6 +3206,8 @@ where } } } + // rpc is only used for metrics code. + #[allow(unused_variables)] HandlerEvent::MessageDropped(rpc) => { // Account for this in the scoring logic if let PeerScoreState::Active(peer_score) = &mut self.peer_score { @@ -3215,32 +3216,7 @@ where // Keep track of expired messages for the application layer. let failed_messages = self.failed_messages.entry(propagation_source).or_default(); - failed_messages.timeout += 1; - match rpc { - RpcOut::Publish { .. } => { - failed_messages.publish += 1; - } - RpcOut::Forward { .. } => { - failed_messages.forward += 1; - } - _ => {} - } - - // Record metrics on the failure. - #[cfg(feature = "metrics")] - if let Some(metrics) = self.metrics.as_mut() { - match rpc { - RpcOut::Publish { message, .. } => { - metrics.publish_msg_dropped(&message.topic); - metrics.timeout_msg_dropped(&message.topic); - } - RpcOut::Forward { message, .. } => { - metrics.forward_msg_dropped(&message.topic); - metrics.timeout_msg_dropped(&message.topic); - } - _ => {} - } - } + failed_messages.non_priority += 1; } HandlerEvent::Message { rpc, @@ -3339,10 +3315,17 @@ where "Could not handle IDONTWANT, peer doesn't exist in connected peer list"); continue; }; + + // Remove messages from the queue. + #[allow(unused)] + let removed = peer.messages.remove_data_messages(&message_ids); + #[cfg(feature = "metrics")] if let Some(metrics) = self.metrics.as_mut() { metrics.register_idontwant(message_ids.len()); + metrics.register_removed_messages(removed); } + for message_id in message_ids { peer.dont_send.insert(message_id, Instant::now()); // Don't exceed capacity. diff --git a/protocols/gossipsub/src/behaviour/tests.rs b/protocols/gossipsub/src/behaviour/tests.rs index 04c86bd3df4..b9c16bcbe8a 100644 --- a/protocols/gossipsub/src/behaviour/tests.rs +++ b/protocols/gossipsub/src/behaviour/tests.rs @@ -20,7 +20,7 @@ // Collection of tests for the gossipsub network behaviour -use std::{future, net::Ipv4Addr, thread::sleep}; +use std::{net::Ipv4Addr, thread::sleep}; use asynchronous_codec::{Decoder, Encoder}; use byteorder::{BigEndian, ByteOrder}; @@ -32,7 +32,6 @@ use super::*; use crate::{ config::{ConfigBuilder, TopicMeshConfig}, protocol::GossipsubCodec, - rpc::Receiver, subscription_filter::WhitelistSubscriptionFilter, types::RpcIn, IdentTopic as Topic, @@ -63,7 +62,7 @@ where ) -> ( Behaviour, Vec, - HashMap, + HashMap, Vec, ) { let keypair = libp2p_identity::Keypair::generate_ed25519(); @@ -92,11 +91,11 @@ where // build and connect peer_no random peers let mut peers = vec![]; - let mut receivers = HashMap::new(); + let mut queues = HashMap::new(); let empty = vec![]; for i in 0..self.peer_no { - let (peer, receiver) = add_peer_with_addr_and_kind( + let (peer, queue) = add_peer_with_addr_and_kind( &mut gs, if self.to_subscribe { &topic_hashes @@ -109,10 +108,10 @@ where self.peer_kind.or(Some(PeerKind::Gossipsubv1_1)), ); peers.push(peer); - receivers.insert(peer, receiver); + queues.insert(peer, queue); } - (gs, peers, receivers, topic_hashes) + (gs, peers, queues, topic_hashes) } fn peer_no(mut self, peer_no: usize) -> Self { @@ -181,7 +180,7 @@ fn add_peer( topic_hashes: &[TopicHash], outbound: bool, explicit: bool, -) -> (PeerId, Receiver) +) -> (PeerId, Queue) where D: DataTransform + Default + Clone + Send + 'static, F: TopicSubscriptionFilter + Clone + Default + Send + 'static, @@ -195,7 +194,7 @@ fn add_peer_with_addr( outbound: bool, explicit: bool, address: Multiaddr, -) -> (PeerId, Receiver) +) -> (PeerId, Queue) where D: DataTransform + Default + Clone + Send + 'static, F: TopicSubscriptionFilter + Clone + Default + Send + 'static, @@ -217,7 +216,7 @@ fn add_peer_with_addr_and_kind( explicit: bool, address: Multiaddr, kind: Option, -) -> (PeerId, Receiver) +) -> (PeerId, Queue) where D: DataTransform + Default + Clone + Send + 'static, F: TopicSubscriptionFilter + Clone + Default + Send + 'static, @@ -236,8 +235,8 @@ where } }; - let sender = Sender::new(gs.config.connection_handler_queue_len()); - let receiver = sender.new_receiver(); + let queue = Queue::new(gs.config.connection_handler_queue_len()); + let receiver_queue = queue.clone(); let connection_id = ConnectionId::new_unchecked(0); gs.connected_peers.insert( peer, @@ -246,7 +245,7 @@ where outbound, connections: vec![connection_id], topics: Default::default(), - sender, + messages: queue, dont_send: LinkedHashMap::new(), }, ); @@ -281,7 +280,7 @@ where &peer, ); } - (peer, receiver) + (peer, receiver_queue) } fn disconnect_peer(gs: &mut Behaviour, peer_id: &PeerId) @@ -438,7 +437,7 @@ fn test_subscribe() { // - run JOIN(topic) let subscribe_topic = vec![String::from("test_subscribe")]; - let (gs, _, receivers, topic_hashes) = inject_nodes1() + let (gs, _, queues, topic_hashes) = inject_nodes1() .peer_no(20) .topics(subscribe_topic) .to_subscribe(true) @@ -450,12 +449,11 @@ fn test_subscribe() { ); // collect all the subscriptions - let subscriptions = receivers + let subscriptions = queues .into_values() - .fold(0, |mut collected_subscriptions, c| { - let priority = c.priority.get_ref(); - while !priority.is_empty() { - if let Ok(RpcOut::Subscribe(_)) = priority.try_recv() { + .fold(0, |mut collected_subscriptions, mut queue| { + while !queue.is_empty() { + if let Some(RpcOut::Subscribe(_)) = queue.try_pop() { collected_subscriptions += 1 } } @@ -481,7 +479,7 @@ fn test_unsubscribe() { .collect::>(); // subscribe to topic_strings - let (mut gs, _, receivers, topic_hashes) = inject_nodes1() + let (mut gs, _, queues, topic_hashes) = inject_nodes1() .peer_no(20) .topics(topic_strings) .to_subscribe(true) @@ -511,12 +509,11 @@ fn test_unsubscribe() { ); // collect all the subscriptions - let subscriptions = receivers + let subscriptions = queues .into_values() - .fold(0, |mut collected_subscriptions, c| { - let priority = c.priority.get_ref(); - while !priority.is_empty() { - if let Ok(RpcOut::Subscribe(_)) = priority.try_recv() { + .fold(0, |mut collected_subscriptions, mut queue| { + while !queue.is_empty() { + if let Some(RpcOut::Subscribe(_)) = queue.try_pop() { collected_subscriptions += 1 } } @@ -553,14 +550,14 @@ fn test_join() { .map(|t| Topic::new(t.clone())) .collect::>(); - let (mut gs, _, mut receivers, topic_hashes) = inject_nodes1() + let (mut gs, _, mut queues, topic_hashes) = inject_nodes1() .peer_no(20) .topics(topic_strings) .to_subscribe(true) .create_network(); // Flush previous GRAFT messages. - receivers = flush_events(&mut gs, receivers); + queues = flush_events(&mut gs, queues); // unsubscribe, then call join to invoke functionality assert!( @@ -584,31 +581,23 @@ fn test_join() { "Should have added 6 nodes to the mesh" ); - fn count_grafts(receivers: HashMap) -> (usize, HashMap) { - let mut new_receivers = HashMap::new(); + fn count_grafts(queues: HashMap) -> (usize, HashMap) { + let mut new_queues = HashMap::new(); let mut acc = 0; - for (peer_id, c) in receivers.into_iter() { - let priority = c.priority.get_ref(); - while !priority.is_empty() { - if let Ok(RpcOut::Graft(_)) = priority.try_recv() { + for (peer_id, mut queue) in queues.into_iter() { + while !queue.is_empty() { + if let Some(RpcOut::Graft(_)) = queue.try_pop() { acc += 1; } } - new_receivers.insert( - peer_id, - Receiver { - priority_queue_len: c.priority_queue_len, - priority: c.priority, - non_priority: c.non_priority, - }, - ); + new_queues.insert(peer_id, queue); } - (acc, new_receivers) + (acc, new_queues) } // there should be mesh_n GRAFT messages. - let (graft_messages, mut receivers) = count_grafts(receivers); + let (graft_messages, mut queues) = count_grafts(queues); assert_eq!( graft_messages, 6, @@ -632,8 +621,8 @@ fn test_join() { &address, ) .unwrap(); - let sender = Sender::new(gs.config.connection_handler_queue_len()); - let receiver = sender.new_receiver(); + let queue = Queue::new(gs.config.connection_handler_queue_len()); + let receiver_queue = queue.clone(); let connection_id = ConnectionId::new_unchecked(0); gs.connected_peers.insert( random_peer, @@ -642,11 +631,11 @@ fn test_join() { outbound: false, connections: vec![connection_id], topics: Default::default(), - sender, + messages: queue, dont_send: LinkedHashMap::new(), }, ); - receivers.insert(random_peer, receiver); + queues.insert(random_peer, receiver_queue); gs.on_swarm_event(FromSwarm::ConnectionEstablished(ConnectionEstablished { peer_id: random_peer, @@ -683,7 +672,7 @@ fn test_join() { } // there should now 6 graft messages to be sent - let (graft_messages, _) = count_grafts(receivers); + let (graft_messages, _) = count_grafts(queues); assert_eq!( graft_messages, 6, @@ -705,7 +694,7 @@ fn test_publish_without_flood_publishing() { .unwrap(); let publish_topic = String::from("test_publish"); - let (mut gs, _, receivers, topic_hashes) = inject_nodes1() + let (mut gs, _, queues, topic_hashes) = inject_nodes1() .peer_no(20) .topics(vec![publish_topic.clone()]) .to_subscribe(true) @@ -732,12 +721,11 @@ fn test_publish_without_flood_publishing() { gs.publish(Topic::new(publish_topic), publish_data).unwrap(); // Collect all publish messages - let publishes = receivers + let publishes = queues .into_values() - .fold(vec![], |mut collected_publish, c| { - let priority = c.priority.get_ref(); - while !priority.is_empty() { - if let Ok(RpcOut::Publish { message, .. }) = priority.try_recv() { + .fold(vec![], |mut collected_publish, mut queue| { + while !queue.is_empty() { + if let Some(RpcOut::Publish { message, .. }) = queue.try_pop() { collected_publish.push(message); } } @@ -785,7 +773,7 @@ fn test_fanout() { .unwrap(); let fanout_topic = String::from("test_fanout"); - let (mut gs, _, receivers, topic_hashes) = inject_nodes1() + let (mut gs, _, queues, topic_hashes) = inject_nodes1() .peer_no(20) .topics(vec![fanout_topic.clone()]) .to_subscribe(true) @@ -817,12 +805,11 @@ fn test_fanout() { ); // Collect all publish messages - let publishes = receivers + let publishes = queues .into_values() - .fold(vec![], |mut collected_publish, c| { - let priority = c.priority.get_ref(); - while !priority.is_empty() { - if let Ok(RpcOut::Publish { message, .. }) = priority.try_recv() { + .fold(vec![], |mut collected_publish, mut queue| { + while !queue.is_empty() { + if let Some(RpcOut::Publish { message, .. }) = queue.try_pop() { collected_publish.push(message); } } @@ -857,7 +844,7 @@ fn test_fanout() { /// Test the gossipsub NetworkBehaviour peer connection logic. #[test] fn test_inject_connected() { - let (gs, peers, receivers, topic_hashes) = inject_nodes1() + let (gs, peers, queues, topic_hashes) = inject_nodes1() .peer_no(20) .topics(vec![String::from("topic1"), String::from("topic2")]) .to_subscribe(true) @@ -865,12 +852,11 @@ fn test_inject_connected() { // check that our subscriptions are sent to each of the peers // collect all the SendEvents - let subscriptions = receivers.into_iter().fold( + let subscriptions = queues.into_iter().fold( HashMap::>::new(), - |mut collected_subscriptions, (peer, c)| { - let priority = c.priority.get_ref(); - while !priority.is_empty() { - if let Ok(RpcOut::Subscribe(topic)) = priority.try_recv() { + |mut collected_subscriptions, (peer, mut queue)| { + while !queue.is_empty() { + if let Some(RpcOut::Subscribe(topic)) = queue.try_pop() { let mut peer_subs = collected_subscriptions.remove(&peer).unwrap_or_default(); peer_subs.push(topic.into_string()); collected_subscriptions.insert(peer, peer_subs); @@ -913,7 +899,7 @@ fn test_handle_received_subscriptions() { .iter() .map(|&t| String::from(t)) .collect(); - let (mut gs, peers, _receivers, topic_hashes) = inject_nodes1() + let (mut gs, peers, _queues, topic_hashes) = inject_nodes1() .peer_no(20) .topics(topics) .to_subscribe(false) @@ -1039,7 +1025,7 @@ fn test_get_random_peers() { connections: vec![ConnectionId::new_unchecked(0)], outbound: false, topics: topics.clone(), - sender: Sender::new(gs.config.connection_handler_queue_len()), + messages: Queue::new(gs.config.connection_handler_queue_len()), dont_send: LinkedHashMap::new(), }, ); @@ -1073,7 +1059,7 @@ fn test_get_random_peers() { /// Tests that the correct message is sent when a peer asks for a message in our cache. #[test] fn test_handle_iwant_msg_cached() { - let (mut gs, peers, receivers, _) = inject_nodes1() + let (mut gs, peers, queues, _) = inject_nodes1() .peer_no(20) .topics(Vec::new()) .to_subscribe(true) @@ -1101,12 +1087,11 @@ fn test_handle_iwant_msg_cached() { gs.handle_iwant(&peers[7], vec![msg_id.clone()]); // the messages we are sending - let sent_messages = receivers + let sent_messages = queues .into_values() - .fold(vec![], |mut collected_messages, c| { - let non_priority = c.non_priority.get_ref(); - while !non_priority.is_empty() { - if let Ok(RpcOut::Forward { message, .. }) = non_priority.try_recv() { + .fold(vec![], |mut collected_messages, mut queue| { + while !queue.is_empty() { + if let Some(RpcOut::Forward { message, .. }) = queue.try_pop() { collected_messages.push(message) } } @@ -1125,7 +1110,7 @@ fn test_handle_iwant_msg_cached() { /// Tests that messages are sent correctly depending on the shifting of the message cache. #[test] fn test_handle_iwant_msg_cached_shifted() { - let (mut gs, peers, mut receivers, _) = inject_nodes1() + let (mut gs, peers, mut queues, _) = inject_nodes1() .peer_no(20) .topics(Vec::new()) .to_subscribe(true) @@ -1159,28 +1144,23 @@ fn test_handle_iwant_msg_cached_shifted() { // is the message is being sent? let mut message_exists = false; - receivers = receivers.into_iter().map(|(peer_id, c)| { - let non_priority = c.non_priority.get_ref(); - while !non_priority.is_empty() { - if matches!(non_priority.try_recv(), Ok(RpcOut::Forward{message, timeout: _ }) if + queues = queues + .into_iter() + .map(|(peer_id, mut queue)| { + while !queue.is_empty() { + if matches!(queue.try_pop(), Some(RpcOut::Forward{message, ..}) if gs.config.message_id( &gs.data_transform .inbound_transform(message.clone()) .unwrap(), ) == msg_id) - { - message_exists = true; + { + message_exists = true; + } } - } - ( - peer_id, - Receiver { - priority_queue_len: c.priority_queue_len, - priority: c.priority, - non_priority: c.non_priority, - }, - ) - }).collect(); + (peer_id, queue) + }) + .collect(); // default history_length is 5, expect no messages after shift > 5 if shift < 5 { assert!( @@ -1217,7 +1197,7 @@ fn test_handle_iwant_msg_not_cached() { #[test] fn test_handle_iwant_msg_but_already_sent_idontwant() { - let (mut gs, peers, receivers, _) = inject_nodes1() + let (mut gs, peers, queues, _) = inject_nodes1() .peer_no(20) .topics(Vec::new()) .to_subscribe(true) @@ -1263,15 +1243,15 @@ fn test_handle_iwant_msg_but_already_sent_idontwant() { gs.handle_iwant(&peers[1], vec![msg_id.clone()]); // Check that no messages are sent. - receivers.iter().for_each(|(_, receiver)| { - assert!(receiver.non_priority.get_ref().is_empty()); + queues.iter().for_each(|(_, receiver_queue)| { + assert!(receiver_queue.is_empty()); }); } /// tests that an event is created when a peer shares that it has a message we want #[test] fn test_handle_ihave_subscribed_and_msg_not_cached() { - let (mut gs, peers, mut receivers, topic_hashes) = inject_nodes1() + let (mut gs, peers, mut queues, topic_hashes) = inject_nodes1() .peer_no(20) .topics(vec![String::from("topic1")]) .to_subscribe(true) @@ -1284,10 +1264,9 @@ fn test_handle_ihave_subscribed_and_msg_not_cached() { // check that we sent an IWANT request for `unknown id` let mut iwant_exists = false; - let receiver = receivers.remove(&peers[7]).unwrap(); - let non_priority = receiver.non_priority.get_ref(); - while !non_priority.is_empty() { - if let Ok(RpcOut::IWant(IWant { message_ids })) = non_priority.try_recv() { + let mut receiver_queue = queues.remove(&peers[7]).unwrap(); + while !receiver_queue.is_empty() { + if let Some(RpcOut::IWant(IWant { message_ids })) = receiver_queue.try_pop() { if message_ids .iter() .any(|m| *m == MessageId::new(b"unknown id")) @@ -1457,61 +1436,37 @@ fn test_handle_prune_peer_in_mesh() { } fn count_control_msgs( - receivers: HashMap, + queues: HashMap, mut filter: impl FnMut(&PeerId, &RpcOut) -> bool, -) -> (usize, HashMap) { - let mut new_receivers = HashMap::new(); +) -> (usize, HashMap) { + let mut new_queues = HashMap::new(); let mut collected_messages = 0; - for (peer_id, c) in receivers.into_iter() { - let priority = c.priority.get_ref(); - let non_priority = c.non_priority.get_ref(); - while !priority.is_empty() || !non_priority.is_empty() { - if let Ok(rpc) = priority.try_recv() { - if filter(&peer_id, &rpc) { - collected_messages += 1; - } - } - if let Ok(rpc) = non_priority.try_recv() { + for (peer_id, mut queue) in queues.into_iter() { + while !queue.is_empty() { + if let Some(rpc) = queue.try_pop() { if filter(&peer_id, &rpc) { collected_messages += 1; } } } - new_receivers.insert( - peer_id, - Receiver { - priority_queue_len: c.priority_queue_len, - priority: c.priority, - non_priority: c.non_priority, - }, - ); + new_queues.insert(peer_id, queue); } - (collected_messages, new_receivers) + (collected_messages, new_queues) } fn flush_events( gs: &mut Behaviour, - receivers: HashMap, -) -> HashMap { + queues: HashMap, +) -> HashMap { gs.events.clear(); - let mut new_receivers = HashMap::new(); - for (peer_id, c) in receivers.into_iter() { - let priority = c.priority.get_ref(); - let non_priority = c.non_priority.get_ref(); - while !priority.is_empty() || !non_priority.is_empty() { - let _ = priority.try_recv(); - let _ = non_priority.try_recv(); + let mut new_queues = HashMap::new(); + for (peer_id, mut queue) in queues.into_iter() { + while !queue.is_empty() { + let _ = queue.try_pop(); } - new_receivers.insert( - peer_id, - Receiver { - priority_queue_len: c.priority_queue_len, - priority: c.priority, - non_priority: c.non_priority, - }, - ); + new_queues.insert(peer_id, queue); } - new_receivers + new_queues } /// tests that a peer added as explicit peer gets connected to @@ -1550,7 +1505,7 @@ fn test_explicit_peer_reconnects() { .check_explicit_peers_ticks(2) .build() .unwrap(); - let (mut gs, others, receivers, _) = inject_nodes1() + let (mut gs, others, queues, _) = inject_nodes1() .peer_no(1) .topics(Vec::new()) .to_subscribe(true) @@ -1562,7 +1517,7 @@ fn test_explicit_peer_reconnects() { // add peer as explicit peer gs.add_explicit_peer(peer); - flush_events(&mut gs, receivers); + flush_events(&mut gs, queues); // disconnect peer disconnect_peer(&mut gs, peer); @@ -1600,7 +1555,7 @@ fn test_explicit_peer_reconnects() { #[test] fn test_handle_graft_explicit_peer() { - let (mut gs, peers, receivers, topic_hashes) = inject_nodes1() + let (mut gs, peers, queues, topic_hashes) = inject_nodes1() .peer_no(1) .topics(vec![String::from("topic1"), String::from("topic2")]) .to_subscribe(true) @@ -1617,7 +1572,7 @@ fn test_handle_graft_explicit_peer() { assert!(gs.mesh[&topic_hashes[1]].is_empty()); // check prunes - let (control_msgs, _) = count_control_msgs(receivers, |peer_id, m| { + let (control_msgs, _) = count_control_msgs(queues, |peer_id, m| { peer_id == peer && match m { RpcOut::Prune(Prune { topic_hash, .. }) => { @@ -1634,7 +1589,7 @@ fn test_handle_graft_explicit_peer() { #[test] fn explicit_peers_not_added_to_mesh_on_receiving_subscription() { - let (gs, peers, receivers, topic_hashes) = inject_nodes1() + let (gs, peers, queues, topic_hashes) = inject_nodes1() .peer_no(2) .topics(vec![String::from("topic1")]) .to_subscribe(true) @@ -1649,7 +1604,7 @@ fn explicit_peers_not_added_to_mesh_on_receiving_subscription() { ); // assert that graft gets created to non-explicit peer - let (control_msgs, receivers) = count_control_msgs(receivers, |peer_id, m| { + let (control_msgs, queues) = count_control_msgs(queues, |peer_id, m| { peer_id == &peers[1] && matches!(m, RpcOut::Graft { .. }) }); assert!( @@ -1658,7 +1613,7 @@ fn explicit_peers_not_added_to_mesh_on_receiving_subscription() { ); // assert that no graft gets created to explicit peer - let (control_msgs, _) = count_control_msgs(receivers, |peer_id, m| { + let (control_msgs, _) = count_control_msgs(queues, |peer_id, m| { peer_id == &peers[0] && matches!(m, RpcOut::Graft { .. }) }); assert_eq!( @@ -1669,7 +1624,7 @@ fn explicit_peers_not_added_to_mesh_on_receiving_subscription() { #[test] fn do_not_graft_explicit_peer() { - let (mut gs, others, receivers, topic_hashes) = inject_nodes1() + let (mut gs, others, queues, topic_hashes) = inject_nodes1() .peer_no(1) .topics(vec![String::from("topic")]) .to_subscribe(true) @@ -1683,7 +1638,7 @@ fn do_not_graft_explicit_peer() { assert_eq!(gs.mesh[&topic_hashes[0]], BTreeSet::new()); // assert that no graft gets created to explicit peer - let (control_msgs, _) = count_control_msgs(receivers, |peer_id, m| { + let (control_msgs, _) = count_control_msgs(queues, |peer_id, m| { peer_id == &others[0] && matches!(m, RpcOut::Graft { .. }) }); assert_eq!( @@ -1694,7 +1649,7 @@ fn do_not_graft_explicit_peer() { #[test] fn do_forward_messages_to_explicit_peers() { - let (mut gs, peers, receivers, topic_hashes) = inject_nodes1() + let (mut gs, peers, queues, topic_hashes) = inject_nodes1() .peer_no(2) .topics(vec![String::from("topic1"), String::from("topic2")]) .to_subscribe(true) @@ -1715,10 +1670,9 @@ fn do_forward_messages_to_explicit_peers() { }; gs.handle_received_message(message.clone(), &local_id); assert_eq!( - receivers.into_iter().fold(0, |mut fwds, (peer_id, c)| { - let non_priority = c.non_priority.get_ref(); - while !non_priority.is_empty() { - if matches!(non_priority.try_recv(), Ok(RpcOut::Forward{message: m, timeout: _}) if peer_id == peers[0] && m.data == message.data) { + queues.into_iter().fold(0, |mut fwds, (peer_id, mut queue)| { + while !queue.is_empty() { + if matches!(queue.try_pop(), Some(RpcOut::Forward{message: m, ..}) if peer_id == peers[0] && m.data == message.data) { fwds +=1; } } @@ -1731,7 +1685,7 @@ fn do_forward_messages_to_explicit_peers() { #[test] fn explicit_peers_not_added_to_mesh_on_subscribe() { - let (mut gs, peers, receivers, _) = inject_nodes1() + let (mut gs, peers, queues, _) = inject_nodes1() .peer_no(2) .topics(Vec::new()) .to_subscribe(true) @@ -1759,7 +1713,7 @@ fn explicit_peers_not_added_to_mesh_on_subscribe() { assert_eq!(gs.mesh[&topic_hash], vec![peers[1]].into_iter().collect()); // assert that graft gets created to non-explicit peer - let (control_msgs, receivers) = count_control_msgs(receivers, |peer_id, m| { + let (control_msgs, queues) = count_control_msgs(queues, |peer_id, m| { peer_id == &peers[1] && matches!(m, RpcOut::Graft { .. }) }); assert!( @@ -1768,7 +1722,7 @@ fn explicit_peers_not_added_to_mesh_on_subscribe() { ); // assert that no graft gets created to explicit peer - let (control_msgs, _) = count_control_msgs(receivers, |peer_id, m| { + let (control_msgs, _) = count_control_msgs(queues, |peer_id, m| { peer_id == &peers[0] && matches!(m, RpcOut::Graft { .. }) }); assert_eq!( @@ -1779,7 +1733,7 @@ fn explicit_peers_not_added_to_mesh_on_subscribe() { #[test] fn explicit_peers_not_added_to_mesh_from_fanout_on_subscribe() { - let (mut gs, peers, receivers, _) = inject_nodes1() + let (mut gs, peers, queues, _) = inject_nodes1() .peer_no(2) .topics(Vec::new()) .to_subscribe(true) @@ -1810,7 +1764,7 @@ fn explicit_peers_not_added_to_mesh_from_fanout_on_subscribe() { assert_eq!(gs.mesh[&topic_hash], vec![peers[1]].into_iter().collect()); // assert that graft gets created to non-explicit peer - let (control_msgs, receivers) = count_control_msgs(receivers, |peer_id, m| { + let (control_msgs, queues) = count_control_msgs(queues, |peer_id, m| { peer_id == &peers[1] && matches!(m, RpcOut::Graft { .. }) }); assert!( @@ -1819,7 +1773,7 @@ fn explicit_peers_not_added_to_mesh_from_fanout_on_subscribe() { ); // assert that no graft gets created to explicit peer - let (control_msgs, _) = count_control_msgs(receivers, |peer_id, m| { + let (control_msgs, _) = count_control_msgs(queues, |peer_id, m| { peer_id == &peers[0] && matches!(m, RpcOut::Graft { .. }) }); assert_eq!( @@ -1830,7 +1784,7 @@ fn explicit_peers_not_added_to_mesh_from_fanout_on_subscribe() { #[test] fn no_gossip_gets_sent_to_explicit_peers() { - let (mut gs, peers, mut receivers, topic_hashes) = inject_nodes1() + let (mut gs, peers, mut queues, topic_hashes) = inject_nodes1() .peer_no(2) .topics(vec![String::from("topic1"), String::from("topic2")]) .to_subscribe(true) @@ -1859,11 +1813,10 @@ fn no_gossip_gets_sent_to_explicit_peers() { } // assert that no gossip gets sent to explicit peer - let receiver = receivers.remove(&peers[0]).unwrap(); + let mut receiver_queue = queues.remove(&peers[0]).unwrap(); let mut gossips = 0; - let non_priority = receiver.non_priority.get_ref(); - while !non_priority.is_empty() { - if let Ok(RpcOut::IHave(_)) = non_priority.try_recv() { + while !receiver_queue.is_empty() { + if let Some(RpcOut::IHave(_)) = receiver_queue.try_pop() { gossips += 1; } } @@ -1876,7 +1829,7 @@ fn test_mesh_addition() { let config: Config = Config::default(); // Adds mesh_low peers and PRUNE 2 giving us a deficit. - let (mut gs, peers, _receivers, topics) = inject_nodes1() + let (mut gs, peers, _queues, topics) = inject_nodes1() .peer_no(config.mesh_n() + 1) .topics(vec!["test".into()]) .to_subscribe(true) @@ -1912,7 +1865,7 @@ fn test_mesh_subtraction() { // Adds mesh_low peers and PRUNE 2 giving us a deficit. let n = config.mesh_n_high() + 10; // make all outbound connections so that we allow grafting to all - let (mut gs, peers, _receivers, topics) = inject_nodes1() + let (mut gs, peers, _queues, topics) = inject_nodes1() .peer_no(n) .topics(vec!["test".into()]) .to_subscribe(true) @@ -1992,7 +1945,7 @@ fn test_send_px_and_backoff_in_prune() { let config: Config = Config::default(); // build mesh with enough peers for px - let (mut gs, peers, receivers, topics) = inject_nodes1() + let (mut gs, peers, queues, topics) = inject_nodes1() .peer_no(config.prune_peers() + 1) .topics(vec!["test".into()]) .to_subscribe(true) @@ -2008,7 +1961,7 @@ fn test_send_px_and_backoff_in_prune() { ); // check prune message - let (control_msgs, _) = count_control_msgs(receivers, |peer_id, m| { + let (control_msgs, _) = count_control_msgs(queues, |peer_id, m| { peer_id == &peers[0] && match m { RpcOut::Prune(Prune { @@ -2034,7 +1987,7 @@ fn test_prune_backoffed_peer_on_graft() { let config: Config = Config::default(); // build mesh with enough peers for px - let (mut gs, peers, receivers, topics) = inject_nodes1() + let (mut gs, peers, queues, topics) = inject_nodes1() .peer_no(config.prune_peers() + 1) .topics(vec!["test".into()]) .to_subscribe(true) @@ -2051,13 +2004,13 @@ fn test_prune_backoffed_peer_on_graft() { ); // ignore all messages until now - let receivers = flush_events(&mut gs, receivers); + let queues = flush_events(&mut gs, queues); // handle graft gs.handle_graft(&peers[0], vec![topics[0].clone()]); // check prune message - let (control_msgs, _) = count_control_msgs(receivers, |peer_id, m| { + let (control_msgs, _) = count_control_msgs(queues, |peer_id, m| { peer_id == &peers[0] && match m { RpcOut::Prune(Prune { @@ -2084,7 +2037,7 @@ fn test_do_not_graft_within_backoff_period() { .build() .unwrap(); // only one peer => mesh too small and will try to regraft as early as possible - let (mut gs, peers, receivers, topics) = inject_nodes1() + let (mut gs, peers, queues, topics) = inject_nodes1() .peer_no(1) .topics(vec!["test".into()]) .to_subscribe(true) @@ -2095,7 +2048,7 @@ fn test_do_not_graft_within_backoff_period() { gs.handle_prune(&peers[0], vec![(topics[0].clone(), Vec::new(), Some(1))]); // forget all events until now - let receivers = flush_events(&mut gs, receivers); + let queues = flush_events(&mut gs, queues); // call heartbeat gs.heartbeat(); @@ -2108,8 +2061,8 @@ fn test_do_not_graft_within_backoff_period() { // Check that no graft got created (we have backoff_slack = 1 therefore one more heartbeat // is needed). - let (control_msgs, receivers) = - count_control_msgs(receivers, |_, m| matches!(m, RpcOut::Graft { .. })); + let (control_msgs, queues) = + count_control_msgs(queues, |_, m| matches!(m, RpcOut::Graft { .. })); assert_eq!( control_msgs, 0, "Graft message created too early within backoff period" @@ -2120,7 +2073,7 @@ fn test_do_not_graft_within_backoff_period() { gs.heartbeat(); // check that graft got created - let (control_msgs, _) = count_control_msgs(receivers, |_, m| matches!(m, RpcOut::Graft { .. })); + let (control_msgs, _) = count_control_msgs(queues, |_, m| matches!(m, RpcOut::Graft { .. })); assert!( control_msgs > 0, "No graft message was created after backoff period" @@ -2137,7 +2090,7 @@ fn test_do_not_graft_within_default_backoff_period_after_receiving_prune_without .build() .unwrap(); // only one peer => mesh too small and will try to regraft as early as possible - let (mut gs, peers, receivers, topics) = inject_nodes1() + let (mut gs, peers, queues, topics) = inject_nodes1() .peer_no(1) .topics(vec!["test".into()]) .to_subscribe(true) @@ -2148,7 +2101,7 @@ fn test_do_not_graft_within_default_backoff_period_after_receiving_prune_without gs.handle_prune(&peers[0], vec![(topics[0].clone(), Vec::new(), None)]); // forget all events until now - let receivers = flush_events(&mut gs, receivers); + let queues = flush_events(&mut gs, queues); // call heartbeat gs.heartbeat(); @@ -2159,8 +2112,8 @@ fn test_do_not_graft_within_default_backoff_period_after_receiving_prune_without // Check that no graft got created (we have backoff_slack = 1 therefore one more heartbeat // is needed). - let (control_msgs, receivers) = - count_control_msgs(receivers, |_, m| matches!(m, RpcOut::Graft { .. })); + let (control_msgs, queues) = + count_control_msgs(queues, |_, m| matches!(m, RpcOut::Graft { .. })); assert_eq!( control_msgs, 0, "Graft message created too early within backoff period" @@ -2171,7 +2124,7 @@ fn test_do_not_graft_within_default_backoff_period_after_receiving_prune_without gs.heartbeat(); // check that graft got created - let (control_msgs, _) = count_control_msgs(receivers, |_, m| matches!(m, RpcOut::Graft { .. })); + let (control_msgs, _) = count_control_msgs(queues, |_, m| matches!(m, RpcOut::Graft { .. })); assert!( control_msgs > 0, "No graft message was created after backoff period" @@ -2192,7 +2145,7 @@ fn test_unsubscribe_backoff() { let topic = String::from("test"); // only one peer => mesh too small and will try to regraft as early as possible - let (mut gs, _, receivers, topics) = inject_nodes1() + let (mut gs, _, queues, topics) = inject_nodes1() .peer_no(1) .topics(vec![topic.clone()]) .to_subscribe(true) @@ -2201,7 +2154,7 @@ fn test_unsubscribe_backoff() { let _ = gs.unsubscribe(&Topic::new(topic)); - let (control_msgs, receivers) = count_control_msgs(receivers, |_, m| match m { + let (control_msgs, queues) = count_control_msgs(queues, |_, m| match m { RpcOut::Prune(Prune { backoff, .. }) => backoff == &Some(1), _ => false, }); @@ -2213,7 +2166,7 @@ fn test_unsubscribe_backoff() { let _ = gs.subscribe(&Topic::new(topics[0].to_string())); // forget all events until now - let receivers = flush_events(&mut gs, receivers); + let queues = flush_events(&mut gs, queues); // call heartbeat gs.heartbeat(); @@ -2226,8 +2179,8 @@ fn test_unsubscribe_backoff() { // Check that no graft got created (we have backoff_slack = 1 therefore one more heartbeat // is needed). - let (control_msgs, receivers) = - count_control_msgs(receivers, |_, m| matches!(m, RpcOut::Graft { .. })); + let (control_msgs, queues) = + count_control_msgs(queues, |_, m| matches!(m, RpcOut::Graft { .. })); assert_eq!( control_msgs, 0, "Graft message created too early within backoff period" @@ -2238,7 +2191,7 @@ fn test_unsubscribe_backoff() { gs.heartbeat(); // check that graft got created - let (control_msgs, _) = count_control_msgs(receivers, |_, m| matches!(m, RpcOut::Graft { .. })); + let (control_msgs, _) = count_control_msgs(queues, |_, m| matches!(m, RpcOut::Graft { .. })); assert!( control_msgs > 0, "No graft message was created after backoff period" @@ -2251,7 +2204,7 @@ fn test_flood_publish() { let topic = "test"; // Adds more peers than mesh can hold to test flood publishing - let (mut gs, _, receivers, _) = inject_nodes1() + let (mut gs, _, queues, _) = inject_nodes1() .peer_no(config.mesh_n_high() + 10) .topics(vec![topic.into()]) .to_subscribe(true) @@ -2262,12 +2215,11 @@ fn test_flood_publish() { gs.publish(Topic::new(topic), publish_data).unwrap(); // Collect all publish messages - let publishes = receivers + let publishes = queues .into_values() - .fold(vec![], |mut collected_publish, c| { - let priority = c.priority.get_ref(); - while !priority.is_empty() { - if let Ok(RpcOut::Publish { message, .. }) = priority.try_recv() { + .fold(vec![], |mut collected_publish, mut queue| { + while !queue.is_empty() { + if let Some(RpcOut::Publish { message, .. }) = queue.try_pop() { collected_publish.push(message); } } @@ -2306,7 +2258,7 @@ fn test_gossip_to_at_least_gossip_lazy_peers() { // add more peers than in mesh to test gossipping // by default only mesh_n_low peers will get added to mesh - let (mut gs, _, receivers, topic_hashes) = inject_nodes1() + let (mut gs, _, queues, topic_hashes) = inject_nodes1() .peer_no(config.mesh_n_low() + config.gossip_lazy() + 1) .topics(vec!["topic".into()]) .to_subscribe(true) @@ -2333,7 +2285,7 @@ fn test_gossip_to_at_least_gossip_lazy_peers() { let msg_id = gs.config.message_id(message); // check that exactly config.gossip_lazy() many gossip messages were sent. - let (control_msgs, _) = count_control_msgs(receivers, |_, action| match action { + let (control_msgs, _) = count_control_msgs(queues, |_, action| match action { RpcOut::IHave(IHave { topic_hash, message_ids, @@ -2349,7 +2301,7 @@ fn test_gossip_to_at_most_gossip_factor_peers() { // add a lot of peers let m = config.mesh_n_low() + config.gossip_lazy() * (2.0 / config.gossip_factor()) as usize; - let (mut gs, _, receivers, topic_hashes) = inject_nodes1() + let (mut gs, _, queues, topic_hashes) = inject_nodes1() .peer_no(m) .topics(vec!["topic".into()]) .to_subscribe(true) @@ -2375,7 +2327,7 @@ fn test_gossip_to_at_most_gossip_factor_peers() { let msg_id = gs.config.message_id(message); // check that exactly config.gossip_lazy() many gossip messages were sent. - let (control_msgs, _) = count_control_msgs(receivers, |_, action| match action { + let (control_msgs, _) = count_control_msgs(queues, |_, action| match action { RpcOut::IHave(IHave { topic_hash, message_ids, @@ -2408,8 +2360,8 @@ fn test_accept_only_outbound_peer_grafts_when_mesh_full() { assert_eq!(gs.mesh[&topics[0]].len(), config.mesh_n_high()); // create an outbound and an inbound peer - let (inbound, _in_receiver) = add_peer(&mut gs, &topics, false, false); - let (outbound, _out_receiver) = add_peer(&mut gs, &topics, true, false); + let (inbound, _in_queue) = add_peer(&mut gs, &topics, false, false); + let (outbound, _out_queue) = add_peer(&mut gs, &topics, true, false); // send grafts gs.handle_graft(&inbound, vec![topics[0].clone()]); @@ -2439,7 +2391,7 @@ fn test_do_not_remove_too_many_outbound_peers() { .unwrap(); // fill the mesh with inbound connections - let (mut gs, peers, _receivers, topics) = inject_nodes1() + let (mut gs, peers, _queues, topics) = inject_nodes1() .peer_no(n) .topics(vec!["test".into()]) .to_subscribe(true) @@ -2512,7 +2464,7 @@ fn test_prune_negative_scored_peers() { let config = Config::default(); // build mesh with one peer - let (mut gs, peers, receivers, topics) = inject_nodes1() + let (mut gs, peers, queues, topics) = inject_nodes1() .peer_no(1) .topics(vec!["test".into()]) .to_subscribe(true) @@ -2535,7 +2487,7 @@ fn test_prune_negative_scored_peers() { assert!(gs.mesh[&topics[0]].is_empty()); // check prune message - let (control_msgs, _) = count_control_msgs(receivers, |peer_id, m| { + let (control_msgs, _) = count_control_msgs(queues, |peer_id, m| { peer_id == &peers[0] && match m { RpcOut::Prune(Prune { @@ -2570,8 +2522,8 @@ fn test_dont_graft_to_negative_scored_peers() { .create_network(); // add two additional peers that will not be part of the mesh - let (p1, _receiver1) = add_peer(&mut gs, &topics, false, false); - let (p2, _receiver2) = add_peer(&mut gs, &topics, false, false); + let (p1, _queue1) = add_peer(&mut gs, &topics, false, false); + let (p2, _queue2) = add_peer(&mut gs, &topics, false, false); // reduce score of p1 to negative gs.as_peer_score_mut().add_penalty(&p1, 1); @@ -2644,7 +2596,7 @@ fn test_only_send_nonnegative_scoring_peers_in_px() { .unwrap(); // Build mesh with three peer - let (mut gs, peers, receivers, topics) = inject_nodes1() + let (mut gs, peers, queues, topics) = inject_nodes1() .peer_no(3) .topics(vec!["test".into()]) .to_subscribe(true) @@ -2670,7 +2622,7 @@ fn test_only_send_nonnegative_scoring_peers_in_px() { ); // Check that px in prune message only contains third peer - let (control_msgs, _) = count_control_msgs(receivers, |peer_id, m| { + let (control_msgs, _) = count_control_msgs(queues, |peer_id, m| { peer_id == &peers[1] && match m { RpcOut::Prune(Prune { @@ -2698,7 +2650,7 @@ fn test_do_not_gossip_to_peers_below_gossip_threshold() { }; // Build full mesh - let (mut gs, peers, mut receivers, topics) = inject_nodes1() + let (mut gs, peers, mut queues, topics) = inject_nodes1() .peer_no(config.mesh_n_high()) .topics(vec!["test".into()]) .to_subscribe(true) @@ -2712,10 +2664,10 @@ fn test_do_not_gossip_to_peers_below_gossip_threshold() { } // Add two additional peers that will not be part of the mesh - let (p1, receiver1) = add_peer(&mut gs, &topics, false, false); - receivers.insert(p1, receiver1); - let (p2, receiver2) = add_peer(&mut gs, &topics, false, false); - receivers.insert(p2, receiver2); + let (p1, queue1) = add_peer(&mut gs, &topics, false, false); + queues.insert(p1, queue1); + let (p2, queue2) = add_peer(&mut gs, &topics, false, false); + queues.insert(p2, queue2); // Reduce score of p1 below peer_score_thresholds.gossip_threshold // note that penalties get squared so two penalties means a score of @@ -2746,7 +2698,7 @@ fn test_do_not_gossip_to_peers_below_gossip_threshold() { gs.emit_gossip(); // Check that exactly one gossip messages got sent and it got sent to p2 - let (control_msgs, _) = count_control_msgs(receivers, |peer, action| match action { + let (control_msgs, _) = count_control_msgs(queues, |peer, action| match action { RpcOut::IHave(IHave { topic_hash, message_ids, @@ -2773,7 +2725,7 @@ fn test_iwant_msg_from_peer_below_gossip_threshold_gets_ignored() { }; // Build full mesh - let (mut gs, peers, mut receivers, topics) = inject_nodes1() + let (mut gs, peers, mut queues, topics) = inject_nodes1() .peer_no(config.mesh_n_high()) .topics(vec!["test".into()]) .to_subscribe(true) @@ -2789,10 +2741,10 @@ fn test_iwant_msg_from_peer_below_gossip_threshold_gets_ignored() { } // Add two additional peers that will not be part of the mesh - let (p1, receiver1) = add_peer(&mut gs, &topics, false, false); - receivers.insert(p1, receiver1); - let (p2, receiver2) = add_peer(&mut gs, &topics, false, false); - receivers.insert(p2, receiver2); + let (p1, queue1) = add_peer(&mut gs, &topics, false, false); + queues.insert(p1, queue1); + let (p2, queue2) = add_peer(&mut gs, &topics, false, false); + queues.insert(p2, queue2); // Reduce score of p1 below peer_score_thresholds.gossip_threshold // note that penalties get squared so two penalties means a score of @@ -2824,12 +2776,11 @@ fn test_iwant_msg_from_peer_below_gossip_threshold_gets_ignored() { // the messages we are sending let sent_messages = - receivers + queues .into_iter() - .fold(vec![], |mut collected_messages, (peer_id, c)| { - let non_priority = c.non_priority.get_ref(); - while !non_priority.is_empty() { - if let Ok(RpcOut::Forward { message, .. }) = non_priority.try_recv() { + .fold(vec![], |mut collected_messages, (peer_id, mut queue)| { + while !queue.is_empty() { + if let Some(RpcOut::Forward { message, .. }) = queue.try_pop() { collected_messages.push((peer_id, message)); } } @@ -2863,7 +2814,7 @@ fn test_ihave_msg_from_peer_below_gossip_threshold_gets_ignored() { ..PeerScoreThresholds::default() }; // build full mesh - let (mut gs, peers, mut receivers, topics) = inject_nodes1() + let (mut gs, peers, mut queues, topics) = inject_nodes1() .peer_no(config.mesh_n_high()) .topics(vec!["test".into()]) .to_subscribe(true) @@ -2879,10 +2830,10 @@ fn test_ihave_msg_from_peer_below_gossip_threshold_gets_ignored() { } // add two additional peers that will not be part of the mesh - let (p1, receiver1) = add_peer(&mut gs, &topics, false, false); - receivers.insert(p1, receiver1); - let (p2, receiver2) = add_peer(&mut gs, &topics, false, false); - receivers.insert(p2, receiver2); + let (p1, queue1) = add_peer(&mut gs, &topics, false, false); + queues.insert(p1, queue1); + let (p2, queue2) = add_peer(&mut gs, &topics, false, false); + queues.insert(p2, queue2); // reduce score of p1 below peer_score_thresholds.gossip_threshold // note that penalties get squared so two penalties means a score of @@ -2912,7 +2863,7 @@ fn test_ihave_msg_from_peer_below_gossip_threshold_gets_ignored() { gs.handle_ihave(&p2, vec![(topics[0].clone(), vec![msg_id.clone()])]); // check that we sent exactly one IWANT request to p2 - let (control_msgs, _) = count_control_msgs(receivers, |peer, c| match c { + let (control_msgs, _) = count_control_msgs(queues, |peer, c| match c { RpcOut::IWant(IWant { message_ids }) => { if message_ids.iter().any(|m| m == &msg_id) { assert_eq!(peer, &p2); @@ -2940,7 +2891,7 @@ fn test_do_not_publish_to_peer_below_publish_threshold() { }; // build mesh with no peers and no subscribed topics - let (mut gs, _, mut receivers, _) = inject_nodes1() + let (mut gs, _, mut queues, _) = inject_nodes1() .gs_config(config) .scoring(Some((peer_score_params, peer_score_thresholds))) .create_network(); @@ -2950,10 +2901,10 @@ fn test_do_not_publish_to_peer_below_publish_threshold() { let topics = vec![topic.hash()]; // add two additional peers that will be added to the mesh - let (p1, receiver1) = add_peer(&mut gs, &topics, false, false); - receivers.insert(p1, receiver1); - let (p2, receiver2) = add_peer(&mut gs, &topics, false, false); - receivers.insert(p2, receiver2); + let (p1, queue1) = add_peer(&mut gs, &topics, false, false); + queues.insert(p1, queue1); + let (p2, queue2) = add_peer(&mut gs, &topics, false, false); + queues.insert(p2, queue2); // reduce score of p1 below peer_score_thresholds.publish_threshold // note that penalties get squared so two penalties means a score of @@ -2971,17 +2922,17 @@ fn test_do_not_publish_to_peer_below_publish_threshold() { gs.publish(topic, publish_data).unwrap(); // Collect all publish messages - let publishes = receivers - .into_iter() - .fold(vec![], |mut collected_publish, (peer_id, c)| { - let priority = c.priority.get_ref(); - while !priority.is_empty() { - if let Ok(RpcOut::Publish { message, .. }) = priority.try_recv() { - collected_publish.push((peer_id, message)); + let publishes = + queues + .into_iter() + .fold(vec![], |mut collected_publish, (peer_id, mut queue)| { + while !queue.is_empty() { + if let Some(RpcOut::Publish { message, .. }) = queue.try_pop() { + collected_publish.push((peer_id, message)); + } } - } - collected_publish - }); + collected_publish + }); // assert only published to p2 assert_eq!(publishes.len(), 1); @@ -2998,17 +2949,17 @@ fn test_do_not_flood_publish_to_peer_below_publish_threshold() { ..PeerScoreThresholds::default() }; // build mesh with no peers - let (mut gs, _, mut receivers, topics) = inject_nodes1() + let (mut gs, _, mut queues, topics) = inject_nodes1() .topics(vec!["test".into()]) .gs_config(config) .scoring(Some((peer_score_params, peer_score_thresholds))) .create_network(); // add two additional peers that will be added to the mesh - let (p1, receiver1) = add_peer(&mut gs, &topics, false, false); - receivers.insert(p1, receiver1); - let (p2, receiver2) = add_peer(&mut gs, &topics, false, false); - receivers.insert(p2, receiver2); + let (p1, queue1) = add_peer(&mut gs, &topics, false, false); + queues.insert(p1, queue1); + let (p2, queue2) = add_peer(&mut gs, &topics, false, false); + queues.insert(p2, queue2); // reduce score of p1 below peer_score_thresholds.publish_threshold // note that penalties get squared so two penalties means a score of @@ -3026,17 +2977,17 @@ fn test_do_not_flood_publish_to_peer_below_publish_threshold() { gs.publish(Topic::new("test"), publish_data).unwrap(); // Collect all publish messages - let publishes = receivers - .into_iter() - .fold(vec![], |mut collected_publish, (peer_id, c)| { - let priority = c.priority.get_ref(); - while !priority.is_empty() { - if let Ok(RpcOut::Publish { message, .. }) = priority.try_recv() { - collected_publish.push((peer_id, message)) + let publishes = + queues + .into_iter() + .fold(vec![], |mut collected_publish, (peer_id, mut queue)| { + while !queue.is_empty() { + if let Some(RpcOut::Publish { message, .. }) = queue.try_pop() { + collected_publish.push((peer_id, message)) + } } - } - collected_publish - }); + collected_publish + }); // assert only published to p2 assert_eq!(publishes.len(), 1); @@ -3062,8 +3013,8 @@ fn test_ignore_rpc_from_peers_below_graylist_threshold() { .create_network(); // add two additional peers that will be added to the mesh - let (p1, _receiver1) = add_peer(&mut gs, &topics, false, false); - let (p2, _receiver2) = add_peer(&mut gs, &topics, false, false); + let (p1, _queue1) = add_peer(&mut gs, &topics, false, false); + let (p2, _queue2) = add_peer(&mut gs, &topics, false, false); // reduce score of p1 below peer_score_thresholds.graylist_threshold // note that penalties get squared so two penalties means a score of @@ -3256,7 +3207,7 @@ fn test_keep_best_scoring_peers_on_oversubscription() { // build mesh with more peers than mesh can hold let n = config.mesh_n_high() + 1; - let (mut gs, peers, _receivers, topics) = inject_nodes1() + let (mut gs, peers, _queues, topics) = inject_nodes1() .peer_no(n) .topics(vec!["test".into()]) .to_subscribe(true) @@ -4369,7 +4320,7 @@ fn test_scoring_p7_grafts_before_backoff() { ..Default::default() }; - let (mut gs, peers, _receivers, topics) = inject_nodes1() + let (mut gs, peers, _queues, topics) = inject_nodes1() .peer_no(2) .topics(vec!["test".into()]) .to_subscribe(false) @@ -4446,7 +4397,7 @@ fn test_opportunistic_grafting() { ..Default::default() }; - let (mut gs, peers, _receivers, topics) = inject_nodes1() + let (mut gs, peers, _queues, topics) = inject_nodes1() .peer_no(5) .topics(vec!["test".into()]) .to_subscribe(false) @@ -4475,7 +4426,7 @@ fn test_opportunistic_grafting() { } // set scores for peers in the mesh - for (i, (peer, _receiver)) in others.iter().enumerate().take(5) { + for (i, (peer, _queue)) in others.iter().enumerate().take(5) { gs.set_application_score(peer, 0.0 + i as f64); } @@ -4523,7 +4474,7 @@ fn test_opportunistic_grafting() { #[test] fn test_ignore_graft_from_unknown_topic() { // build gossipsub without subscribing to any topics - let (mut gs, peers, receivers, _) = inject_nodes1() + let (mut gs, peers, queues, _) = inject_nodes1() .peer_no(1) .topics(vec![]) .to_subscribe(false) @@ -4533,7 +4484,7 @@ fn test_ignore_graft_from_unknown_topic() { gs.handle_graft(&peers[0], vec![Topic::new("test").hash()]); // assert that no prune got created - let (control_msgs, _) = count_control_msgs(receivers, |_, a| matches!(a, RpcOut::Prune { .. })); + let (control_msgs, _) = count_control_msgs(queues, |_, a| matches!(a, RpcOut::Prune { .. })); assert_eq!( control_msgs, 0, "we should not prune after graft in unknown topic" @@ -4544,15 +4495,15 @@ fn test_ignore_graft_from_unknown_topic() { fn test_ignore_too_many_iwants_from_same_peer_for_same_message() { let config = Config::default(); // build gossipsub with full mesh - let (mut gs, _, mut receivers, topics) = inject_nodes1() + let (mut gs, _, mut queues, topics) = inject_nodes1() .peer_no(config.mesh_n_high()) .topics(vec!["test".into()]) .to_subscribe(false) .create_network(); // add another peer not in the mesh - let (peer, receiver) = add_peer(&mut gs, &topics, false, false); - receivers.insert(peer, receiver); + let (peer, queue) = add_peer(&mut gs, &topics, false, false); + queues.insert(peer, queue); // receive a message let mut seq = 0; @@ -4566,7 +4517,7 @@ fn test_ignore_too_many_iwants_from_same_peer_for_same_message() { gs.handle_received_message(m1, &PeerId::random()); // clear events - let receivers = flush_events(&mut gs, receivers); + let queues = flush_events(&mut gs, queues); // the first gossip_retransimission many iwants return the valid message, all others are // ignored. @@ -4575,10 +4526,9 @@ fn test_ignore_too_many_iwants_from_same_peer_for_same_message() { } assert_eq!( - receivers.into_values().fold(0, |mut fwds, c| { - let non_priority = c.non_priority.get_ref(); - while !non_priority.is_empty() { - if let Ok(RpcOut::Forward { .. }) = non_priority.try_recv() { + queues.into_values().fold(0, |mut fwds, mut queue| { + while !queue.is_empty() { + if let Some(RpcOut::Forward { .. }) = queue.try_pop() { fwds += 1; } } @@ -4596,7 +4546,7 @@ fn test_ignore_too_many_ihaves() { .build() .unwrap(); // build gossipsub with full mesh - let (mut gs, _, mut receivers, topics) = inject_nodes1() + let (mut gs, _, mut queues, topics) = inject_nodes1() .peer_no(config.mesh_n_high()) .topics(vec!["test".into()]) .to_subscribe(false) @@ -4604,8 +4554,8 @@ fn test_ignore_too_many_ihaves() { .create_network(); // add another peer not in the mesh - let (peer, receiver) = add_peer(&mut gs, &topics, false, false); - receivers.insert(peer, receiver); + let (peer, queue) = add_peer(&mut gs, &topics, false, false); + queues.insert(peer, queue); // peer has 20 messages let mut seq = 0; @@ -4633,7 +4583,7 @@ fn test_ignore_too_many_ihaves() { .collect(); // we send iwant only for the first 10 messages - let (control_msgs, receivers) = count_control_msgs(receivers, |p, action| { + let (control_msgs, queues) = count_control_msgs(queues, |p, action| { p == &peer && matches!(action, RpcOut::IWant(IWant { message_ids }) if message_ids.len() == 1 && first_ten.contains(&message_ids[0])) }); @@ -4659,7 +4609,7 @@ fn test_ignore_too_many_ihaves() { } // we sent iwant for all 10 messages - let (control_msgs, _) = count_control_msgs(receivers, |p, action| { + let (control_msgs, _) = count_control_msgs(queues, |p, action| { p == &peer && matches!(action, RpcOut::IWant(IWant { message_ids }) if message_ids.len() == 1) }); @@ -4674,7 +4624,7 @@ fn test_ignore_too_many_messages_in_ihave() { .build() .unwrap(); // build gossipsub with full mesh - let (mut gs, _, mut receivers, topics) = inject_nodes1() + let (mut gs, _, mut queues, topics) = inject_nodes1() .peer_no(config.mesh_n_high()) .topics(vec!["test".into()]) .to_subscribe(false) @@ -4682,8 +4632,8 @@ fn test_ignore_too_many_messages_in_ihave() { .create_network(); // add another peer not in the mesh - let (peer, receiver) = add_peer(&mut gs, &topics, false, false); - receivers.insert(peer, receiver); + let (peer, queue) = add_peer(&mut gs, &topics, false, false); + queues.insert(peer, queue); // peer has 30 messages let mut seq = 0; @@ -4708,7 +4658,7 @@ fn test_ignore_too_many_messages_in_ihave() { // we send iwant only for the first 10 messages let mut sum = 0; - let (control_msgs, receivers) = count_control_msgs(receivers, |p, rpc| match rpc { + let (control_msgs, queues) = count_control_msgs(queues, |p, rpc| match rpc { RpcOut::IWant(IWant { message_ids }) => { p == &peer && { assert!(first_twelve.is_superset(&message_ids.iter().collect())); @@ -4734,7 +4684,7 @@ fn test_ignore_too_many_messages_in_ihave() { // we sent 10 iwant messages ids via a IWANT rpc. let mut sum = 0; - let (control_msgs, _) = count_control_msgs(receivers, |p, rpc| match rpc { + let (control_msgs, _) = count_control_msgs(queues, |p, rpc| match rpc { RpcOut::IWant(IWant { message_ids }) => { p == &peer && { sum += message_ids.len(); @@ -4755,7 +4705,7 @@ fn test_limit_number_of_message_ids_inside_ihave() { .build() .unwrap(); // build gossipsub with full mesh - let (mut gs, peers, mut receivers, topics) = inject_nodes1() + let (mut gs, peers, mut queues, topics) = inject_nodes1() .peer_no(config.mesh_n_high()) .topics(vec!["test".into()]) .to_subscribe(false) @@ -4768,10 +4718,10 @@ fn test_limit_number_of_message_ids_inside_ihave() { } // add two other peers not in the mesh - let (p1, receiver1) = add_peer(&mut gs, &topics, false, false); - receivers.insert(p1, receiver1); - let (p2, receiver2) = add_peer(&mut gs, &topics, false, false); - receivers.insert(p2, receiver2); + let (p1, queue1) = add_peer(&mut gs, &topics, false, false); + queues.insert(p1, queue1); + let (p2, queue2) = add_peer(&mut gs, &topics, false, false); + queues.insert(p2, queue2); // receive 200 messages from another peer let mut seq = 0; @@ -4789,7 +4739,7 @@ fn test_limit_number_of_message_ids_inside_ihave() { let mut ihaves1 = HashSet::new(); let mut ihaves2 = HashSet::new(); - let (control_msgs, _) = count_control_msgs(receivers, |p, action| match action { + let (control_msgs, _) = count_control_msgs(queues, |p, action| match action { RpcOut::IHave(IHave { message_ids, .. }) => { if p == &p1 { ihaves1 = message_ids.iter().cloned().collect(); @@ -4870,7 +4820,7 @@ fn test_iwant_penalties() { let mut first_messages = Vec::new(); let mut second_messages = Vec::new(); let mut seq = 0; - for (peer, _receiver) in &other_peers { + for (peer, _queue) in &other_peers { let msg1 = random_message(&mut seq, &topics); let msg2 = random_message(&mut seq, &topics); @@ -4893,19 +4843,19 @@ fn test_iwant_penalties() { } // the peers send us all the first message ids in time - for (index, (peer, _receiver)) in other_peers.iter().enumerate() { + for (index, (peer, _queue)) in other_peers.iter().enumerate() { gs.handle_received_message(first_messages[index].clone(), peer); } // now we do a heartbeat no penalization should have been applied yet gs.heartbeat(); - for (peer, _receiver) in &other_peers { + for (peer, _queue) in &other_peers { assert_eq!(gs.as_peer_score_mut().score_report(peer).score, 0.0); } // receive the first twenty of the other peers then send their response - for (index, (peer, _receiver)) in other_peers.iter().enumerate().take(20) { + for (index, (peer, _queue)) in other_peers.iter().enumerate().take(20) { gs.handle_received_message(second_messages[index].clone(), peer); } @@ -4916,7 +4866,7 @@ fn test_iwant_penalties() { gs.heartbeat(); // now we get the second messages from the last 80 peers. - for (index, (peer, _receiver)) in other_peers.iter().enumerate() { + for (index, (peer, _queue)) in other_peers.iter().enumerate() { if index > 19 { gs.handle_received_message(second_messages[index].clone(), peer); } @@ -4930,7 +4880,7 @@ fn test_iwant_penalties() { let mut single_penalized = 0; let mut double_penalized = 0; - for (i, (peer, _receiver)) in other_peers.iter().enumerate() { + for (i, (peer, _queue)) in other_peers.iter().enumerate() { let score = gs.as_peer_score_mut().score_report(peer).score; if score == 0.0 { not_penalized += 1; @@ -4958,7 +4908,7 @@ fn test_publish_to_floodsub_peers_without_flood_publish() { .flood_publish(false) .build() .unwrap(); - let (mut gs, _, mut receivers, topics) = inject_nodes1() + let (mut gs, _, mut queues, topics) = inject_nodes1() .peer_no(config.mesh_n_low() - 1) .topics(vec!["test".into()]) .to_subscribe(false) @@ -4966,7 +4916,7 @@ fn test_publish_to_floodsub_peers_without_flood_publish() { .create_network(); // add two floodsub peer, one explicit, one implicit - let (p1, receiver1) = add_peer_with_addr_and_kind( + let (p1, queue1) = add_peer_with_addr_and_kind( &mut gs, &topics, false, @@ -4974,11 +4924,11 @@ fn test_publish_to_floodsub_peers_without_flood_publish() { Multiaddr::empty(), Some(PeerKind::Floodsub), ); - receivers.insert(p1, receiver1); + queues.insert(p1, queue1); - let (p2, receiver2) = + let (p2, queue2) = add_peer_with_addr_and_kind(&mut gs, &topics, false, false, Multiaddr::empty(), None); - receivers.insert(p2, receiver2); + queues.insert(p2, queue2); // p1 and p2 are not in the mesh assert!(!gs.mesh[&topics[0]].contains(&p1) && !gs.mesh[&topics[0]].contains(&p2)); @@ -4988,13 +4938,12 @@ fn test_publish_to_floodsub_peers_without_flood_publish() { gs.publish(Topic::new("test"), publish_data).unwrap(); // Collect publish messages to floodsub peers - let publishes = receivers + let publishes = queues .into_iter() - .fold(0, |mut collected_publish, (peer_id, c)| { - let priority = c.priority.get_ref(); - while !priority.is_empty() { - if matches!(priority.try_recv(), - Ok(RpcOut::Publish{..}) if peer_id == p1 || peer_id == p2) + .fold(0, |mut collected_publish, (peer_id, mut queue)| { + while !queue.is_empty() { + if matches!(queue.try_pop(), + Some(RpcOut::Publish{..}) if peer_id == p1 || peer_id == p2) { collected_publish += 1; } @@ -5014,7 +4963,7 @@ fn test_do_not_use_floodsub_in_fanout() { .flood_publish(false) .build() .unwrap(); - let (mut gs, _, mut receivers, _) = inject_nodes1() + let (mut gs, _, mut queues, _) = inject_nodes1() .peer_no(config.mesh_n_low() - 1) .topics(Vec::new()) .to_subscribe(false) @@ -5025,7 +4974,7 @@ fn test_do_not_use_floodsub_in_fanout() { let topics = vec![topic.hash()]; // add two floodsub peer, one explicit, one implicit - let (p1, receiver1) = add_peer_with_addr_and_kind( + let (p1, queue1) = add_peer_with_addr_and_kind( &mut gs, &topics, false, @@ -5034,23 +4983,22 @@ fn test_do_not_use_floodsub_in_fanout() { Some(PeerKind::Floodsub), ); - receivers.insert(p1, receiver1); - let (p2, receiver2) = + queues.insert(p1, queue1); + let (p2, queue2) = add_peer_with_addr_and_kind(&mut gs, &topics, false, false, Multiaddr::empty(), None); - receivers.insert(p2, receiver2); + queues.insert(p2, queue2); // publish a message let publish_data = vec![0; 42]; gs.publish(Topic::new("test"), publish_data).unwrap(); // Collect publish messages to floodsub peers - let publishes = receivers + let publishes = queues .into_iter() - .fold(0, |mut collected_publish, (peer_id, c)| { - let priority = c.priority.get_ref(); - while !priority.is_empty() { - if matches!(priority.try_recv(), - Ok(RpcOut::Publish{..}) if peer_id == p1 || peer_id == p2) + .fold(0, |mut collected_publish, (peer_id, mut queue)| { + while !queue.is_empty() { + if matches!(queue.try_pop(), + Some(RpcOut::Publish{..}) if peer_id == p1 || peer_id == p2) { collected_publish += 1; } @@ -5101,14 +5049,14 @@ fn test_dont_add_floodsub_peers_to_mesh_on_join() { #[test] fn test_dont_send_px_to_old_gossipsub_peers() { - let (mut gs, _, receivers, topics) = inject_nodes1() + let (mut gs, _, queues, topics) = inject_nodes1() .peer_no(0) .topics(vec!["test".into()]) .to_subscribe(false) .create_network(); // add an old gossipsub peer - let (p1, _receiver1) = add_peer_with_addr_and_kind( + let (p1, _queue1) = add_peer_with_addr_and_kind( &mut gs, &topics, false, @@ -5125,7 +5073,7 @@ fn test_dont_send_px_to_old_gossipsub_peers() { ); // check that prune does not contain px - let (control_msgs, _) = count_control_msgs(receivers, |_, m| match m { + let (control_msgs, _) = count_control_msgs(queues, |_, m| match m { RpcOut::Prune(Prune { peers: px, .. }) => !px.is_empty(), _ => false, }); @@ -5135,7 +5083,7 @@ fn test_dont_send_px_to_old_gossipsub_peers() { #[test] fn test_dont_send_floodsub_peers_in_px() { // build mesh with one peer - let (mut gs, peers, receivers, topics) = inject_nodes1() + let (mut gs, peers, queues, topics) = inject_nodes1() .peer_no(1) .topics(vec!["test".into()]) .to_subscribe(true) @@ -5160,7 +5108,7 @@ fn test_dont_send_floodsub_peers_in_px() { ); // check that px in prune message is empty - let (control_msgs, _) = count_control_msgs(receivers, |_, m| match m { + let (control_msgs, _) = count_control_msgs(queues, |_, m| match m { RpcOut::Prune(Prune { peers: px, .. }) => !px.is_empty(), _ => false, }); @@ -5251,14 +5199,14 @@ fn test_subscribe_and_graft_with_negative_score() { ))) .create_network(); - let (mut gs2, _, receivers, _) = inject_nodes1().create_network(); + let (mut gs2, _, queues, _) = inject_nodes1().create_network(); let connection_id = ConnectionId::new_unchecked(0); let topic = Topic::new("test"); - let (p2, _receiver1) = add_peer(&mut gs1, &Vec::new(), true, false); - let (p1, _receiver2) = add_peer(&mut gs2, &topic_hashes, false, false); + let (p2, _queue1) = add_peer(&mut gs1, &Vec::new(), true, false); + let (p1, _queue2) = add_peer(&mut gs2, &topic_hashes, false, false); // add penalty to peer p2 gs1.as_peer_score_mut().add_penalty(&p2, 1); @@ -5272,13 +5220,12 @@ fn test_subscribe_and_graft_with_negative_score() { p1: PeerId, p2: PeerId, connection_id: ConnectionId, - receivers: HashMap| - -> HashMap { - let new_receivers = HashMap::new(); - for (peer_id, receiver) in receivers.into_iter() { - let non_priority = receiver.non_priority.get_ref(); - match non_priority.try_recv() { - Ok(rpc) if peer_id == p1 => { + queues: HashMap| + -> HashMap { + let new_queues = HashMap::new(); + for (peer_id, mut receiver_queue) in queues.into_iter() { + match receiver_queue.try_pop() { + Some(rpc) if peer_id == p1 => { gs1.on_connection_handler_event( p2, connection_id, @@ -5291,18 +5238,18 @@ fn test_subscribe_and_graft_with_negative_score() { _ => {} } } - new_receivers + new_queues }; // forward the subscribe message - let receivers = forward_messages_to_p1(&mut gs1, p1, p2, connection_id, receivers); + let queues = forward_messages_to_p1(&mut gs1, p1, p2, connection_id, queues); // heartbeats on both gs1.heartbeat(); gs2.heartbeat(); // forward messages again - forward_messages_to_p1(&mut gs1, p1, p2, connection_id, receivers); + forward_messages_to_p1(&mut gs1, p1, p2, connection_id, queues); // nobody got penalized assert!(gs1.as_peer_score_mut().score_report(&p2).score >= original_score); @@ -5344,7 +5291,7 @@ fn test_graft_without_subscribe() { /// that run Gossipsub v1.2. #[test] fn sends_idontwant() { - let (mut gs, peers, receivers, topic_hashes) = inject_nodes1() + let (mut gs, peers, queues, topic_hashes) = inject_nodes1() .peer_no(5) .topics(vec![String::from("topic1")]) .to_subscribe(true) @@ -5366,12 +5313,11 @@ fn sends_idontwant() { }; gs.handle_received_message(message.clone(), &local_id); assert_eq!( - receivers + queues .into_iter() - .fold(0, |mut idontwants, (peer_id, c)| { - let non_priority = c.non_priority.get_ref(); - while !non_priority.is_empty() { - if let Ok(RpcOut::IDontWant(_)) = non_priority.try_recv() { + .fold(0, |mut idontwants, (peer_id, mut queue)| { + while !queue.is_empty() { + if let Some(RpcOut::IDontWant(_)) = queue.try_pop() { assert_ne!(peer_id, peers[1]); idontwants += 1; } @@ -5385,7 +5331,7 @@ fn sends_idontwant() { #[test] fn doesnt_sends_idontwant_for_lower_message_size() { - let (mut gs, peers, receivers, topic_hashes) = inject_nodes1() + let (mut gs, peers, queues, topic_hashes) = inject_nodes1() .peer_no(5) .topics(vec![String::from("topic1")]) .to_subscribe(true) @@ -5408,12 +5354,11 @@ fn doesnt_sends_idontwant_for_lower_message_size() { gs.handle_received_message(message.clone(), &local_id); assert_eq!( - receivers + queues .into_iter() - .fold(0, |mut idontwants, (peer_id, c)| { - let non_priority = c.non_priority.get_ref(); - while !non_priority.is_empty() { - if let Ok(RpcOut::IDontWant(_)) = non_priority.try_recv() { + .fold(0, |mut idontwants, (peer_id, mut queue)| { + while !queue.is_empty() { + if let Some(RpcOut::IDontWant(_)) = queue.try_pop() { assert_ne!(peer_id, peers[1]); idontwants += 1; } @@ -5429,7 +5374,7 @@ fn doesnt_sends_idontwant_for_lower_message_size() { /// that don't run Gossipsub v1.2. #[test] fn doesnt_send_idontwant() { - let (mut gs, peers, receivers, topic_hashes) = inject_nodes1() + let (mut gs, peers, queues, topic_hashes) = inject_nodes1() .peer_no(5) .topics(vec![String::from("topic1")]) .to_subscribe(true) @@ -5451,12 +5396,12 @@ fn doesnt_send_idontwant() { }; gs.handle_received_message(message.clone(), &local_id); assert_eq!( - receivers + queues .into_iter() - .fold(0, |mut idontwants, (peer_id, c)| { - let non_priority = c.non_priority.get_ref(); - while !non_priority.is_empty() { - if matches!(non_priority.try_recv(), Ok(RpcOut::IDontWant(_)) if peer_id != peers[1]) { + .fold(0, |mut idontwants, (peer_id, mut queue)| { + while !queue.is_empty() { + if matches!(queue.try_pop(), Some(RpcOut::IDontWant(_)) if peer_id != peers[1]) + { idontwants += 1; } } @@ -5471,7 +5416,7 @@ fn doesnt_send_idontwant() { /// that sent IDONTWANT. #[test] fn doesnt_forward_idontwant() { - let (mut gs, peers, receivers, topic_hashes) = inject_nodes1() + let (mut gs, peers, queues, topic_hashes) = inject_nodes1() .peer_no(4) .topics(vec![String::from("topic1")]) .to_subscribe(true) @@ -5501,16 +5446,17 @@ fn doesnt_forward_idontwant() { gs.handle_received_message(raw_message.clone(), &local_id); assert_eq!( - receivers.into_iter().fold(0, |mut fwds, (peer_id, c)| { - let non_priority = c.non_priority.get_ref(); - while !non_priority.is_empty() { - if let Ok(RpcOut::Forward { .. }) = non_priority.try_recv() { - assert_ne!(peer_id, peers[2]); - fwds += 1; + queues + .into_iter() + .fold(0, |mut fwds, (peer_id, mut queue)| { + while !queue.is_empty() { + if let Some(RpcOut::Forward { .. }) = queue.try_pop() { + assert_ne!(peer_id, peers[2]); + fwds += 1; + } } - } - fwds - }), + fwds + }), 2, "IDONTWANT was not sent" ); @@ -5520,7 +5466,7 @@ fn doesnt_forward_idontwant() { /// IDONTWANT message to the respective peer. #[test] fn parses_idontwant() { - let (mut gs, peers, _receivers, _topic_hashes) = inject_nodes1() + let (mut gs, peers, _queues, _topic_hashes) = inject_nodes1() .peer_no(2) .topics(vec![String::from("topic1")]) .to_subscribe(true) @@ -5552,7 +5498,7 @@ fn parses_idontwant() { /// Test that a node clears stale IDONTWANT messages. #[test] fn clear_stale_idontwant() { - let (mut gs, peers, _receivers, _topic_hashes) = inject_nodes1() + let (mut gs, peers, _queues, _topic_hashes) = inject_nodes1() .peer_no(4) .topics(vec![String::from("topic1")]) .to_subscribe(true) @@ -5593,15 +5539,14 @@ fn test_all_queues_full() { connections: vec![ConnectionId::new_unchecked(0)], outbound: false, topics: topics.clone(), - sender: Sender::new(2), + messages: Queue::new(1), dont_send: LinkedHashMap::new(), }, ); - let publish_data = vec![0; 42]; - gs.publish(topic_hash.clone(), publish_data.clone()) - .unwrap(); let publish_data = vec![2; 59]; + let result = gs.publish(topic_hash.clone(), publish_data.clone()); + assert!(result.is_ok()); let err = gs.publish(topic_hash, publish_data).unwrap_err(); assert!(matches!(err, PublishError::AllQueuesFull(f) if f == 1)); } @@ -5622,6 +5567,8 @@ fn test_slow_peer_returns_failed_publish() { let slow_peer_id = PeerId::random(); peers.push(slow_peer_id); + let mesh = gs.mesh.entry(topic_hash.clone()).or_default(); + mesh.insert(slow_peer_id); gs.connected_peers.insert( slow_peer_id, PeerDetails { @@ -5629,7 +5576,7 @@ fn test_slow_peer_returns_failed_publish() { connections: vec![ConnectionId::new_unchecked(0)], outbound: false, topics: topics.clone(), - sender: Sender::new(2), + messages: Queue::new(1), dont_send: LinkedHashMap::new(), }, ); @@ -5642,43 +5589,34 @@ fn test_slow_peer_returns_failed_publish() { connections: vec![ConnectionId::new_unchecked(0)], outbound: false, topics: topics.clone(), - sender: Sender::new(gs.config.connection_handler_queue_len()), + messages: Queue::new(gs.config.connection_handler_queue_len()), dont_send: LinkedHashMap::new(), }, ); let publish_data = vec![0; 42]; - gs.publish(topic_hash.clone(), publish_data.clone()) - .unwrap(); - let publish_data = vec![2; 59]; - gs.publish(topic_hash.clone(), publish_data).unwrap(); + let _failed_publish = gs.publish(topic_hash.clone(), publish_data.clone()); + let _failed_publish = gs.publish(topic_hash.clone(), publish_data.clone()); gs.heartbeat(); - gs.heartbeat(); - - let slow_peer_failed_messages = match gs.events.pop_front().unwrap() { - ToSwarm::GenerateEvent(Event::SlowPeer { - peer_id, - failed_messages, - }) if peer_id == slow_peer_id => failed_messages, - _ => panic!("invalid event"), - }; + let slow_peer_failed_messages = gs + .events + .into_iter() + .find_map(|e| match e { + ToSwarm::GenerateEvent(Event::SlowPeer { + peer_id, + failed_messages, + }) if peer_id == slow_peer_id => Some(failed_messages), + _ => None, + }) + .expect("No SlowPeer event found"); let failed_messages = FailedMessages { - publish: 1, - forward: 0, - priority: 1, - non_priority: 0, - timeout: 0, + priority: 0, + non_priority: 1, }; - assert_eq!(slow_peer_failed_messages.priority, failed_messages.priority); - assert_eq!( - slow_peer_failed_messages.non_priority, - failed_messages.non_priority - ); - assert_eq!(slow_peer_failed_messages.publish, failed_messages.publish); - assert_eq!(slow_peer_failed_messages.forward, failed_messages.forward); + assert_eq!(slow_peer_failed_messages, failed_messages); } #[test] @@ -5703,7 +5641,7 @@ fn test_slow_peer_returns_failed_ihave_handling() { connections: vec![ConnectionId::new_unchecked(0)], outbound: false, topics: topics.clone(), - sender: Sender::new(2), + messages: Queue::new(1), dont_send: LinkedHashMap::new(), }, ); @@ -5720,7 +5658,7 @@ fn test_slow_peer_returns_failed_ihave_handling() { connections: vec![ConnectionId::new_unchecked(0)], outbound: false, topics: topics.clone(), - sender: Sender::new(gs.config.connection_handler_queue_len()), + messages: Queue::new(gs.config.connection_handler_queue_len()), dont_send: LinkedHashMap::new(), }, ); @@ -5778,20 +5716,11 @@ fn test_slow_peer_returns_failed_ihave_handling() { .unwrap(); let failed_messages = FailedMessages { - publish: 0, - forward: 0, priority: 0, non_priority: 1, - timeout: 0, }; - assert_eq!(slow_peer_failed_messages.priority, failed_messages.priority); - assert_eq!( - slow_peer_failed_messages.non_priority, - failed_messages.non_priority - ); - assert_eq!(slow_peer_failed_messages.publish, failed_messages.publish); - assert_eq!(slow_peer_failed_messages.forward, failed_messages.forward); + assert_eq!(slow_peer_failed_messages, failed_messages); } #[test] @@ -5817,7 +5746,7 @@ fn test_slow_peer_returns_failed_iwant_handling() { connections: vec![ConnectionId::new_unchecked(0)], outbound: false, topics: topics.clone(), - sender: Sender::new(2), + messages: Queue::new(1), dont_send: LinkedHashMap::new(), }, ); @@ -5834,7 +5763,7 @@ fn test_slow_peer_returns_failed_iwant_handling() { connections: vec![ConnectionId::new_unchecked(0)], outbound: false, topics: topics.clone(), - sender: Sender::new(gs.config.connection_handler_queue_len()), + messages: Queue::new(gs.config.connection_handler_queue_len()), dont_send: LinkedHashMap::new(), }, ); @@ -5872,20 +5801,11 @@ fn test_slow_peer_returns_failed_iwant_handling() { .unwrap(); let failed_messages = FailedMessages { - publish: 0, - forward: 1, priority: 0, non_priority: 1, - timeout: 0, }; - assert_eq!(slow_peer_failed_messages.priority, failed_messages.priority); - assert_eq!( - slow_peer_failed_messages.non_priority, - failed_messages.non_priority - ); - assert_eq!(slow_peer_failed_messages.publish, failed_messages.publish); - assert_eq!(slow_peer_failed_messages.forward, failed_messages.forward); + assert_eq!(slow_peer_failed_messages, failed_messages); } #[test] @@ -5911,7 +5831,7 @@ fn test_slow_peer_returns_failed_forward() { connections: vec![ConnectionId::new_unchecked(0)], outbound: false, topics: topics.clone(), - sender: Sender::new(2), + messages: Queue::new(1), dont_send: LinkedHashMap::new(), }, ); @@ -5928,7 +5848,7 @@ fn test_slow_peer_returns_failed_forward() { connections: vec![ConnectionId::new_unchecked(0)], outbound: false, topics: topics.clone(), - sender: Sender::new(gs.config.connection_handler_queue_len()), + messages: Queue::new(gs.config.connection_handler_queue_len()), dont_send: LinkedHashMap::new(), }, ); @@ -5966,20 +5886,11 @@ fn test_slow_peer_returns_failed_forward() { .unwrap(); let failed_messages = FailedMessages { - publish: 0, - forward: 1, - priority: 0, non_priority: 1, - timeout: 0, + priority: 0, }; - assert_eq!(slow_peer_failed_messages.priority, failed_messages.priority); - assert_eq!( - slow_peer_failed_messages.non_priority, - failed_messages.non_priority - ); - assert_eq!(slow_peer_failed_messages.publish, failed_messages.publish); - assert_eq!(slow_peer_failed_messages.forward, failed_messages.forward); + assert_eq!(slow_peer_failed_messages, failed_messages); } #[test] @@ -6010,7 +5921,7 @@ fn test_slow_peer_is_downscored_on_publish() { connections: vec![ConnectionId::new_unchecked(0)], outbound: false, topics: topics.clone(), - sender: Sender::new(2), + messages: Queue::new(1), dont_send: LinkedHashMap::new(), }, ); @@ -6024,7 +5935,7 @@ fn test_slow_peer_is_downscored_on_publish() { connections: vec![ConnectionId::new_unchecked(0)], outbound: false, topics: topics.clone(), - sender: Sender::new(gs.config.connection_handler_queue_len()), + messages: Queue::new(gs.config.connection_handler_queue_len()), dont_send: LinkedHashMap::new(), }, ); @@ -6035,47 +5946,9 @@ fn test_slow_peer_is_downscored_on_publish() { let publish_data = vec![2; 59]; gs.publish(topic_hash.clone(), publish_data).unwrap(); gs.heartbeat(); - let slow_peer_score = gs.as_peer_score_mut().score_report(&slow_peer_id).score; - assert_eq!(slow_peer_score, slow_peer_params.slow_peer_weight); -} - -#[tokio::test] -async fn test_timedout_messages_are_reported() { - let gs_config = ConfigBuilder::default() - .validation_mode(ValidationMode::Permissive) - .build() - .unwrap(); - - let mut gs: Behaviour = Behaviour::new(MessageAuthenticity::RandomAuthor, gs_config).unwrap(); - - let sender = Sender::new(2); - let topic_hash = Topic::new("Test").hash(); - let publish_data = vec![2; 59]; - let raw_message = gs.build_raw_message(topic_hash, publish_data).unwrap(); - - sender - .send_message(RpcOut::Publish { - message: raw_message, - timeout: Delay::new(Duration::from_nanos(1)), - }) - .unwrap(); - let mut receiver = sender.new_receiver(); - let stale = future::poll_fn(|cx| receiver.poll_stale(cx)).await.unwrap(); - assert!(matches!(stale, RpcOut::Publish { .. })); -} - -#[test] -fn test_priority_messages_are_always_sent() { - let sender = Sender::new(2); - let topic_hash = Topic::new("Test").hash(); - // Fill the buffer with the first message. - assert!(sender - .send_message(RpcOut::Subscribe(topic_hash.clone())) - .is_ok()); - assert!(sender - .send_message(RpcOut::Subscribe(topic_hash.clone())) - .is_ok()); - assert!(sender.send_message(RpcOut::Unsubscribe(topic_hash)).is_ok()); + let slow_peer_score = gs.peer_score(&slow_peer_id).unwrap(); + // There should be two penalties for the two failed messages. + assert_eq!(slow_peer_score, slow_peer_params.slow_peer_weight * 2.0); } /// Test that specific topic configurations are correctly applied @@ -6422,7 +6295,7 @@ fn test_fanout_with_topic_config() { .build() .unwrap(); - let (mut gs, _, receivers, topic_hashes) = inject_nodes1() + let (mut gs, _, queues, topic_hashes) = inject_nodes1() .peer_no(10) // More than mesh_n .topics(vec![topic.clone()]) .to_subscribe(true) @@ -6445,12 +6318,11 @@ fn test_fanout_with_topic_config() { ); // Collect publish messages - let publishes = receivers + let publishes = queues .into_values() - .fold(vec![], |mut collected_publish, c| { - let priority = c.priority.get_ref(); - while !priority.is_empty() { - if let Ok(RpcOut::Publish { message, .. }) = priority.try_recv() { + .fold(vec![], |mut collected_publish, mut queue| { + while !queue.is_empty() { + if let Some(RpcOut::Publish { message, .. }) = queue.try_pop() { collected_publish.push(message); } } diff --git a/protocols/gossipsub/src/handler.rs b/protocols/gossipsub/src/handler.rs index a2d05d8a3ff..95c1def59cd 100644 --- a/protocols/gossipsub/src/handler.rs +++ b/protocols/gossipsub/src/handler.rs @@ -37,7 +37,7 @@ use web_time::Instant; use crate::{ protocol::{GossipsubCodec, ProtocolConfig}, - rpc::Receiver, + queue::Queue, rpc_proto::proto, types::{PeerKind, RawMessage, RpcIn, RpcOut}, ValidationError, @@ -98,8 +98,8 @@ pub struct EnabledHandler { /// The single long-lived inbound substream. inbound_substream: Option, - /// Queue of values that we want to send to the remote - send_queue: Receiver, + /// Queue of dispatched Rpc messages to send. + message_queue: Queue, /// Flag indicating that an outbound substream is being established to prevent duplicate /// requests. @@ -162,7 +162,7 @@ enum OutboundSubstreamState { impl Handler { /// Builds a new [`Handler`]. - pub fn new(protocol_config: ProtocolConfig, message_queue: Receiver) -> Self { + pub(crate) fn new(protocol_config: ProtocolConfig, message_queue: Queue) -> Self { Handler::Enabled(EnabledHandler { listen_protocol: protocol_config, inbound_substream: None, @@ -170,7 +170,7 @@ impl Handler { outbound_substream_establishing: false, outbound_substream_attempts: 0, inbound_substream_attempts: 0, - send_queue: message_queue, + message_queue, peer_kind: None, peer_kind_sent: false, last_io_activity: Instant::now(), @@ -234,7 +234,7 @@ impl EnabledHandler { } // determine if we need to create the outbound stream - if !self.send_queue.poll_is_empty(cx) + if !self.message_queue.is_empty() && self.outbound_substream.is_none() && !self.outbound_substream_establishing { @@ -252,15 +252,18 @@ impl EnabledHandler { { // outbound idle state Some(OutboundSubstreamState::WaitingOutput(substream)) => { - if let Poll::Ready(Some(mut message)) = self.send_queue.poll_next_unpin(cx) { + if let Poll::Ready(mut message) = Pin::new(&mut self.message_queue).poll_pop(cx) + { match message { RpcOut::Publish { message: _, ref mut timeout, + .. } | RpcOut::Forward { message: _, ref mut timeout, + .. } => { if Pin::new(timeout).poll(cx).is_ready() { // Inform the behaviour and end the poll. @@ -407,13 +410,6 @@ impl EnabledHandler { } } - // Drop the next message in queue if it's stale. - if let Poll::Ready(Some(rpc)) = self.send_queue.poll_stale(cx) { - return Poll::Ready(ConnectionHandlerEvent::NotifyBehaviour( - HandlerEvent::MessageDropped(rpc), - )); - } - Poll::Pending } } diff --git a/protocols/gossipsub/src/lib.rs b/protocols/gossipsub/src/lib.rs index a116900be0e..f1d42d6cddb 100644 --- a/protocols/gossipsub/src/lib.rs +++ b/protocols/gossipsub/src/lib.rs @@ -105,7 +105,7 @@ mod mcache; mod metrics; mod peer_score; mod protocol; -mod rpc; +mod queue; mod rpc_proto; mod subscription_filter; mod time_cache; diff --git a/protocols/gossipsub/src/metrics.rs b/protocols/gossipsub/src/metrics.rs index 37fe5481689..1394d9a92a7 100644 --- a/protocols/gossipsub/src/metrics.rs +++ b/protocols/gossipsub/src/metrics.rs @@ -133,12 +133,6 @@ pub(crate) struct Metrics { ignored_messages: Family, /// The number of messages rejected by the application (validation result). rejected_messages: Family, - /// The number of publish messages dropped by the sender. - publish_messages_dropped: Family, - /// The number of forward messages dropped by the sender. - forward_messages_dropped: Family, - /// The number of messages that timed out and could not be sent. - timedout_messages_dropped: Family, // Metrics regarding mesh state /// Number of peers in our mesh. This metric should be updated with the count of peers for a @@ -193,10 +187,15 @@ pub(crate) struct Metrics { /// The number of msg_id's we have received in every IDONTWANT control message. idontwant_msgs_ids: Counter, - /// The size of the priority queue. - priority_queue_size: Histogram, - /// The size of the non-priority queue. - non_priority_queue_size: Histogram, + /// The size of the queue by priority. + queue_size: Family, + + /// Failed messages by message type. + failed_messages: Family, + + /// The number of messages we have removed from a queue that we would otherwise send. A rough + /// guide to measure of bandwidth saved. + removed_queued_messages: Counter, } impl Metrics { @@ -245,21 +244,6 @@ impl Metrics { "Number of rejected messages received for each topic" ); - let publish_messages_dropped = register_family!( - "publish_messages_dropped_per_topic", - "Number of publish messages dropped per topic" - ); - - let forward_messages_dropped = register_family!( - "forward_messages_dropped_per_topic", - "Number of forward messages dropped per topic" - ); - - let timedout_messages_dropped = register_family!( - "timedout_messages_dropped_per_topic", - "Number of timedout messages dropped per topic" - ); - let mesh_peer_counts = register_family!( "mesh_peer_counts", "Number of peers in each topic in our mesh" @@ -361,20 +345,36 @@ impl Metrics { metric }; - let priority_queue_size = Histogram::new(linear_buckets(0.0, 25.0, 100)); + let queue_size = Family::::new_with_constructor(|| { + Histogram::new(linear_buckets(0.0, 50.0, 100)) + }); registry.register( - "priority_queue_size", - "Histogram of observed priority queue sizes", - priority_queue_size.clone(), + "queue_size", + "Histogram of observed queue sizes", + queue_size.clone(), ); - let non_priority_queue_size = Histogram::new(linear_buckets(0.0, 25.0, 100)); + let failed_messages = Family::::new_with_constructor(|| { + Histogram::new([ + 0.0, 1.0, 5.0, 10.0, 25.0, 50.0, 75.0, 100.0, 250.0, 500.0, 1000.0, 2000.0, + ]) + }); registry.register( - "non_priority_queue_size", - "Histogram of observed non-priority queue sizes", - non_priority_queue_size.clone(), + "failed_messages", + "Histogram of observed failed messages by type", + failed_messages.clone(), ); + let removed_queued_messages = { + let metric = Counter::default(); + registry.register( + "removed_queued_messages", + "Number of messages we have removed from all our queues due to IDONTWANTs", + metric.clone(), + ); + metric + }; + Self { max_topics, max_never_subscribed_topics, @@ -385,9 +385,6 @@ impl Metrics { accepted_messages, ignored_messages, rejected_messages, - publish_messages_dropped, - forward_messages_dropped, - timedout_messages_dropped, mesh_peer_counts, mesh_peer_inclusion_events, mesh_peer_churn_events, @@ -405,8 +402,9 @@ impl Metrics { topic_iwant_msgs, idontwant_msgs, idontwant_msgs_ids, - priority_queue_size, - non_priority_queue_size, + queue_size, + failed_messages, + removed_queued_messages, } } @@ -537,27 +535,6 @@ impl Metrics { } } - /// Register dropping a Publish message over a topic. - pub(crate) fn publish_msg_dropped(&mut self, topic: &TopicHash) { - if self.register_topic(topic).is_ok() { - self.publish_messages_dropped.get_or_create(topic).inc(); - } - } - - /// Register dropping a Forward message over a topic. - pub(crate) fn forward_msg_dropped(&mut self, topic: &TopicHash) { - if self.register_topic(topic).is_ok() { - self.forward_messages_dropped.get_or_create(topic).inc(); - } - } - - /// Register dropping a message that timedout over a topic. - pub(crate) fn timeout_msg_dropped(&mut self, topic: &TopicHash) { - if self.register_topic(topic).is_ok() { - self.timedout_messages_dropped.get_or_create(topic).inc(); - } - } - /// Register that a message was received (and was not a duplicate). pub(crate) fn msg_recvd(&mut self, topic: &TopicHash) { if self.register_topic(topic).is_ok() { @@ -616,12 +593,20 @@ impl Metrics { /// Observes a priority queue size. pub(crate) fn observe_priority_queue_size(&mut self, len: usize) { - self.priority_queue_size.observe(len as f64); + self.queue_size + .get_or_create(&MessageTypeLabel { + message_type: MessageType::Priority, + }) + .observe(len as f64); } /// Observes a non-priority queue size. pub(crate) fn observe_non_priority_queue_size(&mut self, len: usize) { - self.non_priority_queue_size.observe(len as f64); + self.queue_size + .get_or_create(&MessageTypeLabel { + message_type: MessageType::NonPriority, + }) + .observe(len as f64); } /// Observe a score of a mesh peer. @@ -655,6 +640,30 @@ impl Metrics { self.topic_info.insert(topic_hash, true); } } + + /// Observe the failed priority messages. + pub(crate) fn observe_failed_priority_messages(&mut self, messages: usize) { + self.failed_messages + .get_or_create(&MessageTypeLabel { + message_type: MessageType::Priority, + }) + .observe(messages as f64); + } + + /// Observe the failed non priority messages. + pub(crate) fn observe_failed_non_priority_messages(&mut self, messages: usize) { + self.failed_messages + .get_or_create(&MessageTypeLabel { + message_type: MessageType::NonPriority, + }) + .observe(messages as f64); + } + + /// Register the number of removed messages from the `Handler` queue + /// When receiving IDONTWANT messages + pub(crate) fn register_removed_messages(&mut self, removed_messages: usize) { + self.removed_queued_messages.inc_by(removed_messages as u64); + } } /// Reasons why a peer was included in the mesh. @@ -698,6 +707,15 @@ pub(crate) enum Penalty { IPColocation, } +/// Kinds of messages in the send queue. +#[derive(PartialEq, Eq, Hash, Clone, Copy, Debug, EncodeLabelValue)] +pub(crate) enum MessageType { + /// A priority message. + Priority, + /// Non Priority Message. + NonPriority, +} + /// Label for the mesh inclusion event metrics. #[derive(PartialEq, Eq, Hash, EncodeLabelSet, Clone, Debug)] struct InclusionLabel { @@ -724,6 +742,12 @@ struct PenaltyLabel { penalty: Penalty, } +/// Label for the queue message priority kind. +#[derive(PartialEq, Eq, Hash, EncodeLabelSet, Clone, Debug)] +struct MessageTypeLabel { + message_type: MessageType, +} + #[derive(Clone)] struct HistBuilder { buckets: Vec, diff --git a/protocols/gossipsub/src/protocol.rs b/protocols/gossipsub/src/protocol.rs index 821c11d2132..74dcc669f55 100644 --- a/protocols/gossipsub/src/protocol.rs +++ b/protocols/gossipsub/src/protocol.rs @@ -659,6 +659,7 @@ mod tests { let rpc = RpcOut::Publish { message: message.clone(), timeout: Delay::new(Duration::from_secs(1)), + message_id: MessageId(vec![0, 0]), }; let mut codec = diff --git a/protocols/gossipsub/src/queue.rs b/protocols/gossipsub/src/queue.rs new file mode 100644 index 00000000000..ff04392e618 --- /dev/null +++ b/protocols/gossipsub/src/queue.rs @@ -0,0 +1,294 @@ +// Copyright 2020 Sigma Prime Pty Ltd. +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the "Software"), +// to deal in the Software without restriction, including without limitation +// the rights to use, copy, modify, merge, publish, distribute, sublicense, +// and/or sell copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +// DEALINGS IN THE SOFTWARE. + +use std::{ + collections::{HashMap, VecDeque}, + pin::Pin, + sync::{atomic::AtomicUsize, Arc, Mutex}, + task::{Context, Poll, Waker}, +}; + +use crate::{types::RpcOut, MessageId}; + +const CONTROL_MSGS_LIMIT: usize = 20_000; + +/// An async priority queue used to dispatch messages from the `NetworkBehaviour` +/// Provides a clean abstraction over high-priority (unbounded), control (bounded), +/// and non priority (bounded) message queues. +#[derive(Debug)] +pub(crate) struct Queue { + /// High-priority unbounded queue (Subscribe, Unsubscribe) + pub(crate) priority: Shared, + /// Control messages bounded queue (Graft, Prune, IDontWant) + pub(crate) control: Shared, + /// Low-priority bounded queue (Publish, Forward, IHave, IWant) + pub(crate) non_priority: Shared, + /// The id of the current reference of the counter. + pub(crate) id: usize, + /// The total number of references for the queue. + pub(crate) count: Arc, +} + +impl Queue { + /// Create a new `Queue` with `capacity`. + pub(crate) fn new(capacity: usize) -> Self { + Self { + priority: Shared::new(), + control: Shared::with_capacity(CONTROL_MSGS_LIMIT), + non_priority: Shared::with_capacity(capacity), + id: 1, + count: Arc::new(AtomicUsize::new(1)), + } + } + + /// Try to push a message to the Queue, return Err if the queue is full, + /// which will only happen for control and non priority messages. + pub(crate) fn try_push(&mut self, message: RpcOut) -> Result<(), Box> { + match message { + RpcOut::Subscribe(_) | RpcOut::Unsubscribe(_) => { + self.priority + .try_push(message) + .expect("Shared is unbounded"); + Ok(()) + } + RpcOut::Graft(_) | RpcOut::Prune(_) | RpcOut::IDontWant(_) => { + self.control.try_push(message) + } + RpcOut::Publish { .. } + | RpcOut::Forward { .. } + | RpcOut::IHave(_) + | RpcOut::IWant(_) => self.non_priority.try_push(message), + } + } + + /// Remove pending low priority Publish and Forward messages. + /// Returns the number of messages removed. + pub(crate) fn remove_data_messages(&mut self, message_ids: &[MessageId]) -> usize { + let mut count = 0; + self.non_priority.retain(|message| match message { + RpcOut::Publish { message_id, .. } | RpcOut::Forward { message_id, .. } => { + if message_ids.contains(message_id) { + count += 1; + false + } else { + true + } + } + _ => true, + }); + count + } + + /// Pop an element from the queue. + pub(crate) fn poll_pop(&mut self, cx: &mut Context) -> Poll { + // First we try the priority messages. + if let Poll::Ready(rpc) = Pin::new(&mut self.priority).poll_pop(cx) { + return Poll::Ready(rpc); + } + + // Then we try the control messages. + if let Poll::Ready(rpc) = Pin::new(&mut self.control).poll_pop(cx) { + return Poll::Ready(rpc); + } + + // Finally we try the non priority messages + if let Poll::Ready(rpc) = Pin::new(&mut self.non_priority).poll_pop(cx) { + return Poll::Ready(rpc); + } + + Poll::Pending + } + + /// Check if the queue is empty. + pub(crate) fn is_empty(&self) -> bool { + if !self.priority.is_empty() { + return false; + } + + if !self.control.is_empty() { + return false; + } + + if !self.non_priority.is_empty() { + return false; + } + + true + } + + /// Returns the length of the priority queue. + #[cfg(feature = "metrics")] + pub(crate) fn priority_len(&self) -> usize { + self.priority.len() + self.control.len() + } + + /// Returns the length of the non priority queue. + #[cfg(feature = "metrics")] + pub(crate) fn non_priority_len(&self) -> usize { + self.non_priority.len() + } + + /// Attempts to pop a message from the queue. + /// returns None if the queue is empty. + #[cfg(test)] + pub(crate) fn try_pop(&mut self) -> Option { + // Try priority first + self.priority + .try_pop() + // Then control messages + .or_else(|| self.control.try_pop()) + // Finally non priority + .or_else(|| self.non_priority.try_pop()) + } +} + +impl Clone for Queue { + fn clone(&self) -> Self { + let new_id = self.count.fetch_add(1, std::sync::atomic::Ordering::SeqCst); + Self { + priority: Shared { + inner: self.priority.inner.clone(), + capacity: self.priority.capacity, + id: new_id, + }, + control: Shared { + inner: self.control.inner.clone(), + capacity: self.control.capacity, + id: new_id, + }, + non_priority: Shared { + inner: self.non_priority.inner.clone(), + capacity: self.non_priority.capacity, + id: new_id, + }, + id: self.id, + count: self.count.clone(), + } + } +} + +/// The internal shared part of the queue, +/// that allows for shallow copies of the queue among each connection of the remote. +#[derive(Debug)] +pub(crate) struct Shared { + inner: Arc>, + capacity: Option, + id: usize, +} + +impl Shared { + pub(crate) fn with_capacity(capacity: usize) -> Self { + Self { + inner: Arc::new(Mutex::new(SharedInner { + queue: VecDeque::new(), + pending_pops: Default::default(), + })), + capacity: Some(capacity), + id: 1, + } + } + + pub(crate) fn new() -> Self { + Self { + inner: Arc::new(Mutex::new(SharedInner { + queue: VecDeque::new(), + pending_pops: Default::default(), + })), + capacity: None, + id: 1, + } + } + + /// Pop an element from the queue. + pub(crate) fn poll_pop(self: std::pin::Pin<&mut Self>, cx: &mut Context) -> Poll { + let mut guard = self.inner.lock().expect("lock to not be poisoned"); + match guard.queue.pop_front() { + Some(t) => Poll::Ready(t), + None => { + guard + .pending_pops + .entry(self.id) + .or_insert(cx.waker().clone()); + Poll::Pending + } + } + } + + pub(crate) fn try_push(&mut self, message: RpcOut) -> Result<(), Box> { + let mut guard = self.inner.lock().expect("lock to not be poisoned"); + if self + .capacity + .is_some_and(|capacity| guard.queue.len() >= capacity) + { + return Err(Box::new(message)); + } + + guard.queue.push_back(message); + // Wake pending registered pops. + for (_, s) in guard.pending_pops.drain() { + s.wake(); + } + + Ok(()) + } + + /// Retain only the elements specified by the predicate. + /// In other words, remove all elements e for which f(&e) returns false. The elements are + /// visited in unsorted (and unspecified) order. Returns the cleared messages. + pub(crate) fn retain bool>(&mut self, f: F) { + let mut shared = self.inner.lock().expect("lock to not be poisoned"); + shared.queue.retain(f); + } + + /// Check if the queue is empty. + pub(crate) fn is_empty(&self) -> bool { + let guard = self.inner.lock().expect("lock to not be poisoned"); + guard.queue.len() == 0 + } + + /// Returns the length of the queue. + #[cfg(feature = "metrics")] + pub(crate) fn len(&self) -> usize { + let guard = self.inner.lock().expect("lock to not be poisoned"); + guard.queue.len() + } + + /// Attempts to pop an message from the queue. + /// returns None if the queue is empty. + #[cfg(test)] + pub(crate) fn try_pop(&mut self) -> Option { + let mut guard = self.inner.lock().expect("lock to not be poisoned"); + guard.queue.pop_front() + } +} + +impl Drop for Shared { + fn drop(&mut self) { + let mut guard = self.inner.lock().expect("lock to not be poisoned"); + guard.pending_pops.remove(&self.id); + } +} + +/// The shared stated by the `NetworkBehaviour`s and the `ConnectionHandler`s. +#[derive(Debug)] +struct SharedInner { + queue: VecDeque, + pending_pops: HashMap, +} diff --git a/protocols/gossipsub/src/rpc.rs b/protocols/gossipsub/src/rpc.rs deleted file mode 100644 index 943df31f599..00000000000 --- a/protocols/gossipsub/src/rpc.rs +++ /dev/null @@ -1,195 +0,0 @@ -// Copyright 2020 Sigma Prime Pty Ltd. -// -// Permission is hereby granted, free of charge, to any person obtaining a -// copy of this software and associated documentation files (the "Software"), -// to deal in the Software without restriction, including without limitation -// the rights to use, copy, modify, merge, publish, distribute, sublicense, -// and/or sell copies of the Software, and to permit persons to whom the -// Software is furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -// DEALINGS IN THE SOFTWARE. - -use std::{ - future::Future, - pin::Pin, - sync::{ - atomic::{AtomicUsize, Ordering}, - Arc, - }, - task::{Context, Poll}, -}; - -use futures::{stream::Peekable, Stream, StreamExt}; - -use crate::types::RpcOut; - -/// `RpcOut` sender that is priority aware. -#[derive(Debug)] -pub(crate) struct Sender { - /// Capacity of the priority channel for `Publish` messages. - priority_cap: usize, - len: Arc, - pub(crate) priority_sender: async_channel::Sender, - pub(crate) non_priority_sender: async_channel::Sender, - priority_receiver: async_channel::Receiver, - non_priority_receiver: async_channel::Receiver, -} - -impl Sender { - /// Create a RpcSender. - pub(crate) fn new(cap: usize) -> Sender { - // We intentionally do not bound the channel, as we still need to send control messages - // such as `GRAFT`, `PRUNE`, `SUBSCRIBE`, and `UNSUBSCRIBE`. - // That's also why we define `cap` and divide it by two, - // to ensure there is capacity for both priority and non_priority messages. - let (priority_sender, priority_receiver) = async_channel::unbounded(); - let (non_priority_sender, non_priority_receiver) = async_channel::bounded(cap / 2); - let len = Arc::new(AtomicUsize::new(0)); - Sender { - priority_cap: cap / 2, - len, - priority_sender, - non_priority_sender, - priority_receiver, - non_priority_receiver, - } - } - - /// Create a new Receiver to the sender. - pub(crate) fn new_receiver(&self) -> Receiver { - Receiver { - priority_queue_len: self.len.clone(), - priority: Box::pin(self.priority_receiver.clone().peekable()), - non_priority: Box::pin(self.non_priority_receiver.clone().peekable()), - } - } - - #[allow(clippy::result_large_err)] - pub(crate) fn send_message(&self, rpc: RpcOut) -> Result<(), RpcOut> { - if let RpcOut::Publish { .. } = rpc { - // Update number of publish message in queue. - let len = self.len.load(Ordering::Relaxed); - if len >= self.priority_cap { - return Err(rpc); - } - self.len.store(len + 1, Ordering::Relaxed); - } - let sender = match rpc { - RpcOut::Publish { .. } - | RpcOut::Graft(_) - | RpcOut::Prune(_) - | RpcOut::Subscribe(_) - | RpcOut::Unsubscribe(_) => &self.priority_sender, - RpcOut::Forward { .. } | RpcOut::IHave(_) | RpcOut::IWant(_) | RpcOut::IDontWant(_) => { - &self.non_priority_sender - } - }; - sender.try_send(rpc).map_err(|err| err.into_inner()) - } - - /// Returns the current size of the priority queue. - #[cfg(feature = "metrics")] - pub(crate) fn priority_queue_len(&self) -> usize { - self.len.load(Ordering::Relaxed) - } - - /// Returns the current size of the non-priority queue. - #[cfg(feature = "metrics")] - pub(crate) fn non_priority_queue_len(&self) -> usize { - self.non_priority_sender.len() - } -} - -/// `RpcOut` sender that is priority aware. -#[derive(Debug)] -pub struct Receiver { - /// The maximum length of the priority queue. - pub(crate) priority_queue_len: Arc, - /// The priority queue receiver. - pub(crate) priority: Pin>>>, - /// The non priority queue receiver. - pub(crate) non_priority: Pin>>>, -} - -impl Receiver { - // Peek the next message in the queues and return it if its timeout has elapsed. - // Returns `None` if there aren't any more messages on the stream or none is stale. - pub(crate) fn poll_stale(&mut self, cx: &mut Context<'_>) -> Poll> { - // Peek priority queue. - let priority = match self.priority.as_mut().poll_peek_mut(cx) { - Poll::Ready(Some(RpcOut::Publish { - message: _, - ref mut timeout, - })) => { - if Pin::new(timeout).poll(cx).is_ready() { - // Return the message. - let dropped = futures::ready!(self.priority.poll_next_unpin(cx)) - .expect("There should be a message"); - return Poll::Ready(Some(dropped)); - } - Poll::Ready(None) - } - poll => poll, - }; - - let non_priority = match self.non_priority.as_mut().poll_peek_mut(cx) { - Poll::Ready(Some(RpcOut::Forward { - message: _, - ref mut timeout, - })) => { - if Pin::new(timeout).poll(cx).is_ready() { - // Return the message. - let dropped = futures::ready!(self.non_priority.poll_next_unpin(cx)) - .expect("There should be a message"); - return Poll::Ready(Some(dropped)); - } - Poll::Ready(None) - } - poll => poll, - }; - - match (priority, non_priority) { - (Poll::Ready(None), Poll::Ready(None)) => Poll::Ready(None), - _ => Poll::Pending, - } - } - - /// Poll queues and return true if both are empty. - pub(crate) fn poll_is_empty(&mut self, cx: &mut Context<'_>) -> bool { - matches!( - ( - self.priority.as_mut().poll_peek(cx), - self.non_priority.as_mut().poll_peek(cx), - ), - (Poll::Ready(None), Poll::Ready(None)) - ) - } -} - -impl Stream for Receiver { - type Item = RpcOut; - - fn poll_next( - mut self: std::pin::Pin<&mut Self>, - cx: &mut std::task::Context<'_>, - ) -> std::task::Poll> { - // The priority queue is first polled. - if let Poll::Ready(rpc) = Pin::new(&mut self.priority).poll_next(cx) { - if let Some(RpcOut::Publish { .. }) = rpc { - self.priority_queue_len.fetch_sub(1, Ordering::Relaxed); - } - return Poll::Ready(rpc); - } - // Then we poll the non priority. - Pin::new(&mut self.non_priority).poll_next(cx) - } -} diff --git a/protocols/gossipsub/src/types.rs b/protocols/gossipsub/src/types.rs index 8f8a4f38a88..bea0786e060 100644 --- a/protocols/gossipsub/src/types.rs +++ b/protocols/gossipsub/src/types.rs @@ -19,7 +19,10 @@ // DEALINGS IN THE SOFTWARE. //! A collection of types using the Gossipsub system. -use std::{collections::BTreeSet, fmt, fmt::Debug}; +use std::{ + collections::BTreeSet, + fmt::{self, Debug}, +}; use futures_timer::Delay; use hashlink::LinkedHashMap; @@ -30,34 +33,17 @@ use quick_protobuf::MessageWrite; use serde::{Deserialize, Serialize}; use web_time::Instant; -use crate::{rpc::Sender, rpc_proto::proto, TopicHash}; +use crate::{queue::Queue, rpc_proto::proto, TopicHash}; /// Messages that have expired while attempting to be sent to a peer. -#[derive(Clone, Debug, Default)] +#[derive(Clone, Debug, Default, PartialEq, Eq)] pub struct FailedMessages { - /// The number of publish messages that failed to be published in a heartbeat. - pub publish: usize, - /// The number of forward messages that failed to be published in a heartbeat. - pub forward: usize, - /// The number of messages that were failed to be sent to the priority queue as it was full. + /// The number of messages that were failed to be sent to the priority queue as it was + /// full. pub priority: usize, - /// The number of messages that were failed to be sent to the non-priority queue as it was + /// The number of messages that were failed to be sent to the non priority queue as it was /// full. pub non_priority: usize, - /// The number of messages that timed out and could not be sent. - pub timeout: usize, -} - -impl FailedMessages { - /// The total number of messages that failed due to the queue being full. - pub fn total_queue_full(&self) -> usize { - self.priority + self.non_priority - } - - /// The total failed messages in a heartbeat. - pub fn total(&self) -> usize { - self.priority + self.non_priority - } } #[derive(Debug)] @@ -111,10 +97,10 @@ pub(crate) struct PeerDetails { pub(crate) connections: Vec, /// Subscribed topics. pub(crate) topics: BTreeSet, - /// The rpc sender to the connection handler(s). - pub(crate) sender: Sender, /// Don't send messages. pub(crate) dont_send: LinkedHashMap, + /// Message queue consumed by the connection handler. + pub(crate) messages: Queue, } /// Describes the types of peers that can exist in the gossipsub context. @@ -319,10 +305,18 @@ pub struct IDontWant { pub enum RpcOut { /// Publish a Gossipsub message on network.`timeout` limits the duration the message /// can wait to be sent before it is abandoned. - Publish { message: RawMessage, timeout: Delay }, + Publish { + message_id: MessageId, + message: RawMessage, + timeout: Delay, + }, /// Forward a Gossipsub message on network. `timeout` limits the duration the message /// can wait to be sent before it is abandoned. - Forward { message: RawMessage, timeout: Delay }, + Forward { + message_id: MessageId, + message: RawMessage, + timeout: Delay, + }, /// Subscribe a topic. Subscribe(TopicHash), /// Unsubscribe a topic. @@ -346,24 +340,30 @@ impl RpcOut { pub fn into_protobuf(self) -> proto::RPC { self.into() } + + /// Returns true if the `RpcOut` is priority. + pub(crate) fn priority(&self) -> bool { + matches!( + self, + RpcOut::Subscribe(_) + | RpcOut::Unsubscribe(_) + | RpcOut::Graft(_) + | RpcOut::Prune(_) + | RpcOut::IDontWant(_) + ) + } } impl From for proto::RPC { /// Converts the RPC into protobuf format. fn from(rpc: RpcOut) -> Self { match rpc { - RpcOut::Publish { - message, - timeout: _, - } => proto::RPC { + RpcOut::Publish { message, .. } => proto::RPC { subscriptions: Vec::new(), publish: vec![message.into()], control: None, }, - RpcOut::Forward { - message, - timeout: _, - } => proto::RPC { + RpcOut::Forward { message, .. } => proto::RPC { publish: vec![message.into()], subscriptions: Vec::new(), control: None,