diff --git a/Cargo.lock b/Cargo.lock
index 504308f5628..570d0b0aa55 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -406,9 +406,9 @@ dependencies = [
[[package]]
name = "async-std"
-version = "1.13.0"
+version = "1.13.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c634475f29802fde2b8f0b505b1bd00dfe4df7d4a000f0b36f7671197d5c3615"
+checksum = "730294c1c08c2e0f85759590518f6333f0d5a0a766a27d519c1b244c3dfd8a24"
dependencies = [
"async-attributes",
"async-channel 1.9.0",
@@ -477,9 +477,9 @@ checksum = "8b75356056920673b02621b35afd0f7dda9306d03c79a30f5c56c44cf256e3de"
[[package]]
name = "async-trait"
-version = "0.1.87"
+version = "0.1.88"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d556ec1359574147ec0c4fc5eb525f3f23263a592b1a9c07e0a75b427de55c97"
+checksum = "e539d3fca749fcee5236ab05e93a52867dd549cc157c8cb7f99595f3cedffdb5"
dependencies = [
"proc-macro2",
"quote",
@@ -559,7 +559,7 @@ dependencies = [
"axum-core",
"bytes",
"futures-util",
- "http 1.2.0",
+ "http 1.3.1",
"http-body",
"http-body-util",
"hyper",
@@ -592,7 +592,7 @@ dependencies = [
"async-trait",
"bytes",
"futures-util",
- "http 1.2.0",
+ "http 1.3.1",
"http-body",
"http-body-util",
"mime",
@@ -631,12 +631,6 @@ version = "0.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4c7f02d4ea65f2c1853089ffd8d2787bdbc63de2f0d29dedbcf8ccdfa0ccd4cf"
-[[package]]
-name = "base64"
-version = "0.13.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8"
-
[[package]]
name = "base64"
version = "0.21.7"
@@ -651,9 +645,9 @@ checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6"
[[package]]
name = "base64ct"
-version = "1.6.0"
+version = "1.7.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b"
+checksum = "89e25b6adfb930f02d1981565a6e5d9c547ac15a96606256d3b59040e5cd4ca3"
[[package]]
name = "bimap"
@@ -823,9 +817,9 @@ dependencies = [
[[package]]
name = "cc"
-version = "1.2.16"
+version = "1.2.17"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "be714c154be609ec7f5dad223a33bf1482fff90472de28f7362806e6d4832b8c"
+checksum = "1fcb57c740ae1daf453ae85f16e37396f672b039e00d9d866e07ddb24e328e3a"
dependencies = [
"shlex",
]
@@ -928,9 +922,9 @@ dependencies = [
[[package]]
name = "clap"
-version = "4.5.31"
+version = "4.5.32"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "027bb0d98429ae334a8698531da7077bdf906419543a35a55c2cb1b66437d767"
+checksum = "6088f3ae8c3608d19260cd7445411865a485688711b78b5be70d78cd96136f83"
dependencies = [
"clap_builder",
"clap_derive",
@@ -938,9 +932,9 @@ dependencies = [
[[package]]
name = "clap_builder"
-version = "4.5.31"
+version = "4.5.32"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5589e0cba072e0f3d23791efac0fd8627b49c829c196a492e88168e6a669d863"
+checksum = "22a7ef7f676155edfb82daa97f99441f3ebf4a58d5e32f295a56259f1b6facc8"
dependencies = [
"anstream",
"anstyle",
@@ -950,9 +944,9 @@ dependencies = [
[[package]]
name = "clap_derive"
-version = "4.5.28"
+version = "4.5.32"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bf4ced95c6f4a675af3da73304b9ac4ed991640c36374e4b46795c49e17cf1ed"
+checksum = "09176aae279615badda0765c0c0b3f6ed53f4709118af73cf4655d85d1530cd7"
dependencies = [
"heck",
"proc-macro2",
@@ -1298,9 +1292,9 @@ dependencies = [
[[package]]
name = "deranged"
-version = "0.3.11"
+version = "0.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4"
+checksum = "9c9e6a11ca8224451684bc0d7d5a7adbf8f2fd6887261a1cfc3c0432f9d4068e"
dependencies = [
"powerfmt",
]
@@ -1483,14 +1477,14 @@ dependencies = [
[[package]]
name = "env_logger"
-version = "0.11.6"
+version = "0.11.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dcaee3d8e3cfc3fd92428d477bc97fc29ec8716d180c0d74c643bb26166660e0"
+checksum = "c3716d7a920fb4fac5d84e9d4bce8ceb321e9414b4409da61b07b75c1e3d0697"
dependencies = [
"anstream",
"anstyle",
"env_filter",
- "humantime",
+ "jiff",
"log",
]
@@ -1579,9 +1573,9 @@ checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1"
[[package]]
name = "foldhash"
-version = "0.1.4"
+version = "0.1.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a0d2fde1f7b3d48b8395d5f2de76c18a528bd6a9cdde438df747bfcba3e05d6f"
+checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2"
[[package]]
name = "foreign-types"
@@ -1697,7 +1691,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a8f2f12607f92c69b12ed746fabf9ca4f5c482cba46679c1a75b874ed7c26adb"
dependencies = [
"futures-io",
- "rustls 0.23.23",
+ "rustls 0.23.25",
"rustls-pki-types",
]
@@ -1803,14 +1797,16 @@ dependencies = [
[[package]]
name = "getrandom"
-version = "0.3.1"
+version = "0.3.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "43a49c392881ce6d5c3b8cb70f98717b7c07aabbdff06687b9030dbfbe2725f8"
+checksum = "73fea8450eea4bac3940448fb7ae50d91f034f941199fcd9d909a5a07aa455f0"
dependencies = [
"cfg-if",
+ "js-sys",
"libc",
- "wasi 0.13.3+wasi-0.2.2",
- "windows-targets 0.52.6",
+ "r-efi",
+ "wasi 0.14.2+wasi-0.2.4",
+ "wasm-bindgen",
]
[[package]]
@@ -1894,8 +1890,8 @@ dependencies = [
"fnv",
"futures-core",
"futures-sink",
- "http 1.2.0",
- "indexmap 2.7.1",
+ "http 1.3.1",
+ "indexmap 2.8.0",
"slab",
"tokio",
"tokio-util",
@@ -1904,9 +1900,9 @@ dependencies = [
[[package]]
name = "half"
-version = "2.4.1"
+version = "2.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6dd08c532ae367adf81c312a4580bc67f1d0fe8bc9c460520283f4c0ff277888"
+checksum = "7db2ff139bba50379da6aa0766b52fdcb62cb5b263009b09ed58ba604e14bbd1"
dependencies = [
"cfg-if",
"crunchy",
@@ -2081,7 +2077,7 @@ version = "0.1.0"
dependencies = [
"anyhow",
"either",
- "env_logger 0.11.6",
+ "env_logger 0.11.7",
"futures",
"libp2p",
"redis",
@@ -2093,13 +2089,13 @@ dependencies = [
[[package]]
name = "hostname"
-version = "0.3.1"
+version = "0.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3c731c3e10504cc8ed35cfe2f1db4c9274c3d35fa486e3b31df46f068ef3e867"
+checksum = "f9c7c7c8ac16c798734b8a24560c1362120597c40d5e1459f09498f8f6c8f2ba"
dependencies = [
+ "cfg-if",
"libc",
- "match_cfg",
- "winapi",
+ "windows 0.52.0",
]
[[package]]
@@ -2115,9 +2111,9 @@ dependencies = [
[[package]]
name = "http"
-version = "1.2.0"
+version = "1.3.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f16ca2af56261c99fba8bac40a10251ce8188205a4c448fbb745a2e4daa76fea"
+checksum = "f4a85d31aea989eead29a3aaf9e1115a180df8282431156e533de47660892565"
dependencies = [
"bytes",
"fnv",
@@ -2131,18 +2127,18 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184"
dependencies = [
"bytes",
- "http 1.2.0",
+ "http 1.3.1",
]
[[package]]
name = "http-body-util"
-version = "0.1.2"
+version = "0.1.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "793429d76616a256bcb62c2a2ec2bed781c8307e797e2598c50010f2bee2544f"
+checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a"
dependencies = [
"bytes",
- "futures-util",
- "http 1.2.0",
+ "futures-core",
+ "http 1.3.1",
"http-body",
"pin-project-lite",
]
@@ -2165,12 +2161,6 @@ version = "1.0.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9"
-[[package]]
-name = "humantime"
-version = "2.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4"
-
[[package]]
name = "hyper"
version = "1.6.0"
@@ -2181,7 +2171,7 @@ dependencies = [
"futures-channel",
"futures-util",
"h2",
- "http 1.2.0",
+ "http 1.3.1",
"http-body",
"httparse",
"httpdate",
@@ -2199,10 +2189,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2d191583f3da1305256f22463b9bb0471acad48a4e534a5218b9963e9c1f59b2"
dependencies = [
"futures-util",
- "http 1.2.0",
+ "http 1.3.1",
"hyper",
"hyper-util",
- "rustls 0.23.23",
+ "rustls 0.23.25",
"rustls-pki-types",
"tokio",
"tokio-rustls",
@@ -2248,7 +2238,7 @@ dependencies = [
"bytes",
"futures-channel",
"futures-util",
- "http 1.2.0",
+ "http 1.3.1",
"http-body",
"hyper",
"pin-project-lite",
@@ -2451,7 +2441,7 @@ dependencies = [
"attohttpc",
"bytes",
"futures",
- "http 1.2.0",
+ "http 1.3.1",
"http-body-util",
"hyper",
"hyper-util",
@@ -2474,9 +2464,9 @@ dependencies = [
[[package]]
name = "indexmap"
-version = "2.7.1"
+version = "2.8.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8c9c992b02b5b4c94ea26e32fe5bccb7aa7d9f390ab5c1221ff895bc7ea8b652"
+checksum = "3954d50fe15b02142bf25d3b8bdadb634ec3948f103d04ffe3031bc8fe9d7058"
dependencies = [
"equivalent",
"hashbrown 0.15.2",
@@ -2632,6 +2622,30 @@ version = "1.0.15"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c"
+[[package]]
+name = "jiff"
+version = "0.2.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d699bc6dfc879fb1bf9bdff0d4c56f0884fc6f0d0eb0fba397a6d00cd9a6b85e"
+dependencies = [
+ "jiff-static",
+ "log",
+ "portable-atomic",
+ "portable-atomic-util",
+ "serde",
+]
+
+[[package]]
+name = "jiff-static"
+version = "0.2.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8d16e75759ee0aa64c57a56acbf43916987b20c77373cb7e808979e02b93c9f9"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.100",
+]
+
[[package]]
name = "js-sys"
version = "0.3.77"
@@ -2680,9 +2694,9 @@ checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe"
[[package]]
name = "libc"
-version = "0.2.170"
+version = "0.2.171"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "875b3680cb2f8f71bdcf9a30f38d48282f5d3c95cbf9b3fa57269bb5d5c06828"
+checksum = "c19937216e9d3aa9956d9bb8dfc0b0c8beb6058fc4f7a4dc4d850edf86a237d6"
[[package]]
name = "libp2p"
@@ -2697,7 +2711,7 @@ dependencies = [
"libp2p-allow-block-list",
"libp2p-autonat",
"libp2p-connection-limits",
- "libp2p-core",
+ "libp2p-core 0.43.1",
"libp2p-dcutr",
"libp2p-dns",
"libp2p-floodsub",
@@ -2712,14 +2726,14 @@ dependencies = [
"libp2p-noise",
"libp2p-peer-store",
"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.43.0",
"libp2p-tls",
"libp2p-uds",
"libp2p-upnp",
@@ -2727,10 +2741,10 @@ dependencies = [
"libp2p-websocket",
"libp2p-websocket-websys",
"libp2p-webtransport-websys",
- "libp2p-yamux",
+ "libp2p-yamux 0.47.0",
"multiaddr",
"pin-project",
- "rw-stream-sink",
+ "rw-stream-sink 0.4.0",
"thiserror 2.0.12",
"tokio",
"tracing-subscriber",
@@ -2740,11 +2754,11 @@ dependencies = [
name = "libp2p-allow-block-list"
version = "0.5.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.5.0",
"tokio",
]
@@ -2758,14 +2772,14 @@ 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.5.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",
@@ -2779,18 +2793,44 @@ dependencies = [
name = "libp2p-connection-limits"
version = "0.5.1"
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.5.0",
"quickcheck-ext",
"rand 0.8.5",
"tokio",
]
+[[package]]
+name = "libp2p-core"
+version = "0.43.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "193c75710ba43f7504ad8f58a62ca0615b1d7e572cb0f1780bc607252c39e9ef"
+dependencies = [
+ "either",
+ "fnv",
+ "futures",
+ "futures-timer",
+ "libp2p-identity",
+ "multiaddr",
+ "multihash",
+ "multistream-select 0.13.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "once_cell",
+ "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.12",
+ "tracing",
+ "unsigned-varint 0.8.0",
+ "web-time 1.1.0",
+]
+
[[package]]
name = "libp2p-core"
version = "0.43.1"
@@ -2804,16 +2844,16 @@ 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",
+ "rw-stream-sink 0.4.0",
"thiserror 2.0.12",
"tokio",
"tracing",
- "unsigned-varint",
+ "unsigned-varint 0.8.0",
"web-time 1.1.0",
]
@@ -2826,18 +2866,18 @@ dependencies = [
"futures",
"futures-bounded",
"futures-timer",
- "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.5.0",
+ "libp2p-tcp 0.43.0",
+ "libp2p-yamux 0.47.0",
"lru",
"quick-protobuf",
- "quick-protobuf-codec",
+ "quick-protobuf-codec 0.3.1",
"thiserror 2.0.12",
"tokio",
"tracing",
@@ -2854,7 +2894,7 @@ dependencies = [
"async-trait",
"futures",
"hickory-resolver",
- "libp2p-core",
+ "libp2p-core 0.43.1",
"libp2p-identity",
"parking_lot",
"smallvec",
@@ -2872,11 +2912,11 @@ 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",
@@ -2899,13 +2939,13 @@ dependencies = [
"getrandom 0.2.15",
"hashlink",
"hex_fmt",
- "libp2p-core",
+ "libp2p-core 0.43.0",
"libp2p-identity",
- "libp2p-swarm",
- "libp2p-swarm-test",
+ "libp2p-swarm 0.46.0",
+ "libp2p-swarm-test 0.5.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",
@@ -2926,12 +2966,12 @@ 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.5.0",
"quick-protobuf",
- "quick-protobuf-codec",
+ "quick-protobuf-codec 0.3.1",
"smallvec",
"thiserror 2.0.12",
"tokio",
@@ -2955,7 +2995,7 @@ dependencies = [
"quick-protobuf",
"quickcheck-ext",
"rand 0.8.5",
- "ring 0.17.13",
+ "ring 0.17.14",
"rmp-serde",
"sec1",
"serde",
@@ -2977,15 +3017,15 @@ 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.5.0",
+ "libp2p-yamux 0.47.0",
"quick-protobuf",
- "quick-protobuf-codec",
+ "quick-protobuf-codec 0.3.1",
"quickcheck-ext",
"rand 0.8.5",
"serde",
@@ -3008,10 +3048,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.5.0",
"rand 0.8.5",
"smallvec",
"socket2",
@@ -3024,12 +3064,12 @@ dependencies = [
name = "libp2p-memory-connection-limits"
version = "0.4.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.5.0",
"memory-stats",
"sysinfo",
"tracing",
@@ -3040,7 +3080,7 @@ name = "libp2p-metrics"
version = "0.16.1"
dependencies = [
"futures",
- "libp2p-core",
+ "libp2p-core 0.43.1",
"libp2p-dcutr",
"libp2p-gossipsub",
"libp2p-identify",
@@ -3048,7 +3088,7 @@ dependencies = [
"libp2p-kad",
"libp2p-ping",
"libp2p-relay",
- "libp2p-swarm",
+ "libp2p-swarm 0.47.0",
"pin-project",
"prometheus-client",
"web-time 1.1.0",
@@ -3063,11 +3103,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.43.0",
"nohash-hasher",
"parking_lot",
"quickcheck-ext",
@@ -3075,7 +3115,7 @@ dependencies = [
"smallvec",
"tracing",
"tracing-subscriber",
- "unsigned-varint",
+ "unsigned-varint 0.8.0",
]
[[package]]
@@ -3085,7 +3125,7 @@ dependencies = [
"futures",
"futures-timer",
"futures_ringbuf",
- "libp2p-core",
+ "libp2p-core 0.43.1",
"tracing",
]
@@ -3097,7 +3137,7 @@ dependencies = [
"bytes",
"futures",
"futures_ringbuf",
- "libp2p-core",
+ "libp2p-core 0.43.1",
"libp2p-identity",
"multiaddr",
"multihash",
@@ -3118,10 +3158,10 @@ name = "libp2p-peer-store"
version = "0.1.0"
dependencies = [
"libp2p",
- "libp2p-core",
+ "libp2p-core 0.43.1",
"libp2p-identity",
- "libp2p-swarm",
- "libp2p-swarm-test",
+ "libp2p-swarm 0.47.0",
+ "libp2p-swarm-test 0.5.0",
"lru",
"serde_json",
"tokio",
@@ -3137,13 +3177,13 @@ 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.5.0",
+ "libp2p-tcp 0.43.0",
"libp2p-tls",
- "libp2p-yamux",
+ "libp2p-yamux 0.47.0",
"serde",
"serde_json",
"thiserror 2.0.12",
@@ -3159,10 +3199,10 @@ version = "0.46.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.5.0",
"quickcheck-ext",
"rand 0.8.5",
"tokio",
@@ -3178,27 +3218,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.0",
+ "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.43.0",
"libp2p-websocket",
- "libp2p-yamux",
+ "libp2p-yamux 0.47.0",
"pin-project",
"quickcheck-ext",
"rand 0.8.5",
@@ -3216,18 +3272,18 @@ 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.43.0",
"libp2p-tls",
- "libp2p-yamux",
+ "libp2p-yamux 0.47.0",
"quickcheck",
"quinn",
"rand 0.8.5",
- "ring 0.17.13",
- "rustls 0.23.23",
+ "ring 0.17.14",
+ "rustls 0.23.25",
"socket2",
"thiserror 2.0.12",
"tokio",
@@ -3245,15 +3301,15 @@ 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.5.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",
@@ -3272,13 +3328,13 @@ 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.5.0",
"quick-protobuf",
- "quick-protobuf-codec",
+ "quick-protobuf-codec 0.3.1",
"rand 0.8.5",
"thiserror 2.0.12",
"tokio",
@@ -3298,10 +3354,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.5.0",
"rand 0.8.5",
"serde",
"serde_json",
@@ -3333,16 +3389,38 @@ name = "libp2p-stream"
version = "0.3.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.5.0",
"rand 0.8.5",
"tokio",
"tracing",
"tracing-subscriber",
]
+[[package]]
+name = "libp2p-swarm"
+version = "0.46.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "803399b4b6f68adb85e63ab573ac568154b193e9a640f03e0f2890eabbcb37f8"
+dependencies = [
+ "async-std",
+ "either",
+ "fnv",
+ "futures",
+ "futures-timer",
+ "libp2p-core 0.43.0",
+ "libp2p-identity",
+ "lru",
+ "multistream-select 0.13.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "once_cell",
+ "rand 0.8.5",
+ "smallvec",
+ "tracing",
+ "web-time 1.1.0",
+]
+
[[package]]
name = "libp2p-swarm"
version = "0.47.0"
@@ -3354,17 +3432,17 @@ dependencies = [
"futures",
"futures-timer",
"getrandom 0.2.15",
- "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",
+ "libp2p-swarm-test 0.5.0",
+ "libp2p-yamux 0.47.0",
"lru",
- "multistream-select",
+ "multistream-select 0.13.0",
"quickcheck-ext",
"rand 0.8.5",
"smallvec",
@@ -3392,12 +3470,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.43.0",
+ "libp2p-yamux 0.47.0",
+ "tracing",
+]
+
+[[package]]
+name = "libp2p-swarm-test"
+version = "0.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2bb6354e3a50496d750805f6cf33679bd698850d535602f42c61e465e0734d0b"
+dependencies = [
+ "async-trait",
+ "futures",
+ "futures-timer",
+ "libp2p-core 0.43.0",
"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.46.0",
+ "libp2p-tcp 0.43.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",
]
@@ -3411,13 +3507,29 @@ dependencies = [
"futures-timer",
"if-watch",
"libc",
- "libp2p-core",
+ "libp2p-core 0.43.1",
"socket2",
"tokio",
"tracing",
"tracing-subscriber",
]
+[[package]]
+name = "libp2p-tcp"
+version = "0.43.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "65346fb4d36035b23fec4e7be4c320436ba53537ce9b6be1d1db1f70c905cad0"
+dependencies = [
+ "async-io",
+ "futures",
+ "futures-timer",
+ "if-watch",
+ "libc",
+ "libp2p-core 0.43.0",
+ "socket2",
+ "tracing",
+]
+
[[package]]
name = "libp2p-tls"
version = "0.6.1"
@@ -3425,13 +3537,13 @@ 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 0.13.2",
- "ring 0.17.13",
- "rustls 0.23.23",
+ "ring 0.17.14",
+ "rustls 0.23.25",
"rustls-webpki 0.101.7",
"thiserror 2.0.12",
"tokio",
@@ -3445,7 +3557,7 @@ version = "0.42.0"
dependencies = [
"async-std",
"futures",
- "libp2p-core",
+ "libp2p-core 0.43.1",
"tempfile",
"tokio",
"tracing",
@@ -3458,8 +3570,8 @@ dependencies = [
"futures",
"futures-timer",
"igd-next",
- "libp2p-core",
- "libp2p-swarm",
+ "libp2p-core 0.43.1",
+ "libp2p-swarm 0.47.0",
"tokio",
"tracing",
]
@@ -3473,7 +3585,7 @@ dependencies = [
"futures-timer",
"hex",
"if-watch",
- "libp2p-core",
+ "libp2p-core 0.43.1",
"libp2p-identity",
"libp2p-noise",
"libp2p-webrtc-utils",
@@ -3500,11 +3612,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 0.10.8",
@@ -3521,7 +3633,7 @@ dependencies = [
"getrandom 0.2.15",
"hex",
"js-sys",
- "libp2p-core",
+ "libp2p-core 0.43.1",
"libp2p-identity",
"libp2p-webrtc-utils",
"send_wrapper 0.6.0",
@@ -3540,14 +3652,14 @@ dependencies = [
"either",
"futures",
"futures-rustls",
- "libp2p-core",
+ "libp2p-core 0.43.1",
"libp2p-dns",
"libp2p-identity",
- "libp2p-tcp",
+ "libp2p-tcp 0.43.0",
"parking_lot",
"pin-project-lite",
"rcgen 0.13.2",
- "rw-stream-sink",
+ "rw-stream-sink 0.4.0",
"soketto",
"thiserror 2.0.12",
"tracing",
@@ -3562,10 +3674,10 @@ 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",
"tracing",
@@ -3579,7 +3691,7 @@ version = "0.5.1"
dependencies = [
"futures",
"js-sys",
- "libp2p-core",
+ "libp2p-core 0.43.1",
"libp2p-identity",
"libp2p-noise",
"multiaddr",
@@ -3599,7 +3711,7 @@ version = "0.47.0"
dependencies = [
"either",
"futures",
- "libp2p-core",
+ "libp2p-core 0.43.1",
"libp2p-muxer-test-harness",
"thiserror 2.0.12",
"tokio",
@@ -3608,6 +3720,21 @@ dependencies = [
"yamux 0.13.4",
]
+[[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.0",
+ "thiserror 2.0.12",
+ "tracing",
+ "yamux 0.12.1",
+ "yamux 0.13.4",
+]
+
[[package]]
name = "libredox"
version = "0.1.3"
@@ -3620,12 +3747,12 @@ dependencies = [
[[package]]
name = "libsecp256k1"
-version = "0.7.1"
+version = "0.7.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "95b09eff1b35ed3b33b877ced3a691fc7a481919c7e29c53c906226fcf55e2a1"
+checksum = "e79019718125edc905a079a70cfa5f3820bc76139fc91d6f9abc27ea2a887139"
dependencies = [
"arrayref",
- "base64 0.13.1",
+ "base64 0.22.1",
"digest 0.9.0",
"hmac-drbg",
"libsecp256k1-core",
@@ -3674,9 +3801,9 @@ checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab"
[[package]]
name = "linux-raw-sys"
-version = "0.9.2"
+version = "0.9.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6db9c683daf087dc577b7506e9695b3d556a9f3849903fa28186283afd6809e9"
+checksum = "fe7db12097d22ec582439daf8618b8fdd1a7bef6270e9af3b1ebcd30893cf413"
[[package]]
name = "litemap"
@@ -3725,12 +3852,6 @@ dependencies = [
"hashbrown 0.15.2",
]
-[[package]]
-name = "match_cfg"
-version = "0.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ffbee8634e0d45d258acb448e7eaab3fce7a0a467395d4d9f228e3c1f01fb2e4"
-
[[package]]
name = "matchers"
version = "0.1.0"
@@ -3884,7 +4005,7 @@ dependencies = [
"percent-encoding",
"serde",
"static_assertions",
- "unsigned-varint",
+ "unsigned-varint 0.8.0",
"url",
]
@@ -3910,7 +4031,7 @@ dependencies = [
"quickcheck",
"rand 0.8.5",
"serde",
- "unsigned-varint",
+ "unsigned-varint 0.8.0",
]
[[package]]
@@ -3923,11 +4044,25 @@ dependencies = [
"futures_ringbuf",
"pin-project",
"quickcheck-ext",
- "rw-stream-sink",
+ "rw-stream-sink 0.4.0",
"smallvec",
"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]]
@@ -4133,9 +4268,9 @@ dependencies = [
[[package]]
name = "once_cell"
-version = "1.20.3"
+version = "1.21.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "945462a4b81e43c4e3ba96bd7b49d834c6f61198356aa858733bc4acf3cbe62e"
+checksum = "d75b0bedcc4fe52caa0e03d9f1151a323e4aa5e2d78ba3580400cd3c9e2bc4bc"
[[package]]
name = "oorandom"
@@ -4201,7 +4336,7 @@ checksum = "1e32339a5dc40459130b3bd269e9892439f55b33e772d2a9d402a789baaf4e8a"
dependencies = [
"futures-core",
"futures-sink",
- "indexmap 2.7.1",
+ "indexmap 2.8.0",
"js-sys",
"once_cell",
"pin-project-lite",
@@ -4247,7 +4382,7 @@ checksum = "91cf61a1868dacc576bf2b2a1c3e9ab150af7272909e80085c3173384fe11f76"
dependencies = [
"async-trait",
"futures-core",
- "http 1.2.0",
+ "http 1.3.1",
"opentelemetry 0.27.1",
"opentelemetry-proto",
"opentelemetry_sdk 0.27.1",
@@ -4577,6 +4712,15 @@ version = "1.11.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "350e9b48cbc6b0e028b0473b114454c6316e57336ee184ceab6e53f72c178b3e"
+[[package]]
+name = "portable-atomic-util"
+version = "0.2.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d8a2f0d8d040d7848a709caf78912debcc3f33ee4b3cac47d73d1e1069e83507"
+dependencies = [
+ "portable-atomic",
+]
+
[[package]]
name = "powerfmt"
version = "0.2.0"
@@ -4656,12 +4800,6 @@ dependencies = [
"syn 2.0.100",
]
-[[package]]
-name = "quick-error"
-version = "1.2.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0"
-
[[package]]
name = "quick-protobuf"
version = "0.8.1"
@@ -4682,7 +4820,20 @@ dependencies = [
"quick-protobuf",
"quickcheck-ext",
"thiserror 2.0.12",
- "unsigned-varint",
+ "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]]
@@ -4706,37 +4857,39 @@ dependencies = [
[[package]]
name = "quinn"
-version = "0.11.6"
+version = "0.11.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "62e96808277ec6f97351a2380e6c25114bc9e67037775464979f3037c92d05ef"
+checksum = "c3bd15a6f2967aef83887dcb9fec0014580467e33720d073560cf015a5683012"
dependencies = [
"async-io",
"async-std",
"bytes",
+ "cfg_aliases",
"futures-io",
"pin-project-lite",
"quinn-proto",
"quinn-udp",
"rustc-hash",
- "rustls 0.23.23",
+ "rustls 0.23.25",
"socket2",
"thiserror 2.0.12",
"tokio",
"tracing",
+ "web-time 1.1.0",
]
[[package]]
name = "quinn-proto"
-version = "0.11.9"
+version = "0.11.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a2fe5ef3495d7d2e377ff17b1a8ce2ee2ec2a18cde8b6ad6619d65d0701c135d"
+checksum = "b820744eb4dc9b57a3398183639c511b5a26d2ed702cedd3febaa1393caa22cc"
dependencies = [
"bytes",
- "getrandom 0.2.15",
- "rand 0.8.5",
- "ring 0.17.13",
+ "getrandom 0.3.2",
+ "rand 0.9.0",
+ "ring 0.17.14",
"rustc-hash",
- "rustls 0.23.23",
+ "rustls 0.23.25",
"rustls-pki-types",
"slab",
"thiserror 2.0.12",
@@ -4761,13 +4914,19 @@ dependencies = [
[[package]]
name = "quote"
-version = "1.0.39"
+version = "1.0.40"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c1f1914ce909e1658d9907913b4b91947430c7d9be598b15a1912935b8c04801"
+checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d"
dependencies = [
"proc-macro2",
]
+[[package]]
+name = "r-efi"
+version = "5.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "74765f6d916ee2faa39bc8e68e4f3ed8949b48cccdac59983d287a7cb71ce9c5"
+
[[package]]
name = "rand"
version = "0.7.3"
@@ -4857,7 +5016,7 @@ version = "0.9.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38"
dependencies = [
- "getrandom 0.3.1",
+ "getrandom 0.3.2",
]
[[package]]
@@ -4909,7 +5068,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "75e669e5202259b5314d1ea5397316ad400819437857b90861765f24c4cf80a2"
dependencies = [
"pem",
- "ring 0.17.13",
+ "ring 0.17.14",
"rustls-pki-types",
"time",
"yasna",
@@ -5022,9 +5181,9 @@ dependencies = [
[[package]]
name = "reqwest"
-version = "0.12.12"
+version = "0.12.15"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "43e734407157c3c2034e0258f5e4473ddb361b1e85f95a66690d67264d7cd1da"
+checksum = "d19c46a6fdd48bc4dab94b6103fccc55d34c67cc0ad04653aad4ea2a07cd7bbb"
dependencies = [
"base64 0.22.1",
"bytes",
@@ -5032,7 +5191,7 @@ dependencies = [
"futures-core",
"futures-util",
"h2",
- "http 1.2.0",
+ "http 1.3.1",
"http-body",
"http-body-util",
"hyper",
@@ -5048,7 +5207,7 @@ dependencies = [
"percent-encoding",
"pin-project-lite",
"quinn",
- "rustls 0.23.23",
+ "rustls 0.23.25",
"rustls-pemfile",
"rustls-pki-types",
"serde",
@@ -5071,12 +5230,11 @@ dependencies = [
[[package]]
name = "resolv-conf"
-version = "0.7.0"
+version = "0.7.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "52e44394d2086d010551b14b53b1f24e31647570cd1deb0379e2c21b329aba00"
+checksum = "48375394603e3dd4b2d64371f7148fd8c7baa2680e28741f2cb8d23b59e3d4c4"
dependencies = [
"hostname",
- "quick-error",
]
[[package]]
@@ -5106,9 +5264,9 @@ dependencies = [
[[package]]
name = "ring"
-version = "0.17.13"
+version = "0.17.14"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "70ac5d832aa16abd7d1def883a8545280c20a60f523a370aa3a9617c2b8550ee"
+checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7"
dependencies = [
"cc",
"cfg-if",
@@ -5286,14 +5444,14 @@ dependencies = [
[[package]]
name = "rustix"
-version = "1.0.1"
+version = "1.0.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dade4812df5c384711475be5fcd8c162555352945401aed22a35bffeab61f657"
+checksum = "e56a18552996ac8d29ecc3b190b4fdbb2d91ca4ec396de7bbffaf43f3d637e96"
dependencies = [
"bitflags 2.9.0",
"errno",
"libc",
- "linux-raw-sys 0.9.2",
+ "linux-raw-sys 0.9.3",
"windows-sys 0.59.0",
]
@@ -5304,21 +5462,21 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3f56a14d1f48b391359b22f731fd4bd7e43c97f3c50eee276f3aa09c94784d3e"
dependencies = [
"log",
- "ring 0.17.13",
+ "ring 0.17.14",
"rustls-webpki 0.101.7",
"sct",
]
[[package]]
name = "rustls"
-version = "0.23.23"
+version = "0.23.25"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "47796c98c480fce5406ef69d1c76378375492c3b0a0de587be0c1d9feb12f395"
+checksum = "822ee9188ac4ec04a2f0531e55d035fb2de73f18b41a63c70c2712503b6fb13c"
dependencies = [
"once_cell",
- "ring 0.17.13",
+ "ring 0.17.14",
"rustls-pki-types",
- "rustls-webpki 0.102.8",
+ "rustls-webpki 0.103.0",
"subtle",
"zeroize",
]
@@ -5347,17 +5505,17 @@ version = "0.101.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8b6275d1ee7a1cd780b64aca7726599a1dbc893b1e64144529e55c3c2f745765"
dependencies = [
- "ring 0.17.13",
+ "ring 0.17.14",
"untrusted 0.9.0",
]
[[package]]
name = "rustls-webpki"
-version = "0.102.8"
+version = "0.103.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "64ca1bc8749bd4cf37b5ce386cc146580777b4e8572c7b97baf22c83f444bee9"
+checksum = "0aa4eeac2588ffff23e9d7a7e9b3f971c5fb5b7ebc9452745e0c232c64f83b2f"
dependencies = [
- "ring 0.17.13",
+ "ring 0.17.14",
"rustls-pki-types",
"untrusted 0.9.0",
]
@@ -5378,6 +5536,17 @@ dependencies = [
"static_assertions",
]
+[[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"
@@ -5429,7 +5598,7 @@ version = "0.7.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "da046153aa2352493d6cb7da4b6e5c0c057d8a1d0a9aa8560baffdd945acd414"
dependencies = [
- "ring 0.17.13",
+ "ring 0.17.14",
"untrusted 0.9.0",
]
@@ -5529,7 +5698,7 @@ version = "1.0.140"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "20068b6e96dc6c9bd23e01df8827e6c7e1f2fddd43c21810382803c136b99373"
dependencies = [
- "indexmap 2.7.1",
+ "indexmap 2.8.0",
"itoa",
"memchr",
"ryu",
@@ -5718,7 +5887,7 @@ dependencies = [
"chacha20poly1305",
"curve25519-dalek",
"rand_core 0.6.4",
- "ring 0.17.13",
+ "ring 0.17.14",
"rustc_version",
"sha2 0.10.8",
"subtle",
@@ -5839,7 +6008,7 @@ dependencies = [
"lazy_static",
"md-5",
"rand 0.8.5",
- "ring 0.17.13",
+ "ring 0.17.14",
"subtle",
"thiserror 1.0.69",
"tokio",
@@ -5858,7 +6027,7 @@ dependencies = [
"lazy_static",
"md-5",
"rand 0.8.5",
- "ring 0.17.13",
+ "ring 0.17.14",
"subtle",
"thiserror 1.0.69",
"tokio",
@@ -5984,15 +6153,14 @@ checksum = "1ac9aa371f599d22256307c24a9d748c041e548cbf599f35d890f9d365361790"
[[package]]
name = "tempfile"
-version = "3.18.0"
+version = "3.19.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2c317e0a526ee6120d8dabad239c8dadca62b24b6f168914bbbc8e2fb1f0e567"
+checksum = "7437ac7763b9b123ccf33c338a5cc1bac6f69b45a136c19bdd8a65e3916435bf"
dependencies = [
- "cfg-if",
"fastrand",
- "getrandom 0.3.1",
+ "getrandom 0.3.2",
"once_cell",
- "rustix 1.0.1",
+ "rustix 1.0.3",
"windows-sys 0.59.0",
]
@@ -6014,8 +6182,8 @@ dependencies = [
"async-trait",
"base64 0.22.1",
"futures",
- "http 1.2.0",
- "indexmap 2.7.1",
+ "http 1.3.1",
+ "indexmap 2.8.0",
"parking_lot",
"paste",
"reqwest",
@@ -6116,9 +6284,9 @@ dependencies = [
[[package]]
name = "time"
-version = "0.3.39"
+version = "0.3.40"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dad298b01a40a23aac4580b67e3dbedb7cc8402f3592d7f49469de2ea4aecdd8"
+checksum = "9d9c75b47bdff86fa3334a3db91356b8d7d86a9b839dab7d0bdc5c3d3a077618"
dependencies = [
"deranged",
"itoa",
@@ -6131,15 +6299,15 @@ dependencies = [
[[package]]
name = "time-core"
-version = "0.1.3"
+version = "0.1.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "765c97a5b985b7c11d7bc27fa927dc4fe6af3a6dfb021d28deb60d3bf51e76ef"
+checksum = "c9e9a38711f559d9e3ce1cdb06dd7c5b8ea546bc90052da6d06bb76da74bb07c"
[[package]]
name = "time-macros"
-version = "0.2.20"
+version = "0.2.21"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e8093bc3e81c3bc5f7879de09619d06c9a5a5e45ca44dfeeb7225bae38005c5c"
+checksum = "29aa485584182073ed57fd5004aa09c371f021325014694e432313345865fd04"
dependencies = [
"num-conv",
"time-core",
@@ -6182,9 +6350,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20"
[[package]]
name = "tokio"
-version = "1.44.0"
+version = "1.44.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9975ea0f48b5aa3972bf2d888c238182458437cc2a19374b81b25cdf1023fb3a"
+checksum = "f382da615b842244d4b8738c82ed1275e6c5dd90c459a30941cd07080b06c91a"
dependencies = [
"backtrace",
"bytes",
@@ -6225,7 +6393,7 @@ version = "0.26.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8e727b36a1a0e8b74c376ac2211e40c2c8af09fb4013c60d910495810f008e9b"
dependencies = [
- "rustls 0.23.23",
+ "rustls 0.23.25",
"tokio",
]
@@ -6242,9 +6410,9 @@ dependencies = [
[[package]]
name = "tokio-util"
-version = "0.7.13"
+version = "0.7.14"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d7fcaa8d55a2bdd6b83ace262b016eca0d79ee02818c5c1bcdf0305114081078"
+checksum = "6b9590b93e6fcc1739458317cccd391ad3955e2bde8913edf6f95f9e65a8f034"
dependencies = [
"bytes",
"futures-core",
@@ -6281,7 +6449,7 @@ version = "0.22.24"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "17b4795ff5edd201c7cd6dca065ae59972ce77d1b80fa0a84d94950ece7d1474"
dependencies = [
- "indexmap 2.7.1",
+ "indexmap 2.8.0",
"serde",
"serde_spanned",
"toml_datetime",
@@ -6300,7 +6468,7 @@ dependencies = [
"base64 0.22.1",
"bytes",
"h2",
- "http 1.2.0",
+ "http 1.3.1",
"http-body",
"http-body-util",
"hyper",
@@ -6363,7 +6531,7 @@ dependencies = [
"bitflags 2.9.0",
"bytes",
"futures-util",
- "http 1.2.0",
+ "http 1.3.1",
"http-body",
"http-body-util",
"http-range-header",
@@ -6533,7 +6701,7 @@ dependencies = [
"log",
"md-5",
"rand 0.8.5",
- "ring 0.17.13",
+ "ring 0.17.14",
"stun 0.5.1",
"thiserror 1.0.69",
"tokio",
@@ -6587,6 +6755,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"
@@ -6656,11 +6830,11 @@ checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821"
[[package]]
name = "uuid"
-version = "1.15.1"
+version = "1.16.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e0f540e3240398cce6128b64ba83fdbdd86129c16a3aa1a3a252efd66eb3d587"
+checksum = "458f7a779bf54acc9f347480ac654f68407d3aab21269a6e3c9f922acd9e2da9"
dependencies = [
- "getrandom 0.3.1",
+ "getrandom 0.3.2",
]
[[package]]
@@ -6729,9 +6903,9 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423"
[[package]]
name = "wasi"
-version = "0.13.3+wasi-0.2.2"
+version = "0.14.2+wasi-0.2.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "26816d2e1a4a36a2940b96c5296ce403917633dff8f3440e9b236ed6f6bacad2"
+checksum = "9683f9a5a998d873c0d21fcbe3c083009670149a8fab228644b8bd36b2c48cb3"
dependencies = [
"wit-bindgen-rt",
]
@@ -7119,7 +7293,7 @@ version = "0.1.0"
dependencies = [
"futures",
"getrandom 0.2.15",
- "libp2p-core",
+ "libp2p-core 0.43.1",
"libp2p-identity",
"libp2p-noise",
"libp2p-webtransport-websys",
@@ -7133,9 +7307,9 @@ dependencies = [
[[package]]
name = "widestring"
-version = "1.1.0"
+version = "1.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7219d36b6eac893fa81e84ebe06485e7dcbb616177469b142df14f1f4deb1311"
+checksum = "dd7cf3379ca1aac9eea11fba24fd7e315d621f8dfe35c8d7d2be8b793726e07d"
[[package]]
name = "winapi"
@@ -7168,6 +7342,16 @@ version = "0.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
+[[package]]
+name = "windows"
+version = "0.52.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e48a53791691ab099e5e2ad123536d0fff50652600abaf43bbf952894110d0be"
+dependencies = [
+ "windows-core 0.52.0",
+ "windows-targets 0.52.6",
+]
+
[[package]]
name = "windows"
version = "0.53.0"
@@ -7198,6 +7382,15 @@ dependencies = [
"windows-targets 0.52.6",
]
+[[package]]
+name = "windows-core"
+version = "0.52.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9"
+dependencies = [
+ "windows-targets 0.52.6",
+]
+
[[package]]
name = "windows-core"
version = "0.53.0"
@@ -7229,7 +7422,7 @@ dependencies = [
"windows-implement 0.58.0",
"windows-interface 0.58.0",
"windows-result 0.2.0",
- "windows-strings",
+ "windows-strings 0.1.0",
"windows-targets 0.52.6",
]
@@ -7277,15 +7470,21 @@ dependencies = [
"syn 2.0.100",
]
+[[package]]
+name = "windows-link"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "76840935b766e1b0a05c0066835fb9ec80071d4c09a16f6bd5f7e655e3c14c38"
+
[[package]]
name = "windows-registry"
-version = "0.2.0"
+version = "0.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e400001bb720a623c1c69032f8e3e4cf09984deec740f007dd2b03ec864804b0"
+checksum = "4286ad90ddb45071efd1a66dfa43eb02dd0dfbae1545ad6cc3c51cf34d7e8ba3"
dependencies = [
- "windows-result 0.2.0",
- "windows-strings",
- "windows-targets 0.52.6",
+ "windows-result 0.3.2",
+ "windows-strings 0.3.1",
+ "windows-targets 0.53.0",
]
[[package]]
@@ -7306,6 +7505,15 @@ dependencies = [
"windows-targets 0.52.6",
]
+[[package]]
+name = "windows-result"
+version = "0.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c64fd11a4fd95df68efcfee5f44a294fe71b8bc6a91993e2791938abcc712252"
+dependencies = [
+ "windows-link",
+]
+
[[package]]
name = "windows-strings"
version = "0.1.0"
@@ -7316,6 +7524,15 @@ dependencies = [
"windows-targets 0.52.6",
]
+[[package]]
+name = "windows-strings"
+version = "0.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "87fa48cc5d406560701792be122a10132491cff9d0aeb23583cc2dcafc847319"
+dependencies = [
+ "windows-link",
+]
+
[[package]]
name = "windows-sys"
version = "0.48.0"
@@ -7367,13 +7584,29 @@ dependencies = [
"windows_aarch64_gnullvm 0.52.6",
"windows_aarch64_msvc 0.52.6",
"windows_i686_gnu 0.52.6",
- "windows_i686_gnullvm",
+ "windows_i686_gnullvm 0.52.6",
"windows_i686_msvc 0.52.6",
"windows_x86_64_gnu 0.52.6",
"windows_x86_64_gnullvm 0.52.6",
"windows_x86_64_msvc 0.52.6",
]
+[[package]]
+name = "windows-targets"
+version = "0.53.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b1e4c7e8ceaaf9cb7d7507c974735728ab453b67ef8f18febdd7c11fe59dca8b"
+dependencies = [
+ "windows_aarch64_gnullvm 0.53.0",
+ "windows_aarch64_msvc 0.53.0",
+ "windows_i686_gnu 0.53.0",
+ "windows_i686_gnullvm 0.53.0",
+ "windows_i686_msvc 0.53.0",
+ "windows_x86_64_gnu 0.53.0",
+ "windows_x86_64_gnullvm 0.53.0",
+ "windows_x86_64_msvc 0.53.0",
+]
+
[[package]]
name = "windows_aarch64_gnullvm"
version = "0.48.5"
@@ -7386,6 +7619,12 @@ version = "0.52.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3"
+[[package]]
+name = "windows_aarch64_gnullvm"
+version = "0.53.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "86b8d5f90ddd19cb4a147a5fa63ca848db3df085e25fee3cc10b39b6eebae764"
+
[[package]]
name = "windows_aarch64_msvc"
version = "0.48.5"
@@ -7398,6 +7637,12 @@ version = "0.52.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469"
+[[package]]
+name = "windows_aarch64_msvc"
+version = "0.53.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c7651a1f62a11b8cbd5e0d42526e55f2c99886c77e007179efff86c2b137e66c"
+
[[package]]
name = "windows_i686_gnu"
version = "0.48.5"
@@ -7410,12 +7655,24 @@ version = "0.52.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b"
+[[package]]
+name = "windows_i686_gnu"
+version = "0.53.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c1dc67659d35f387f5f6c479dc4e28f1d4bb90ddd1a5d3da2e5d97b42d6272c3"
+
[[package]]
name = "windows_i686_gnullvm"
version = "0.52.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66"
+[[package]]
+name = "windows_i686_gnullvm"
+version = "0.53.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9ce6ccbdedbf6d6354471319e781c0dfef054c81fbc7cf83f338a4296c0cae11"
+
[[package]]
name = "windows_i686_msvc"
version = "0.48.5"
@@ -7428,6 +7685,12 @@ version = "0.52.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66"
+[[package]]
+name = "windows_i686_msvc"
+version = "0.53.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "581fee95406bb13382d2f65cd4a908ca7b1e4c2f1917f143ba16efe98a589b5d"
+
[[package]]
name = "windows_x86_64_gnu"
version = "0.48.5"
@@ -7440,6 +7703,12 @@ version = "0.52.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78"
+[[package]]
+name = "windows_x86_64_gnu"
+version = "0.53.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2e55b5ac9ea33f2fc1716d1742db15574fd6fc8dadc51caab1c16a3d3b4190ba"
+
[[package]]
name = "windows_x86_64_gnullvm"
version = "0.48.5"
@@ -7452,6 +7721,12 @@ version = "0.52.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d"
+[[package]]
+name = "windows_x86_64_gnullvm"
+version = "0.53.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0a6e035dd0599267ce1ee132e51c27dd29437f63325753051e71dd9e42406c57"
+
[[package]]
name = "windows_x86_64_msvc"
version = "0.48.5"
@@ -7464,11 +7739,17 @@ version = "0.52.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec"
+[[package]]
+name = "windows_x86_64_msvc"
+version = "0.53.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "271414315aff87387382ec3d271b52d7ae78726f5d44ac98b4f4030c91880486"
+
[[package]]
name = "winnow"
-version = "0.7.3"
+version = "0.7.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0e7f4ea97f6f78012141bcdb6a216b2609f0979ada50b20ca5b52dde2eac2bb1"
+checksum = "0e97b544156e9bebe1a0ffbc03484fc1ffe3100cbce3ffb17eac35f7cdd7ab36"
dependencies = [
"memchr",
]
@@ -7485,9 +7766,9 @@ dependencies = [
[[package]]
name = "wit-bindgen-rt"
-version = "0.33.0"
+version = "0.39.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3268f3d866458b787f390cf61f4bbb563b922d091359f9608842999eaee3943c"
+checksum = "6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1"
dependencies = [
"bitflags 2.9.0",
]
diff --git a/protocols/gossipsub/CHANGELOG.md b/protocols/gossipsub/CHANGELOG.md
index 40d95dad5dd..f81aa5da6b1 100644
--- a/protocols/gossipsub/CHANGELOG.md
+++ b/protocols/gossipsub/CHANGELOG.md
@@ -1,4 +1,7 @@
-## 0.49.0
+## 0.49
+
+- 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)
- Fix a race condition for messages published which are already in the network.
See [PR 5928](https://github.com/libp2p/rust-libp2p/pull/5928)
diff --git a/protocols/gossipsub/Cargo.toml b/protocols/gossipsub/Cargo.toml
index 99213860a27..a71405de48a 100644
--- a/protocols/gossipsub/Cargo.toml
+++ b/protocols/gossipsub/Cargo.toml
@@ -24,14 +24,16 @@ fnv = "1.0.7"
futures = { workspace = true }
futures-timer = "3.0.2"
getrandom = { workspace = true }
-hashlink = { 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.46"
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"] }
@@ -42,8 +44,7 @@ tracing = { workspace = true }
prometheus-client = { workspace = true }
[dev-dependencies]
-libp2p-core = { workspace = true }
-libp2p-swarm-test = { path = "../../swarm-test" }
+libp2p-swarm-test = "0.5.0"
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 0e9e44b2ef5..bc4998ffaad 100644
--- a/protocols/gossipsub/src/behaviour.rs
+++ b/protocols/gossipsub/src/behaviour.rs
@@ -19,10 +19,12 @@
// DEALINGS IN THE SOFTWARE.
use std::{
- cmp::{max, Ordering, Ordering::Equal},
+ cmp::{
+ max,
+ Ordering::{self, Equal},
+ },
collections::{BTreeSet, HashMap, HashSet, VecDeque},
- fmt,
- fmt::Debug,
+ fmt::{self, Debug},
net::IpAddr,
task::{Context, Poll},
time::Duration,
@@ -57,7 +59,7 @@ use crate::{
metrics::{Churn, Config as MetricsConfig, Inclusion, Metrics, Penalty},
peer_score::{PeerScore, PeerScoreParams, PeerScoreThresholds, RejectReason},
protocol::SIGNING_PREFIX,
- rpc::Sender,
+ queue::Queue,
rpc_proto::proto,
subscription_filter::{AllowAllSubscriptionFilter, TopicSubscriptionFilter},
time_cache::DuplicateCache,
@@ -750,6 +752,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()),
},
@@ -1359,6 +1362,7 @@ where
self.send_message(
*peer_id,
RpcOut::Forward {
+ message_id: id.clone(),
message: msg,
timeout: Delay::new(self.config.forward_queue_duration()),
},
@@ -2057,9 +2061,8 @@ where
// before we add all the gossip from this heartbeat in order to gain a true measure of
// steady-state size of the queues.
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.len());
}
}
@@ -2724,6 +2727,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()),
},
@@ -2846,8 +2850,12 @@ where
return false;
};
- // Try sending the message to the connection handler.
- match peer.sender.send_message(rpc) {
+ if rpc.high_priority() {
+ peer.messages.push(rpc);
+ return true;
+ }
+
+ match peer.messages.try_push(rpc) {
Ok(()) => true,
Err(rpc) => {
// Sending failed because the channel is full.
@@ -2855,25 +2863,7 @@ 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.")
- }
- }
+ failed_messages.queue_full += 1;
// Update peer score.
if let Some((peer_score, ..)) = &mut self.peer_score {
@@ -3109,16 +3099,18 @@ where
.or_insert(PeerConnections {
kind: PeerKind::Floodsub,
connections: vec![],
- sender: Sender::new(self.config.connection_handler_queue_len()),
topics: Default::default(),
dont_send: LinkedHashMap::new(),
+ messages: Queue::new(self.config.connection_handler_queue_len()),
});
// 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(),
))
}
@@ -3136,16 +3128,18 @@ where
.or_insert(PeerConnections {
kind: PeerKind::Floodsub,
connections: vec![],
- sender: Sender::new(self.config.connection_handler_queue_len()),
topics: Default::default(),
dont_send: LinkedHashMap::new(),
+ messages: Queue::new(self.config.connection_handler_queue_len()),
});
// 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(),
))
}
@@ -3186,7 +3180,7 @@ where
}
}
}
- HandlerEvent::MessageDropped(rpc) => {
+ HandlerEvent::MessagesDropped(rpcs) => {
// Account for this in the scoring logic
if let Some((peer_score, _, _)) = &mut self.peer_score {
peer_score.failed_message_slow_peer(&propagation_source);
@@ -3194,29 +3188,14 @@ 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.
+ failed_messages.timeout += rpcs.len();
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);
+ for rpc in rpcs {
+ if let RpcOut::Publish { message, .. } | RpcOut::Forward { message, .. } =
+ rpc
+ {
metrics.timeout_msg_dropped(&message.topic);
}
- _ => {}
}
}
}
@@ -3319,6 +3298,16 @@ where
if let Some(metrics) = self.metrics.as_mut() {
metrics.register_idontwant(message_ids.len());
}
+
+ // Remove messages from the queue.
+ peer.messages.retain_mut(|rpc| match rpc {
+ RpcOut::Publish { message_id, .. }
+ | RpcOut::Forward { message_id, .. } => {
+ !message_ids.contains(message_id)
+ }
+ _ => true,
+ });
+
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 ff69c243453..fd67eb6128d 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 byteorder::{BigEndian, ByteOrder};
use libp2p_core::ConnectedPoint;
@@ -28,8 +28,8 @@ use rand::Rng;
use super::*;
use crate::{
- config::ConfigBuilder, rpc::Receiver, subscription_filter::WhitelistSubscriptionFilter,
- types::Rpc, IdentTopic as Topic,
+ config::ConfigBuilder, subscription_filter::WhitelistSubscriptionFilter, types::Rpc,
+ IdentTopic as Topic,
};
#[derive(Default, Debug)]
@@ -57,7 +57,7 @@ where
) -> (
Behaviour,
Vec,
- HashMap,
+ HashMap>,
Vec,
) {
let keypair = libp2p_identity::Keypair::generate_ed25519();
@@ -176,7 +176,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,
@@ -190,7 +190,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,
@@ -212,7 +212,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,
@@ -231,8 +231,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,
@@ -240,7 +240,7 @@ where
kind: kind.unwrap_or(PeerKind::Floodsub),
connections: vec![connection_id],
topics: Default::default(),
- sender,
+ messages: queue,
dont_send: LinkedHashMap::new(),
},
);
@@ -275,7 +275,7 @@ where
&peer,
);
}
- (peer, receiver)
+ (peer, receiver_queue)
}
fn disconnect_peer(gs: &mut Behaviour, peer_id: &PeerId)
@@ -436,17 +436,17 @@ fn test_subscribe() {
);
// collect all the subscriptions
- let subscriptions = receivers
- .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() {
- collected_subscriptions += 1
+ let subscriptions =
+ receivers
+ .into_values()
+ .fold(0, |mut collected_subscriptions, mut queue| {
+ while !queue.is_empty() {
+ if let Ok(RpcOut::Subscribe(_)) = queue.try_pop() {
+ collected_subscriptions += 1
+ }
}
- }
- collected_subscriptions
- });
+ collected_subscriptions
+ });
// we sent a subscribe to all known peers
assert_eq!(subscriptions, 20);
@@ -497,17 +497,17 @@ fn test_unsubscribe() {
);
// collect all the subscriptions
- let subscriptions = receivers
- .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() {
- collected_subscriptions += 1
+ let subscriptions =
+ receivers
+ .into_values()
+ .fold(0, |mut collected_subscriptions, mut queue| {
+ while !queue.is_empty() {
+ if let Ok(RpcOut::Subscribe(_)) = queue.try_pop() {
+ collected_subscriptions += 1
+ }
}
- }
- collected_subscriptions
- });
+ collected_subscriptions
+ });
// we sent a unsubscribe to all known peers, for two topics
assert_eq!(subscriptions, 40);
@@ -570,27 +570,21 @@ 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 Ok(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.
@@ -618,8 +612,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,
@@ -627,11 +621,11 @@ fn test_join() {
kind: PeerKind::Floodsub,
connections: vec![connection_id],
topics: Default::default(),
- sender,
+ messages: queue,
dont_send: LinkedHashMap::new(),
},
);
- receivers.insert(random_peer, receiver);
+ receivers.insert(random_peer, receiver_queue);
gs.on_swarm_event(FromSwarm::ConnectionEstablished(ConnectionEstablished {
peer_id: random_peer,
@@ -719,10 +713,9 @@ fn test_publish_without_flood_publishing() {
// Collect all publish messages
let publishes = receivers
.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 Ok(RpcOut::Publish { message, .. }) = queue.try_pop() {
collected_publish.push(message);
}
}
@@ -804,10 +797,9 @@ fn test_fanout() {
// Collect all publish messages
let publishes = receivers
.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 Ok(RpcOut::Publish { message, .. }) = queue.try_pop() {
collected_publish.push(message);
}
}
@@ -852,10 +844,9 @@ fn test_inject_connected() {
// collect all the SendEvents
let subscriptions = receivers.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 Ok(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);
@@ -1023,7 +1014,7 @@ fn test_get_random_peers() {
kind: PeerKind::Gossipsubv1_1,
connections: vec![ConnectionId::new_unchecked(0)],
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(),
},
);
@@ -1085,17 +1076,17 @@ fn test_handle_iwant_msg_cached() {
gs.handle_iwant(&peers[7], vec![msg_id.clone()]);
// the messages we are sending
- let sent_messages = receivers
- .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() {
- collected_messages.push(message)
+ let sent_messages =
+ receivers
+ .into_values()
+ .fold(vec![], |mut collected_messages, mut queue| {
+ while !queue.is_empty() {
+ if let Ok(RpcOut::Forward { message, .. }) = queue.try_pop() {
+ collected_messages.push(message)
+ }
}
- }
- collected_messages
- });
+ collected_messages
+ });
assert!(
sent_messages
@@ -1143,28 +1134,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
+ receivers = receivers
+ .into_iter()
+ .map(|(peer_id, mut queue)| {
+ while !queue.is_empty() {
+ if matches!(queue.try_pop(), Ok(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!(
@@ -1268,10 +1254,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 = receivers.remove(&peers[7]).unwrap();
+ while !receiver_queue.is_empty() {
+ if let Ok(RpcOut::IWant(IWant { message_ids })) = receiver_queue.try_pop() {
if message_ids
.iter()
.any(|m| *m == MessageId::new(b"unknown id"))
@@ -1441,59 +1426,35 @@ fn test_handle_prune_peer_in_mesh() {
}
fn count_control_msgs(
- receivers: HashMap,
+ receivers: HashMap>,
mut filter: impl FnMut(&PeerId, &RpcOut) -> bool,
-) -> (usize, HashMap) {
+) -> (usize, HashMap>) {
let mut new_receivers = 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 receivers.into_iter() {
+ while !queue.is_empty() {
+ if let Ok(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_receivers.insert(peer_id, queue);
}
(collected_messages, new_receivers)
}
fn flush_events(
gs: &mut Behaviour,
- receivers: HashMap,
-) -> HashMap {
+ receivers: 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();
+ for (peer_id, mut queue) in receivers.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_receivers.insert(peer_id, queue);
}
new_receivers
}
@@ -1699,10 +1660,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) {
+ receivers.into_iter().fold(0, |mut fwds, (peer_id, mut queue)| {
+ while !queue.is_empty() {
+ if matches!(queue.try_pop(), Ok(RpcOut::Forward{message: m, ..}) if peer_id == peers[0] && m.data == message.data) {
fwds +=1;
}
}
@@ -1843,11 +1803,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 = receivers.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 Ok(RpcOut::IHave(_)) = receiver_queue.try_pop() {
gossips += 1;
}
}
@@ -2248,10 +2207,9 @@ fn test_flood_publish() {
// Collect all publish messages
let publishes = receivers
.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 Ok(RpcOut::Publish { message, .. }) = queue.try_pop() {
collected_publish.push(message);
}
}
@@ -2810,10 +2768,9 @@ fn test_iwant_msg_from_peer_below_gossip_threshold_gets_ignored() {
let sent_messages =
receivers
.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 Ok(RpcOut::Forward { message, .. }) = queue.try_pop() {
collected_messages.push((peer_id, message));
}
}
@@ -2955,17 +2912,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 =
+ receivers
+ .into_iter()
+ .fold(vec![], |mut collected_publish, (peer_id, mut queue)| {
+ while !queue.is_empty() {
+ if let Ok(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);
@@ -3010,17 +2967,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 =
+ receivers
+ .into_iter()
+ .fold(vec![], |mut collected_publish, (peer_id, mut queue)| {
+ while !queue.is_empty() {
+ if let Ok(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);
@@ -4562,10 +4519,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() {
+ receivers.into_values().fold(0, |mut fwds, mut queue| {
+ while !queue.is_empty() {
+ if let Ok(RpcOut::Forward { .. }) = queue.try_pop() {
fwds += 1;
}
}
@@ -4977,10 +4933,9 @@ fn test_publish_to_floodsub_peers_without_flood_publish() {
// Collect publish messages to floodsub peers
let publishes = receivers
.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(),
+ .fold(0, |mut collected_publish, (peer_id, mut queue)| {
+ while !queue.is_empty() {
+ if matches!(queue.try_pop(),
Ok(RpcOut::Publish{..}) if peer_id == p1 || peer_id == p2)
{
collected_publish += 1;
@@ -5033,10 +4988,9 @@ fn test_do_not_use_floodsub_in_fanout() {
// Collect publish messages to floodsub peers
let publishes = receivers
.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(),
+ .fold(0, |mut collected_publish, (peer_id, mut queue)| {
+ while !queue.is_empty() {
+ if matches!(queue.try_pop(),
Ok(RpcOut::Publish{..}) if peer_id == p1 || peer_id == p2)
{
collected_publish += 1;
@@ -5259,12 +5213,11 @@ fn test_subscribe_and_graft_with_negative_score() {
p1: PeerId,
p2: PeerId,
connection_id: ConnectionId,
- receivers: HashMap|
- -> HashMap {
+ 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() {
+ for (peer_id, mut receiver_queue) in receivers.into_iter() {
+ match receiver_queue.try_pop() {
Ok(rpc) if peer_id == p1 => {
gs1.on_connection_handler_event(
p2,
@@ -5355,10 +5308,9 @@ fn sends_idontwant() {
assert_eq!(
receivers
.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 Ok(RpcOut::IDontWant(_)) = queue.try_pop() {
assert_ne!(peer_id, peers[1]);
idontwants += 1;
}
@@ -5397,10 +5349,9 @@ fn doesnt_sends_idontwant_for_lower_message_size() {
assert_eq!(
receivers
.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 Ok(RpcOut::IDontWant(_)) = queue.try_pop() {
assert_ne!(peer_id, peers[1]);
idontwants += 1;
}
@@ -5440,10 +5391,9 @@ fn doesnt_send_idontwant() {
assert_eq!(
receivers
.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(), Ok(RpcOut::IDontWant(_)) if peer_id != peers[1]) {
idontwants += 1;
}
}
@@ -5488,16 +5438,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;
+ receivers
+ .into_iter()
+ .fold(0, |mut fwds, (peer_id, mut queue)| {
+ while !queue.is_empty() {
+ if let Ok(RpcOut::Forward { .. }) = queue.try_pop() {
+ assert_ne!(peer_id, peers[2]);
+ fwds += 1;
+ }
}
- }
- fwds
- }),
+ fwds
+ }),
2,
"IDONTWANT was not sent"
);
@@ -5579,14 +5530,11 @@ fn test_all_queues_full() {
kind: PeerKind::Gossipsubv1_1,
connections: vec![ConnectionId::new_unchecked(0)],
topics: topics.clone(),
- sender: Sender::new(2),
+ messages: Queue::new(2),
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 err = gs.publish(topic_hash, publish_data).unwrap_err();
assert!(matches!(err, PublishError::AllQueuesFull(f) if f == 1));
@@ -5614,7 +5562,7 @@ fn test_slow_peer_returns_failed_publish() {
kind: PeerKind::Gossipsubv1_1,
connections: vec![ConnectionId::new_unchecked(0)],
topics: topics.clone(),
- sender: Sender::new(2),
+ messages: Queue::new(2),
dont_send: LinkedHashMap::new(),
},
);
@@ -5626,18 +5574,13 @@ fn test_slow_peer_returns_failed_publish() {
kind: PeerKind::Gossipsubv1_1,
connections: vec![ConnectionId::new_unchecked(0)],
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();
- gs.heartbeat();
-
+ let _failed_publish = gs.publish(topic_hash.clone(), publish_data.clone());
gs.heartbeat();
let slow_peer_failed_messages = match gs.events.pop_front().unwrap() {
@@ -5649,20 +5592,11 @@ fn test_slow_peer_returns_failed_publish() {
};
let failed_messages = FailedMessages {
- publish: 1,
- forward: 0,
- priority: 1,
- non_priority: 0,
+ queue_full: 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]
@@ -5686,7 +5620,7 @@ fn test_slow_peer_returns_failed_ihave_handling() {
kind: PeerKind::Gossipsubv1_1,
connections: vec![ConnectionId::new_unchecked(0)],
topics: topics.clone(),
- sender: Sender::new(2),
+ messages: Queue::new(1),
dont_send: LinkedHashMap::new(),
},
);
@@ -5702,7 +5636,7 @@ fn test_slow_peer_returns_failed_ihave_handling() {
kind: PeerKind::Gossipsubv1_1,
connections: vec![ConnectionId::new_unchecked(0)],
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(),
},
);
@@ -5760,20 +5694,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,
+ queue_full: 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]
@@ -5798,7 +5723,7 @@ fn test_slow_peer_returns_failed_iwant_handling() {
kind: PeerKind::Gossipsubv1_1,
connections: vec![ConnectionId::new_unchecked(0)],
topics: topics.clone(),
- sender: Sender::new(2),
+ messages: Queue::new(1),
dont_send: LinkedHashMap::new(),
},
);
@@ -5814,7 +5739,7 @@ fn test_slow_peer_returns_failed_iwant_handling() {
kind: PeerKind::Gossipsubv1_1,
connections: vec![ConnectionId::new_unchecked(0)],
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(),
},
);
@@ -5852,20 +5777,11 @@ fn test_slow_peer_returns_failed_iwant_handling() {
.unwrap();
let failed_messages = FailedMessages {
- publish: 0,
- forward: 1,
- priority: 0,
- non_priority: 1,
+ queue_full: 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]
@@ -5890,7 +5806,7 @@ fn test_slow_peer_returns_failed_forward() {
kind: PeerKind::Gossipsubv1_1,
connections: vec![ConnectionId::new_unchecked(0)],
topics: topics.clone(),
- sender: Sender::new(2),
+ messages: Queue::new(1),
dont_send: LinkedHashMap::new(),
},
);
@@ -5906,7 +5822,7 @@ fn test_slow_peer_returns_failed_forward() {
kind: PeerKind::Gossipsubv1_1,
connections: vec![ConnectionId::new_unchecked(0)],
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(),
},
);
@@ -5944,20 +5860,11 @@ fn test_slow_peer_returns_failed_forward() {
.unwrap();
let failed_messages = FailedMessages {
- publish: 0,
- forward: 1,
- priority: 0,
- non_priority: 1,
+ queue_full: 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]
@@ -5987,7 +5894,7 @@ fn test_slow_peer_is_downscored_on_publish() {
kind: PeerKind::Gossipsubv1_1,
connections: vec![ConnectionId::new_unchecked(0)],
topics: topics.clone(),
- sender: Sender::new(2),
+ messages: Queue::new(1),
dont_send: LinkedHashMap::new(),
},
);
@@ -6000,7 +5907,7 @@ fn test_slow_peer_is_downscored_on_publish() {
kind: PeerKind::Gossipsubv1_1,
connections: vec![ConnectionId::new_unchecked(0)],
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(),
},
);
@@ -6012,44 +5919,46 @@ fn test_slow_peer_is_downscored_on_publish() {
gs.publish(topic_hash.clone(), publish_data).unwrap();
gs.heartbeat();
let slow_peer_score = gs.peer_score(&slow_peer_id).unwrap();
- assert_eq!(slow_peer_score, slow_peer_params.slow_peer_weight);
+ assert_eq!(slow_peer_score, slow_peer_params.slow_peer_weight * 3.0);
}
-#[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());
-}
+// #[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 queue = Queue::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();
+
+// queue
+// .try_push(RpcOut::Publish {
+// message: raw_message,
+// timeout: Delay::new(Duration::from_nanos(1)),
+// })
+// .unwrap();
+// let mut receiver_queue = queue.clone();
+// let stale = future::poll_fn(|cx| receiver_queue.poll_stale(cx))
+// .await
+// .unwrap();
+// assert!(matches!(stale, RpcOut::Publish { .. }));
+// }
+
+// #[test]
+// fn test_priority_messages_are_always_sent() {
+// let mut queue = Queue::new(2);
+// let topic_hash = Topic::new("Test").hash();
+// // Fill the buffer with the first message.
+// assert!(queue
+// .try_push(RpcOut::Subscribe(topic_hash.clone()))
+// .is_ok());
+// assert!(queue
+// .try_push(RpcOut::Subscribe(topic_hash.clone()))
+// .is_ok());
+// assert!(queue.try_push(RpcOut::Unsubscribe(topic_hash)).is_ok());
+// }
diff --git a/protocols/gossipsub/src/handler.rs b/protocols/gossipsub/src/handler.rs
index 7dc15e97fc1..492970a4336 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, Rpc, RpcOut},
ValidationError,
@@ -60,7 +60,7 @@ pub enum HandlerEvent {
/// which protocol. This message only occurs once per connection.
PeerKind(PeerKind),
/// A message to be published was dropped because it could not be sent in time.
- MessageDropped(RpcOut),
+ MessagesDropped(Vec),
}
/// A message sent from the behaviour to the handler.
@@ -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,22 +252,25 @@ 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.
self.outbound_substream =
Some(OutboundSubstreamState::WaitingOutput(substream));
return Poll::Ready(ConnectionHandlerEvent::NotifyBehaviour(
- HandlerEvent::MessageDropped(message),
+ HandlerEvent::MessagesDropped(vec![message]),
));
}
}
@@ -407,10 +410,19 @@ impl EnabledHandler {
}
}
- // Drop the next message in queue if it's stale.
- if let Poll::Ready(Some(rpc)) = self.send_queue.poll_stale(cx) {
+ // Remove stale messages from the queue.
+ let stale = self.message_queue.retain_mut(|rpc| match rpc {
+ RpcOut::Publish {
+ ref mut timeout, ..
+ }
+ | RpcOut::Forward {
+ ref mut timeout, ..
+ } => !timeout.poll_unpin(cx).is_ready(),
+ _ => true,
+ });
+ if !stale.is_empty() {
return Poll::Ready(ConnectionHandlerEvent::NotifyBehaviour(
- HandlerEvent::MessageDropped(rpc),
+ HandlerEvent::MessagesDropped(stale),
));
}
diff --git a/protocols/gossipsub/src/lib.rs b/protocols/gossipsub/src/lib.rs
index 87db1b771d1..3e63e210d50 100644
--- a/protocols/gossipsub/src/lib.rs
+++ b/protocols/gossipsub/src/lib.rs
@@ -104,7 +104,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 485bcd54eeb..9bdcc5693de 100644
--- a/protocols/gossipsub/src/metrics.rs
+++ b/protocols/gossipsub/src/metrics.rs
@@ -133,10 +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,
@@ -194,9 +190,7 @@ pub(crate) struct Metrics {
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,
+ queue_size: Histogram,
}
impl Metrics {
@@ -245,16 +239,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"
@@ -361,18 +345,11 @@ impl Metrics {
metric
};
- let priority_queue_size = Histogram::new(linear_buckets(0.0, 25.0, 100));
+ let queue_size = Histogram::new(linear_buckets(0.0, 50.0, 100));
registry.register(
"priority_queue_size",
"Histogram of observed priority queue sizes",
- priority_queue_size.clone(),
- );
-
- let non_priority_queue_size = Histogram::new(linear_buckets(0.0, 25.0, 100));
- registry.register(
- "non_priority_queue_size",
- "Histogram of observed non-priority queue sizes",
- non_priority_queue_size.clone(),
+ queue_size.clone(),
);
Self {
@@ -385,8 +362,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,
@@ -405,8 +380,7 @@ impl Metrics {
topic_iwant_msgs,
idontwant_msgs,
idontwant_msgs_ids,
- priority_queue_size,
- non_priority_queue_size,
+ queue_size,
}
}
@@ -537,20 +511,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() {
@@ -616,12 +576,7 @@ 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);
- }
-
- /// 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.observe(len as f64);
}
/// Observe a score of a mesh peer.
diff --git a/protocols/gossipsub/src/protocol.rs b/protocols/gossipsub/src/protocol.rs
index 7ee6d5c8245..20aee038eac 100644
--- a/protocols/gossipsub/src/protocol.rs
+++ b/protocols/gossipsub/src/protocol.rs
@@ -158,7 +158,7 @@ pub struct GossipsubCodec {
}
impl GossipsubCodec {
- pub fn new(max_length: usize, validation_mode: ValidationMode) -> GossipsubCodec {
+ pub(crate) fn new(max_length: usize, validation_mode: ValidationMode) -> GossipsubCodec {
let codec = quick_protobuf_codec::Codec::new(max_length);
GossipsubCodec {
validation_mode,
diff --git a/protocols/gossipsub/src/queue.rs b/protocols/gossipsub/src/queue.rs
new file mode 100644
index 00000000000..612bb64bc29
--- /dev/null
+++ b/protocols/gossipsub/src/queue.rs
@@ -0,0 +1,154 @@
+// 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::{BinaryHeap, HashMap},
+ mem,
+ sync::{
+ atomic::{AtomicUsize, Ordering},
+ Arc, Mutex,
+ },
+ task::{Context, Poll, Waker},
+};
+
+/// An async priority queue used to dispatch messages from the `NetworkBehaviour`
+/// to the `ConnectionHandler`. Inspired by loole and flume.
+#[derive(Debug)]
+pub(crate) struct Queue {
+ shared: Arc>>,
+ capacity: usize,
+ id: usize,
+ count: Arc,
+}
+
+/// The shared stated by the `NetworkBehaviour`s and the `ConnectionHandler`s.
+#[derive(Debug)]
+pub(crate) struct Shared {
+ queue: BinaryHeap,
+ pending_pops: HashMap,
+}
+
+impl Queue {
+ /// Create a new `Queue` with the `capacity`.
+ pub(crate) fn new(capacity: usize) -> Self {
+ Self {
+ shared: Arc::new(Mutex::new(Shared {
+ queue: BinaryHeap::with_capacity(capacity),
+ pending_pops: Default::default(),
+ })),
+ capacity,
+ count: Arc::new(AtomicUsize::new(1)),
+ id: 1,
+ }
+ }
+
+ /// Push an item to the queue ignoring if it's full or not.
+ pub(crate) fn push(&mut self, item: T) {
+ let mut shared = self.shared.lock().expect("lock to not be poisoned");
+ shared.queue.push(item);
+ }
+
+ /// Try to add an item to the Queue, return Err if the queue is full.
+ pub(crate) fn try_push(&mut self, item: T) -> Result<(), T> {
+ let mut shared = self.shared.lock().expect("lock to not be poisoned");
+ if shared.queue.len() >= self.capacity {
+ return Err(item);
+ }
+ shared.queue.push(item);
+ // Wake pending registered pops.
+ for (_, s) in shared.pending_pops.drain() {
+ s.wake();
+ }
+ Ok(())
+ }
+
+ /// Pop an element from the queue.
+ pub(crate) fn poll_pop(self: std::pin::Pin<&mut Self>, cx: &mut Context) -> Poll {
+ let mut shared = self.shared.lock().expect("lock to not be poisoned");
+ match shared.queue.pop() {
+ Some(t) => Poll::Ready(t),
+ None => {
+ shared
+ .pending_pops
+ .entry(self.id)
+ .or_insert(cx.waker().clone());
+ Poll::Pending
+ }
+ }
+ }
+
+ /// Attempts to pop an item from the queue.
+ /// this method returns an error if the queue is empty.
+ #[cfg(test)]
+ pub(crate) fn try_pop(&mut self) -> Result {
+ let mut shared = self.shared.lock().expect("lock to not be poisoned");
+ shared.queue.pop().ok_or(())
+ }
+
+ /// 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 items.
+ pub(crate) fn retain_mut bool>(&mut self, mut f: F) -> Vec {
+ let mut shared = self.shared.lock().expect("lock to not be poisoned");
+ // `BinaryHeap` doesn't impl `retain_mut`, this seems like a practical way to achieve it.
+ // `BinaryHeap::drain` is O(n) as it returns an iterator over the removed elements in its internal arbitrary order.
+ // `BinaryHeap::push` is ~O(1) which makes this function O(n).
+ let mut queue = mem::replace(&mut shared.queue, BinaryHeap::with_capacity(self.capacity));
+ let mut cleared = vec![];
+ for mut item in queue.drain() {
+ if f(&mut item) {
+ shared.queue.push(item);
+ } else {
+ cleared.push(item);
+ }
+ }
+ cleared
+ }
+
+ /// Returns the length of the queue.
+ pub(crate) fn len(&self) -> usize {
+ let shared = self.shared.lock().expect("lock to not be poisoned");
+ shared.queue.len()
+ }
+
+ /// Check if the queue is empty.
+ pub(crate) fn is_empty(&self) -> bool {
+ let shared = self.shared.lock().expect("lock to not be poisoned");
+ shared.queue.len() == 0
+ }
+}
+
+impl Clone for Queue {
+ fn clone(&self) -> Self {
+ Self {
+ shared: self.shared.clone(),
+ capacity: self.capacity,
+ count: self.count.clone(),
+ id: self.count.fetch_add(1, Ordering::SeqCst),
+ }
+ }
+}
+
+impl Drop for Queue {
+ fn drop(&mut self) {
+ let mut shared = self.shared.lock().expect("lock to not be poisoned");
+ shared.pending_pops.remove(&self.id);
+ }
+}
diff --git a/protocols/gossipsub/src/rpc.rs b/protocols/gossipsub/src/rpc.rs
deleted file mode 100644
index 41b338267e9..00000000000
--- a/protocols/gossipsub/src/rpc.rs
+++ /dev/null
@@ -1,193 +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.
- pub(crate) fn priority_queue_len(&self) -> usize {
- self.len.load(Ordering::Relaxed)
- }
-
- /// Returns the current size of the non-priority queue.
- 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