From 7a5a459acb6301d4b807ea47968ca84d88a7aefa Mon Sep 17 00:00:00 2001 From: Delta 4 <156182500+delta4chat@users.noreply.github.com> Date: Sat, 8 Feb 2025 13:15:40 +0800 Subject: [PATCH] types.rs, protocol/doh.rs: Completely remove RwLock --- Cargo.lock | 237 +++++++++++++++++++++---------------- Cargo.toml | 2 +- scripts/duplicate-deps.txt | 26 ++-- src/api.rs | 2 +- src/main.rs | 36 ++++-- src/protocol/doh.rs | 71 ++++------- src/traits.rs | 4 +- src/types.rs | 137 ++++++++++----------- 8 files changed, 273 insertions(+), 242 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 4ccca782..04aecea4 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -444,13 +444,13 @@ dependencies = [ [[package]] name = "async-trait" -version = "0.1.85" +version = "0.1.86" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f934833b4b7233644e5848f235df3f57ed8c80f1528a26c3dfa13d2147fa056" +checksum = "644dd749086bf3771a2fbc5f256fdb982d53f011c7d5d560304eafeecebce79d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] @@ -585,9 +585,9 @@ dependencies = [ [[package]] name = "bumpalo" -version = "3.16.0" +version = "3.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" +checksum = "1628fb46dfa0b37568d12e5edd512553eccf6a22a78e8bde00bb4aed84d5bdbf" [[package]] name = "byteorder" @@ -597,9 +597,9 @@ checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "bytes" -version = "1.9.0" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "325918d6fe32f23b19878fe4b34794ae41fc19ddbe53b10571a4874d44ffd39b" +checksum = "f61dac84819c6588b558454b194026eb1f09c293b9036ae9b159e74e73ab6cf9" [[package]] name = "camino" @@ -635,9 +635,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.2.10" +version = "1.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13208fcbb66eaeffe09b99fffbe1af420f00a7b35aa99ad683dfc1aa76145229" +checksum = "755717a7de9ec452bf7f3f1a3099085deabd7f2962b861dae91ecd7a365903d2" dependencies = [ "jobserver", "libc", @@ -705,9 +705,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.27" +version = "4.5.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "769b0145982b4b48713e01ec42d61614425f27b7058bda7180a3a41f30104796" +checksum = "3e77c3243bd94243c03672cb5154667347c457ca271254724f9f393aee1c05ff" dependencies = [ "clap_builder", "clap_derive", @@ -727,14 +727,14 @@ dependencies = [ [[package]] name = "clap_derive" -version = "4.5.24" +version = "4.5.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54b755194d6389280185988721fffba69495eed5ee9feeee9a599b53db80318c" +checksum = "bf4ced95c6f4a675af3da73304b9ac4ed991640c36374e4b46795c49e17cf1ed" dependencies = [ "heck", "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] @@ -945,7 +945,7 @@ checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] @@ -1025,7 +1025,7 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] @@ -1117,7 +1117,7 @@ dependencies = [ "heck", "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] @@ -1403,7 +1403,7 @@ checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] @@ -1493,6 +1493,18 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "getrandom" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43a49c392881ce6d5c3b8cb70f98717b7c07aabbdff06687b9030dbfbe2725f8" +dependencies = [ + "cfg-if", + "libc", + "wasi 0.13.3+wasi-0.2.2", + "windows-targets 0.52.6", +] + [[package]] name = "ghash" version = "0.5.1" @@ -1562,7 +1574,7 @@ dependencies = [ "gix-utils", "itoa", "thiserror 1.0.69", - "winnow", + "winnow 0.6.26", ] [[package]] @@ -1615,7 +1627,7 @@ dependencies = [ "smallvec", "thiserror 1.0.69", "unicode-bom", - "winnow", + "winnow 0.6.26", ] [[package]] @@ -1781,7 +1793,7 @@ checksum = "999ce923619f88194171a67fb3e6d613653b8d4d6078b529b15a765da0edcc17" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] @@ -1800,7 +1812,7 @@ dependencies = [ "itoa", "smallvec", "thiserror 1.0.69", - "winnow", + "winnow 0.6.26", ] [[package]] @@ -1884,7 +1896,7 @@ dependencies = [ "gix-validate", "memmap2", "thiserror 1.0.69", - "winnow", + "winnow 0.6.26", ] [[package]] @@ -2148,9 +2160,9 @@ checksum = "6fe2267d4ed49bc07b63801559be28c718ea06c4738b7a03c94df7386d2cde46" [[package]] name = "hickory-proto" -version = "0.24.2" +version = "0.24.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "447afdcdb8afb9d0a852af6dc65d9b285ce720ed7a59e42a8bf2e931c67bc1b5" +checksum = "2ad3d6d98c648ed628df039541a5577bee1a7c83e9e16fe3dbedeea4cdfeb971" dependencies = [ "async-trait", "cfg-if", @@ -2171,7 +2183,7 @@ dependencies = [ [[package]] name = "hitdns" -version = "0.7.0" +version = "0.7.1" dependencies = [ "anstyle", "anyhow", @@ -2197,7 +2209,7 @@ dependencies = [ "quinn", "quoted_printable", "reqwest-h3", - "rustls 0.23.21", + "rustls 0.23.22", "rustls-native-certs", "rustls-rustcrypto", "scc2", @@ -2296,9 +2308,9 @@ dependencies = [ [[package]] name = "httparse" -version = "1.9.5" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d71d3574edd2771538b901e6549113b4006ece66150fb69c0fb6d9a2adae946" +checksum = "f2d708df4e7140240a16cd6ab0ab65c972d7433ab77819ea693fde9c43811e2a" [[package]] name = "humantime" @@ -2308,9 +2320,9 @@ checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" [[package]] name = "hyper" -version = "1.5.2" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "256fb8d4bd6413123cc9d91832d78325c48ff41677595be797d90f42969beae0" +checksum = "cc2b571658e38e0c01b1fdca3bbbe93c00d3d71693ff2770043f8c29bc7d6f80" dependencies = [ "bytes", "futures-channel", @@ -2336,12 +2348,12 @@ dependencies = [ "http", "hyper", "hyper-util", - "rustls 0.23.21", + "rustls 0.23.22", "rustls-pki-types", "tokio", "tokio-rustls", "tower-service", - "webpki-roots 0.26.7", + "webpki-roots 0.26.8", ] [[package]] @@ -2501,7 +2513,7 @@ checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] @@ -2912,9 +2924,9 @@ dependencies = [ [[package]] name = "once_cell" -version = "1.20.2" +version = "1.20.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775" +checksum = "945462a4b81e43c4e3ba96bd7b49d834c6f61198356aa858733bc4acf3cbe62e" dependencies = [ "parking_lot_core 0.9.10", "portable-atomic", @@ -2958,9 +2970,9 @@ dependencies = [ [[package]] name = "p384" -version = "0.13.0" +version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70786f51bcc69f6a4c0360e063a4cac5419ef7c5cd5b3c99ad70f3be5ba79209" +checksum = "fe42f1670a52a47d448f14b6a5c61dd78fce51856e68edaa38f7ae3a46b8d6b6" dependencies = [ "ecdsa", "elliptic-curve", @@ -3055,22 +3067,22 @@ checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" [[package]] name = "pin-project" -version = "1.1.8" +version = "1.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e2ec53ad785f4d35dac0adea7f7dc6f1bb277ad84a680c7afefeae05d1f5916" +checksum = "dfe2e71e1471fe07709406bf725f710b02927c9c54b2b5b2ec0e8087d97c327d" dependencies = [ "pin-project-internal", ] [[package]] name = "pin-project-internal" -version = "1.1.8" +version = "1.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d56a66c0c55993aa927429d0f8a0abfd74f084e4d9c192cffed01e418d83eefb" +checksum = "f6e859e6e5bd50440ab63c47e3ebabc90f26251f7c73c3d3e837b74a1cc3fa67" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] @@ -3277,7 +3289,7 @@ dependencies = [ "quinn-proto", "quinn-udp", "rustc-hash", - "rustls 0.23.21", + "rustls 0.23.22", "socket2 0.5.8", "thiserror 2.0.11", "tokio", @@ -3295,7 +3307,7 @@ dependencies = [ "rand 0.8.5", "ring", "rustc-hash", - "rustls 0.23.21", + "rustls 0.23.22", "rustls-pki-types", "slab", "thiserror 2.0.11", @@ -3514,7 +3526,7 @@ dependencies = [ "percent-encoding", "pin-project-lite", "quinn", - "rustls 0.23.21", + "rustls 0.23.22", "rustls-pemfile 2.2.0", "rustls-pki-types", "serde", @@ -3530,7 +3542,7 @@ dependencies = [ "wasm-bindgen", "wasm-bindgen-futures", "web-sys", - "webpki-roots 0.26.7", + "webpki-roots 0.26.8", "windows-registry", ] @@ -3588,9 +3600,9 @@ checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" [[package]] name = "rustc-hash" -version = "2.1.0" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7fb8039b3032c191086b10f11f319a6e99e1e82889c5cc6046f515c9db1d497" +checksum = "357703d41365b4b27c590e3ed91eabb1b663f07c4c084095e60cbed4362dff0d" [[package]] name = "rustc_version" @@ -3642,9 +3654,9 @@ dependencies = [ [[package]] name = "rustls" -version = "0.23.21" +version = "0.23.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f287924602bf649d949c63dc8ac8b235fa5387d394020705b80c4eb597ce5b8" +checksum = "9fb9263ab4eb695e42321db096e3b8fbd715a59b154d5c88d82db2175b681ba7" dependencies = [ "log", "once_cell", @@ -3687,9 +3699,9 @@ dependencies = [ [[package]] name = "rustls-pki-types" -version = "1.10.1" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2bf47e6ff922db3825eb750c4e2ff784c6ff8fb9e13046ef6a1d1c5401b0b37" +checksum = "917ce264624a4b4db1c364dcc35bfca9ded014d0a958cd47ad3e960e988ea51c" dependencies = [ "web-time", ] @@ -3715,7 +3727,7 @@ dependencies = [ "pkcs8", "rand_core 0.6.4", "rsa", - "rustls 0.23.21", + "rustls 0.23.22", "rustls-pki-types", "rustls-webpki 0.102.8", "sec1", @@ -3753,9 +3765,9 @@ checksum = "f7c45b9784283f1b2e7fb61b42047c2fd678ef0960d4f6f1eba131594cc369d4" [[package]] name = "ryu" -version = "1.0.18" +version = "1.0.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" +checksum = "6ea1a2d0a644769cc99faa24c3ad26b379b786fe7c36fd3c546254801650e6dd" [[package]] name = "same-file" @@ -3768,9 +3780,9 @@ dependencies = [ [[package]] name = "scc" -version = "2.3.0" +version = "2.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28e1c91382686d21b5ac7959341fcb9780fa7c03773646995a87c950fa7be640" +checksum = "ea091f6cac2595aa38993f04f4ee692ed43757035c36e67c180b6828356385b1" dependencies = [ "sdd", "serde", @@ -3778,9 +3790,9 @@ dependencies = [ [[package]] name = "scc2" -version = "2.4.0" +version = "2.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bcc9c838933b6646f0d826fd761c71254741718048460e50c0641399851cd4f6" +checksum = "21e5ebbbd6282e93a86d458d3b32ffc26c6669d5a51bca76ccee5da6b6319e03" dependencies = [ "sdd", "serde", @@ -3819,9 +3831,9 @@ dependencies = [ [[package]] name = "sdd" -version = "3.0.5" +version = "3.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "478f121bb72bbf63c52c93011ea1791dca40140dfe13f8336c4c5ac952c33aa9" +checksum = "b07779b9b918cc05650cb30f404d4d7835d26df37c235eded8a6832e2fb82cca" [[package]] name = "sec1" @@ -3895,14 +3907,14 @@ checksum = "5a9bf7cf98d04a2b28aead066b7496853d4779c9cc183c440dbac457641e19a0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] name = "serde_json" -version = "1.0.137" +version = "1.0.138" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "930cfb6e6abf99298aaad7d29abbef7a9999a9a8806a40088f55f0dcec03146b" +checksum = "d434192e7da787e94a6ea7e9670b26a036d0ca41e0b7efb2676dd32bae872949" dependencies = [ "indexmap", "itoa", @@ -4233,7 +4245,7 @@ dependencies = [ "quote", "sqlx-core", "sqlx-macros-core", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] @@ -4255,7 +4267,7 @@ dependencies = [ "sha2", "sqlx-core", "sqlx-sqlite", - "syn 2.0.96", + "syn 2.0.98", "tempfile", "url", ] @@ -4324,9 +4336,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.96" +version = "2.0.98" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d5d0adab1ae378d7f53bdebc67a39f1f151407ef230f0ce2883572f5d8985c80" +checksum = "36147f1a48ae0ec2b5b3bc5b537d267457555a10dc06f3dbc8cb11ba3006d3b1" dependencies = [ "proc-macro2", "quote", @@ -4350,7 +4362,7 @@ checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] @@ -4397,13 +4409,13 @@ checksum = "7b2093cf4c8eb1e67749a6762251bc9cd836b6fc171623bd0a9d324d37af2417" [[package]] name = "tempfile" -version = "3.15.0" +version = "3.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a8a559c81686f576e8cd0290cd2a24a2a9ad80c98b3478856500fcbd7acd704" +checksum = "38c246215d7d24f48ae091a2902398798e05d978b24315d6efbc00ede9a8bb91" dependencies = [ "cfg-if", "fastrand 2.3.0", - "getrandom 0.2.15", + "getrandom 0.3.1", "once_cell", "rustix 0.38.44", "windows-sys 0.59.0", @@ -4435,7 +4447,7 @@ checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] @@ -4446,7 +4458,7 @@ checksum = "26afc1baea8a989337eeb52b6e72a039780ce45c3edfcc9c5b9d112feeb173c2" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] @@ -4538,7 +4550,7 @@ version = "0.26.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5f6d0975eaace0cf0fcadee4e4aaa5da15b5c079146f2cffb67c113be122bf37" dependencies = [ - "rustls 0.23.21", + "rustls 0.23.22", "tokio", ] @@ -4557,9 +4569,9 @@ dependencies = [ [[package]] name = "toml" -version = "0.8.19" +version = "0.8.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1ed1f98e3fdc28d6d910e6737ae6ab1a93bf1985935a1193e68f93eeb68d24e" +checksum = "cd87a5cdd6ffab733b2f74bc4fd7ee5fff6634124999ac278c35fc78c6120148" dependencies = [ "serde", "serde_spanned", @@ -4591,15 +4603,15 @@ dependencies = [ [[package]] name = "toml_edit" -version = "0.22.22" +version = "0.22.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ae48d6208a266e853d946088ed816055e556cc6028c5e8e2b84d9fa5dd7c7f5" +checksum = "02a8b472d1a3d7c18e2d61a489aee3453fd9031c33e4f55bd533f4a7adca1bee" dependencies = [ "indexmap", "serde", "serde_spanned", "toml_datetime", - "winnow", + "winnow 0.7.1", ] [[package]] @@ -4649,7 +4661,7 @@ checksum = "395ae124c09f9e6918a2310af6038fba074bcf474ac352496d5910dd59a2226d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] @@ -4720,7 +4732,7 @@ checksum = "f03ca4cb38206e2bef0700092660bb74d696f808514dae47fa1467cbfe26e96e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] @@ -4746,9 +4758,9 @@ checksum = "7eec5d1121208364f6793f7d2e222bf75a915c19557537745b195b253dd64217" [[package]] name = "unicode-ident" -version = "1.0.15" +version = "1.0.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11cd88e12b17c6494200a9c1b683a04fcac9573ed74cd1b62aeb2727c5592243" +checksum = "a210d160f08b701c8721ba1c726c11662f877ea6b7094007e1ca9a1041945034" [[package]] name = "unicode-normalization" @@ -4813,11 +4825,11 @@ checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" [[package]] name = "uuid" -version = "1.12.1" +version = "1.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3758f5e68192bb96cc8f9b7e2c2cfdabb435499a28499a42f8f984092adad4b" +checksum = "ced87ca4be083373936a67f8de945faa23b6b42384bd5b64434850802c6dccd0" dependencies = [ - "getrandom 0.2.15", + "getrandom 0.3.1", ] [[package]] @@ -4898,6 +4910,15 @@ version = "0.11.0+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" +[[package]] +name = "wasi" +version = "0.13.3+wasi-0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26816d2e1a4a36a2940b96c5296ce403917633dff8f3440e9b236ed6f6bacad2" +dependencies = [ + "wit-bindgen-rt", +] + [[package]] name = "wasm-bindgen" version = "0.2.100" @@ -4920,7 +4941,7 @@ dependencies = [ "log", "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.98", "wasm-bindgen-shared", ] @@ -4955,7 +4976,7 @@ checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.98", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -5010,9 +5031,9 @@ dependencies = [ [[package]] name = "webpki-roots" -version = "0.26.7" +version = "0.26.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d642ff16b7e79272ae451b7322067cdc17cadf68c23264be9d94a32319efe7e" +checksum = "2210b291f7ea53617fbafcc4939f10914214ec15aace5ba62293a668f322c5c9" dependencies = [ "rustls-pki-types", ] @@ -5256,13 +5277,31 @@ checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" [[package]] name = "winnow" -version = "0.6.24" +version = "0.6.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8d71a593cc5c42ad7876e2c1fda56f314f3754c084128833e64f1345ff8a03a" +checksum = "1e90edd2ac1aa278a5c4599b1d89cf03074b610800f866d4026dc199d7929a28" dependencies = [ "memchr", ] +[[package]] +name = "winnow" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "86e376c75f4f43f44db463cf729e0d3acbf954d13e22c51e26e4c264b4ab545f" +dependencies = [ + "memchr", +] + +[[package]] +name = "wit-bindgen-rt" +version = "0.33.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3268f3d866458b787f390cf61f4bbb563b922d091359f9608842999eaee3943c" +dependencies = [ + "bitflags 2.8.0", +] + [[package]] name = "write16" version = "1.0.0" @@ -5325,7 +5364,7 @@ checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.98", "synstructure", ] @@ -5347,7 +5386,7 @@ checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] @@ -5367,7 +5406,7 @@ checksum = "595eed982f7d355beb85837f651fa22e90b3c044842dc7f2c2842c086f295808" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.98", "synstructure", ] @@ -5388,7 +5427,7 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] @@ -5410,7 +5449,7 @@ checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index a09249b0..06368f95 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "hitdns" -version = "0.7.0" +version = "0.7.1" edition = "2021" description = "hitdns is a DNS forward server optimized for cache hit ratio and query latency." license = "GPL-3.0" diff --git a/scripts/duplicate-deps.txt b/scripts/duplicate-deps.txt index 527989b3..2a93c24e 100644 --- a/scripts/duplicate-deps.txt +++ b/scripts/duplicate-deps.txt @@ -1,5 +1,5 @@ [syn] = - 2.0.90 | 1.0.109 + 2.0.98 | 1.0.109 ================================================ [rand] = @@ -11,7 +11,11 @@ ================================================ [rustix] = - 0.37.27 | 0.38.42 + 0.37.28 | 0.38.44 +================================================ + +[winnow] = + 0.7.1 | 0.6.26 ================================================ [polling] = @@ -27,7 +31,7 @@ ================================================ [bitflags] = - 1.3.2 | 2.6.0 + 1.3.2 | 2.8.0 ================================================ [fastrand] = @@ -35,7 +39,7 @@ ================================================ [getrandom] = - 0.1.16 | 0.2.15 + 0.3.1 | 0.1.16 | 0.2.15 ================================================ [hashbrown] = @@ -47,19 +51,23 @@ ================================================ [thiserror] = - 2.0.8 | 1.0.69 + 1.0.69 | 2.0.11 ================================================ [async-lock] = 2.8.0 | 3.4.0 ================================================ +[smolscale2] = + 0.6.0 | 0.5.12 +================================================ + [rand_chacha] = 0.2.2 | 0.3.1 ================================================ [futures-lite] = - 2.5.0 | 1.13.0 + 2.6.0 | 1.13.0 ================================================ [async-channel] = @@ -67,14 +75,14 @@ ================================================ [linux-raw-sys] = - 0.3.8 | 0.4.14 + 0.3.8 | 0.4.15 ================================================ [event-listener] = - 2.5.3 | 5.3.1 + 2.5.3 | 5.4.0 ================================================ [thiserror-impl] = - 2.0.8 | 1.0.69 + 1.0.69 | 2.0.11 ================================================ diff --git a/src/api.rs b/src/api.rs index a3b00172..c1a35683 100644 --- a/src/api.rs +++ b/src/api.rs @@ -71,8 +71,8 @@ impl HitdnsAPI { let mut all_metrics = serde_json::Map::new(); for ds in daemon.context.cache.resolvers.list.iter() { let upstream = ds.dns_upstream(); - let mut metrics = ds.dns_metrics().await.to_json(); + let mut metrics = ds.dns_metrics().to_json(); { let obj = metrics.as_object_mut().unwrap(); obj.remove("upstream"); diff --git a/src/main.rs b/src/main.rs index 998b6ea7..dc460e77 100644 --- a/src/main.rs +++ b/src/main.rs @@ -80,9 +80,7 @@ pub mod dns { #[cfg(not(feature="doh3"))] pub use reqwest as reqwest_h3; -pub use portable_atomic::AtomicUsize; - -pub use smol::lock::RwLock; +pub use portable_atomic::{AtomicUsize, AtomicU64, AtomicU8, AtomicBool}; pub use bytes::Bytes; pub use serde::{Serialize, Deserialize}; @@ -364,17 +362,29 @@ pub fn randstr(len: usize) -> String { out } -pub fn average(set: &[T]) -> T +/// u128 nanoseconds version of [core::time::Duration::from_nanos](https://doc.rust-lang.org/1.84.1/src/core/time.rs.html#318-326) +pub const fn duration_from_nanos(nanos: u128) -> Duration { + const NANOS_PER_SEC: u128 = 1_000_000_000; + + let secs = (nanos / NANOS_PER_SEC) as u64; + let subsec_nanos = (nanos % NANOS_PER_SEC) as u32; + + Duration::new(secs, subsec_nanos) +} + +pub fn average(mut iter: impl Iterator, one: T) -> T where - T: Default + Copy + From + Add + Div + T: Default + Copy + Ord + Add + Div { - let len = set.len(); - if len > 0 { - let len: T = T::from(len as u64); - let mut sum: T = Default::default(); - for n in set.iter() { - sum = sum + *n; - } + let mut len: T = Default::default(); + let mut sum: T = Default::default(); + + while let Some(val) = iter.next() { + sum = sum + val; + len = len + one; + } + + if len > Default::default() { sum / len } else { Default::default() @@ -861,7 +871,7 @@ impl DNSDaemon { if opt.debug { let mut x = vec![]; for r in cache.resolvers.list.iter() { - x.push(r.dns_metrics().await); + x.push(r.dns_metrics()); } log::trace!( diff --git a/src/protocol/doh.rs b/src/protocol/doh.rs index 7b5a91f8..7e8e3334 100644 --- a/src/protocol/doh.rs +++ b/src/protocol/doh.rs @@ -250,7 +250,7 @@ pub(crate) static DOH3_ONLY: AtomicBool = AtomicBool::new(false); pub struct DNSOverHTTPS { client: ClientKind, url: reqwest_h3::Url, - metrics: Arc>, + metrics: Arc, _task: Arc>, } @@ -300,7 +300,7 @@ impl<'a> DNSOverHTTPS { client = ClientKind::H3(DOH3_CLIENT.clone()); } - let metrics = Arc::new(RwLock::new(DNSMetrics::from(&url))); + let metrics = Arc::new(DNSMetrics::from(&url)); let _task = Arc::new(smolscale2::spawn( Self::_metrics_task( @@ -321,7 +321,7 @@ impl<'a> DNSOverHTTPS { async fn _metrics_task( client: ClientKind, url: reqwest_h3::Url, - metrics: Arc>, + metrics: Arc, ) { let mut start; let mut latency; @@ -352,26 +352,21 @@ impl<'a> DNSOverHTTPS { .await; latency = start.elapsed(); - let metrics = metrics.clone(); - { - let mut m = metrics.write().await; - - if let Some(ret) = &maybe_ret { - if ret.is_ok() { - ret.log_trace(); - mult = 1.0; - log::debug!("DoH{v} server {} working. latency={latency:?}", &url); - m.up(latency); - } else { - mult *= 1.1; - log::warn!("DoH{v} server {} down. used time: {latency:?}, ret={ret:?}", &url); - m.down(); - } + if let Some(ref ret) = maybe_ret { + if ret.is_ok() { + ret.log_trace(); + mult = 1.0; + log::debug!("DoH{v} server {} working. latency={latency:?}", &url); + metrics.up(latency); } else { mult *= 1.1; - log::warn!("DoH{v} server {} not working! timed out.", &url); - m.down(); + log::warn!("DoH{v} server {} down. used time: {latency:?}, ret={ret:?}", &url); + metrics.down(); } + } else { + mult *= 1.1; + log::warn!("DoH{v} server {} not working! timed out.", &url); + metrics.down(); } } } @@ -386,26 +381,18 @@ impl<'a> DNSOverHTTPS { let latency = start.elapsed(); log::debug!("DoH{v} un-cached Result: (server={} latency={latency:?}) {result:?}", &self.url); - let ok = result.is_ok(); - - let metrics_lock = self.metrics.clone(); - smolscale2::spawn(async move { - let mut metrics = metrics_lock.write().await; - - if ok { - metrics.up(latency); - } else { - metrics.down(); - } - }).detach(); + if result.is_ok() { + self.metrics.up(latency); + } else { + self.metrics.down(); + } result } async fn _orig_dns_resolve(&self, query: &DNSQuery) -> anyhow::Result { let v = self.client.version(); - let req: dns::Message = - query.try_into().log_warn()?; + let req: dns::Message = query.try_into().log_warn()?; let client = self.client.clone(); let url = self.url.clone(); @@ -446,13 +433,9 @@ impl<'a> DNSOverHTTPS { } impl DNSResolver for DNSOverHTTPS { - fn dns_resolve( - &self, - query: &DNSQuery, - ) -> PinFut> { - let query = query.clone(); - Box::pin(async move { - self._dns_resolve(&query).await + fn dns_resolve<'a>(&'a self, query: &'a DNSQuery) -> PinFut<'a, anyhow::Result> { + Box::pin(async { + self._dns_resolve(query).await }) } @@ -470,9 +453,7 @@ impl DNSResolver for DNSOverHTTPS { } } - fn dns_metrics(&self) -> PinFut { - Box::pin(async move { - self.metrics.read().await.clone() - }) + fn dns_metrics(&self) -> Arc { + self.metrics.clone() } } diff --git a/src/traits.rs b/src/traits.rs index 541a58c4..1fc75e84 100644 --- a/src/traits.rs +++ b/src/traits.rs @@ -4,7 +4,7 @@ pub type PinFut<'a, T> = Pin + Send + 'a>>; pub trait DNSResolver: Send + Sync + 'static { /// un-cached DNS query - fn dns_resolve(&self, query: &DNSQuery) -> PinFut>; + fn dns_resolve<'a>(&'a self, query: &'a DNSQuery) -> PinFut<'a, anyhow::Result>; /// a description for upstream, usually URL or any other. fn dns_upstream(&self) -> String; @@ -13,7 +13,7 @@ pub trait DNSResolver: Send + Sync + 'static { fn dns_protocol(&self) -> &str; /// get analysis snapshot for this Upstream - fn dns_metrics(&self) -> PinFut; + fn dns_metrics(&self) -> Arc; } impl core::fmt::Debug for dyn DNSResolver { diff --git a/src/types.rs b/src/types.rs index b6428f01..6cf9d5aa 100644 --- a/src/types.rs +++ b/src/types.rs @@ -313,125 +313,118 @@ impl TryFrom<&DNSEntry> for dns::Message { } /* ========== DNS Metrics ========== */ -#[derive(Clone)] pub struct DNSMetrics { - latency: VecDeque, - reliability: u8, // 0% - 100% - online: bool, - last_respond: SystemTime, + latency: scc2::Queue, + reliability: AtomicU8, // 0% - 100% + online: AtomicBool, + last_respond: AtomicU64, upstream: String, } impl core::fmt::Debug for DNSMetrics { fn fmt(&self, f: &mut core::fmt::Formatter) -> Result<(), core::fmt::Error> { f.debug_struct("DNS-Metrics") - .field("latency", &self.latency()) - .field("reliability", &self.reliability) - .field("online", &self.online) - .field("last_respond", &self.last_respond) - .field("upstream", &self.upstream) - .finish() + .field("latency", &self.latency()) + .field("reliability", &self.reliability()) + .field("online", &self.online()) + .field("last_respond", &self.last_respond()) + .field("upstream", &self.upstream) + .finish() } } impl DNSMetrics { pub(crate) fn from(upstream: impl ToString) -> Self { Self { - latency: VecDeque::new(), - reliability: 50, - online: false, - last_respond: SystemTime::UNIX_EPOCH, + latency: Default::default(), + reliability: AtomicU8::new(50), + online: AtomicBool::new(false), + last_respond: AtomicU64::new(0), upstream: upstream.to_string(), } } pub fn to_json(&self) -> serde_json::Value { serde_json::json!({ - "latency": - self.latency() - .as_secs_f64() - .to_string(), - - "reliability": self.reliability, - "online": self.online, - - "last_respond": - self.last_respond - .duration_since(SystemTime::UNIX_EPOCH) - .unwrap_or(Duration::ZERO) - .as_secs_f64() - .to_string(), - - "upstream": self.upstream.clone(), + "latency": self.latency().as_secs_f64().to_string(), + "reliability": self.reliability(), + "online": self.online(), + "last_respond": self.last_respond(), + "upstream": &self.upstream, }) } /// record a server works normal (on DNS query success) - pub fn up(&mut self, elapsed: Duration) { - self.online = true; + pub fn up(&self, elapsed: Duration) { + self.online.store(true, Relaxed); + self._update_reliability(true); + self._add_latency(elapsed); - if self.reliability < 100 { - self.reliability += 1; + if let Ok(dur) = SystemTime::now().duration_since(SystemTime::UNIX_EPOCH) { + self.last_respond.store(dur.as_secs(), Relaxed); } - - self._add_latency(elapsed); - self.last_respond = SystemTime::now(); } /// record a server down (on DNS query fails) - pub fn down(&mut self) { - self.online = false; - - if self.reliability > 0 { - self.reliability -= 1; - } - + pub fn down(&self) { + self.online.store(false, Relaxed); + self._update_reliability(false); self._add_latency(Duration::from_secs(999)); } - fn _add_latency(&mut self, elapsed: Duration) { - self.latency.push_back(elapsed); + fn _update_reliability(&self, add: bool) { + let _ = self.reliability.fetch_update(Relaxed, Relaxed, |v| { + if add { + if v < 100 { + Some(v + 1) + } else { + None + } + } else { + if v > 0 { + Some(v - 1) + } else { + None + } + } + }); + } - while self.latency.len() > 100 { - self.latency.pop_front(); + fn _add_latency(&self, elapsed: Duration) { + self.latency.push(elapsed); + + while self.latency.len() > 10000 { + self.latency.pop(); } } /* == Getters == */ /// returns Average Latency pub fn latency(&self) -> Duration { - let nanos: Vec = - self.latency - .iter() - .map(|x| { x.as_nanos() }) - .collect(); - - let avg: u128 = average(&nanos); - - let avg: u64 = - if avg > (u64::MAX as u128) { - log::error!("latency great-than u64::MAX !!!"); - u64::MAX - } else { - avg as u64 - }; + let guard = scc2::ebr::Guard::new(); + + let avg: u128 = + average( + self.latency.iter(&guard).map(|x| { x.as_nanos() }), + 1u128 + ); - Duration::from_nanos(avg) + duration_from_nanos(avg) } pub fn reliability(&self) -> u8 { - self.reliability + self.reliability.load(Relaxed) } pub fn online(&self) -> bool { - self.online + self.online.load(Relaxed) } - pub fn last_respond(&self) -> SystemTime { - self.last_respond + pub fn last_respond(&self) -> u64 { + self.last_respond.load(Relaxed) } - pub fn upstream(&self) -> String { - self.upstream.clone() + pub fn upstream(&self) -> &str { + self.upstream.as_str() } } @@ -469,7 +462,7 @@ impl DNSResolverArray { let mut best = None; let mut best_metrics = None; for resolver in self.list.as_ref().iter() { - let my_metrics = resolver.dns_metrics().await; + let my_metrics = resolver.dns_metrics(); /* // ignore any offline resolvers