From aac9b1edb7b0951ac4c34b204c1b7f023c52881e Mon Sep 17 00:00:00 2001 From: houseme Date: Sat, 11 Oct 2025 09:08:25 +0800 Subject: [PATCH] chore: improve event and docker-compose ,Improve the permissions of the `endpoint` health interface, upgrade otel from 0.30.0 to 0.31.0 (#620) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat: improve code for notify * upgrade starshard version * upgrade version * Fix ETag format to comply with HTTP standards by wrapping with quotes (#592) * Initial plan * Fix ETag format to comply with HTTP standards by wrapping with quotes Co-authored-by: overtrue <1472352+overtrue@users.noreply.github.com> * bufigx --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: overtrue <1472352+overtrue@users.noreply.github.com> Co-authored-by: overtrue * Improve lock (#596) * improve lock Signed-off-by: Mu junxiang <1948535941@qq.com> * feat(tests): add wait_for_object_absence helper and improve lifecycle test reliability Signed-off-by: Mu junxiang <1948535941@qq.com> * chore: remove dirty docs Signed-off-by: Mu junxiang <1948535941@qq.com> --------- Signed-off-by: Mu junxiang <1948535941@qq.com> * feat(append): implement object append operations with state tracking (#599) * feat(append): implement object append operations with state tracking Signed-off-by: junxiang Mu <1948535941@qq.com> * chore: rebase Signed-off-by: junxiang Mu <1948535941@qq.com> --------- Signed-off-by: junxiang Mu <1948535941@qq.com> * build(deps): upgrade s3s (#595) Co-authored-by: loverustfs <155562731+loverustfs@users.noreply.github.com> * fix: validate mqtt broker * improve code for `import` * upgrade otel relation crates version * fix:dep("jsonwebtoken") feature = 'rust_crypto' * fix * fix * fix * upgrade version * improve code for ecfs * chore: improve event and docker-compose ,Improve the permissions of the `endpoint` health interface * fix * fix * fix * fix * improve code * fix --------- Signed-off-by: Mu junxiang <1948535941@qq.com> Signed-off-by: junxiang Mu <1948535941@qq.com> Co-authored-by: Copilot <198982749+Copilot@users.noreply.github.com> Co-authored-by: overtrue <1472352+overtrue@users.noreply.github.com> Co-authored-by: overtrue Co-authored-by: guojidan <63799833+guojidan@users.noreply.github.com> Co-authored-by: Nugine Co-authored-by: loverustfs <155562731+loverustfs@users.noreply.github.com> --- Cargo.lock | 965 ++++++++++++++--------- Cargo.toml | 38 +- crates/audit/src/global.rs | 4 +- crates/audit/src/system.rs | 12 +- crates/ecstore/Cargo.toml | 10 +- crates/iam/src/utils.rs | 4 +- crates/notify/Cargo.toml | 5 +- crates/notify/src/event.rs | 2 +- crates/notify/src/factory.rs | 2 +- crates/notify/src/integration.rs | 7 +- crates/notify/src/notifier.rs | 25 +- crates/notify/src/registry.rs | 2 +- crates/notify/src/rules/config.rs | 2 +- crates/notify/src/rules/pattern_rules.rs | 23 +- crates/notify/src/rules/rules_map.rs | 2 +- crates/notify/src/rules/target_id_set.rs | 2 +- crates/notify/src/rules/xml_config.rs | 2 +- crates/policy/src/error.rs | 2 +- crates/policy/src/utils.rs | 2 +- crates/targets/Cargo.toml | 2 +- crates/targets/src/check.rs | 70 ++ crates/targets/src/lib.rs | 2 + crates/targets/src/target/mqtt.rs | 8 +- crates/utils/Cargo.toml | 10 +- crates/utils/src/notify/mod.rs | 6 +- crates/utils/src/notify/net.rs | 533 +++++++++++++ deploy/data/dev/.gitkeep | 0 deploy/data/pro/.gitkeep | 0 docker-compose.yml | 19 +- rustfs/Cargo.toml | 1 + rustfs/src/admin/handlers/event.rs | 147 +--- rustfs/src/admin/mod.rs | 25 +- rustfs/src/admin/router.rs | 62 +- rustfs/src/server/audit.rs | 9 + rustfs/src/storage/ecfs.rs | 220 +++--- scripts/run.sh | 6 +- 36 files changed, 1458 insertions(+), 773 deletions(-) create mode 100644 crates/targets/src/check.rs create mode 100644 crates/utils/src/notify/net.rs create mode 100644 deploy/data/dev/.gitkeep create mode 100644 deploy/data/pro/.gitkeep diff --git a/Cargo.lock b/Cargo.lock index e65fc7c4..8ba0e6e6 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4,9 +4,9 @@ version = 4 [[package]] name = "addr2line" -version = "0.24.2" +version = "0.25.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" +checksum = "1b5d307320b3181d6d7954e663bd7c774a838b8220fe0593c86d9fb09f498b4b" dependencies = [ "gimli", ] @@ -122,9 +122,9 @@ checksum = "4b46cbb362ab8752921c97e041f5e366ee6297bd428a31275b9fcf1e380f7299" [[package]] name = "anstream" -version = "0.6.20" +version = "0.6.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ae563653d1938f79b1ab1b5e668c87c76a9930414574a6583a7b7e11a8e6192" +checksum = "43d5b281e737544384e969a5ccad3f1cdd24b48086a0fc1b2a5262a26b8f4f4a" dependencies = [ "anstyle", "anstyle-parse", @@ -137,9 +137,9 @@ dependencies = [ [[package]] name = "anstyle" -version = "1.0.11" +version = "1.0.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "862ed96ca487e809f1c8e5a8447f6ee2cf102f846893800b20cebdf541fc6bbd" +checksum = "5192cca8006f1fd4f7237516f40fa183bb07f8fbdfedaa0036de5ea9b0b45e78" [[package]] name = "anstyle-parse" @@ -549,9 +549,9 @@ checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" [[package]] name = "aws-config" -version = "1.8.6" +version = "1.8.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8bc1b40fb26027769f16960d2f4a6bc20c4bb755d403e552c8c1a73af433c246" +checksum = "37cf2b6af2a95a20e266782b4f76f1a5e12bf412a9db2de9c1e9123b9d8c0ad8" dependencies = [ "aws-credential-types", "aws-runtime", @@ -579,9 +579,9 @@ dependencies = [ [[package]] name = "aws-credential-types" -version = "1.2.6" +version = "1.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d025db5d9f52cbc413b167136afb3d8aeea708c0d8884783cf6253be5e22f6f2" +checksum = "faf26925f4a5b59eb76722b63c2892b1d70d06fa053c72e4a100ec308c1d47bc" dependencies = [ "aws-smithy-async", "aws-smithy-runtime-api", @@ -591,9 +591,9 @@ dependencies = [ [[package]] name = "aws-lc-rs" -version = "1.14.0" +version = "1.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94b8ff6c09cd57b16da53641caa860168b88c172a5ee163b0288d3d6eea12786" +checksum = "879b6c89592deb404ba4dc0ae6b58ffd1795c78991cbb5b8bc441c48a070440d" dependencies = [ "aws-lc-sys", "zeroize", @@ -601,22 +601,23 @@ dependencies = [ [[package]] name = "aws-lc-sys" -version = "0.31.0" +version = "0.32.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e44d16778acaf6a9ec9899b92cebd65580b83f685446bf2e1f5d3d732f99dcd" +checksum = "a2b715a6010afb9e457ca2b7c9d2b9c344baa8baed7b38dc476034c171b32575" dependencies = [ "bindgen", "cc", "cmake", "dunce", "fs_extra", + "libloading", ] [[package]] name = "aws-runtime" -version = "1.5.10" +version = "1.5.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c034a1bc1d70e16e7f4e4caf7e9f7693e4c9c24cd91cf17c2a0b21abaebc7c8b" +checksum = "bfa006bb32360ed90ac51203feafb9d02e3d21046e1fd3a450a404b90ea73e5d" dependencies = [ "aws-credential-types", "aws-sigv4", @@ -639,9 +640,9 @@ dependencies = [ [[package]] name = "aws-sdk-s3" -version = "1.106.0" +version = "1.108.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c230530df49ed3f2b7b4d9c8613b72a04cdac6452eede16d587fc62addfabac" +checksum = "200be4aed61e3c0669f7268bacb768f283f1c32a7014ce57225e1160be2f6ccb" dependencies = [ "aws-credential-types", "aws-runtime", @@ -673,9 +674,9 @@ dependencies = [ [[package]] name = "aws-sdk-sso" -version = "1.84.0" +version = "1.86.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "357a841807f6b52cb26123878b3326921e2a25faca412fabdd32bd35b7edd5d3" +checksum = "4a0abbfab841446cce6e87af853a3ba2cc1bc9afcd3f3550dd556c43d434c86d" dependencies = [ "aws-credential-types", "aws-runtime", @@ -695,9 +696,9 @@ dependencies = [ [[package]] name = "aws-sdk-ssooidc" -version = "1.86.0" +version = "1.88.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d1cc7fb324aa12eb4404210e6381195c5b5e9d52c2682384f295f38716dd3c7" +checksum = "9a68d675582afea0e94d38b6ca9c5aaae4ca14f1d36faa6edb19b42e687e70d7" dependencies = [ "aws-credential-types", "aws-runtime", @@ -717,9 +718,9 @@ dependencies = [ [[package]] name = "aws-sdk-sts" -version = "1.86.0" +version = "1.88.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7d835f123f307cafffca7b9027c14979f1d403b417d8541d67cf252e8a21e35" +checksum = "d30990923f4f675523c51eb1c0dec9b752fb267b36a61e83cbc219c9d86da715" dependencies = [ "aws-credential-types", "aws-runtime", @@ -740,9 +741,9 @@ dependencies = [ [[package]] name = "aws-sigv4" -version = "1.3.4" +version = "1.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "084c34162187d39e3740cb635acd73c4e3a551a36146ad6fe8883c929c9f876c" +checksum = "bffc03068fbb9c8dd5ce1c6fb240678a5cffb86fb2b7b1985c999c4b83c8df68" dependencies = [ "aws-credential-types", "aws-smithy-eventstream", @@ -756,7 +757,7 @@ dependencies = [ "hmac 0.12.1", "http 0.2.12", "http 1.3.1", - "p256", + "p256 0.11.1", "percent-encoding", "ring", "sha2 0.10.9", @@ -768,9 +769,9 @@ dependencies = [ [[package]] name = "aws-smithy-async" -version = "1.2.5" +version = "1.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e190749ea56f8c42bf15dd76c65e14f8f765233e6df9b0506d9d934ebef867c" +checksum = "127fcfad33b7dfc531141fda7e1c402ac65f88aca5511a4d31e2e3d2cd01ce9c" dependencies = [ "futures-util", "pin-project-lite", @@ -779,9 +780,9 @@ dependencies = [ [[package]] name = "aws-smithy-checksums" -version = "0.63.8" +version = "0.63.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56d2df0314b8e307995a3b86d44565dfe9de41f876901a7d71886c756a25979f" +checksum = "165d8583d8d906e2fb5511d29201d447cc710864f075debcdd9c31c265412806" dependencies = [ "aws-smithy-http", "aws-smithy-types", @@ -799,9 +800,9 @@ dependencies = [ [[package]] name = "aws-smithy-eventstream" -version = "0.60.11" +version = "0.60.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "182b03393e8c677347fb5705a04a9392695d47d20ef0a2f8cfe28c8e6b9b9778" +checksum = "9656b85088f8d9dc7ad40f9a6c7228e1e8447cdf4b046c87e152e0805dea02fa" dependencies = [ "aws-smithy-types", "bytes", @@ -810,9 +811,9 @@ dependencies = [ [[package]] name = "aws-smithy-http" -version = "0.62.3" +version = "0.62.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c4dacf2d38996cf729f55e7a762b30918229917eca115de45dfa8dfb97796c9" +checksum = "3feafd437c763db26aa04e0cc7591185d0961e64c61885bece0fb9d50ceac671" dependencies = [ "aws-smithy-eventstream", "aws-smithy-runtime-api", @@ -831,9 +832,9 @@ dependencies = [ [[package]] name = "aws-smithy-http-client" -version = "1.1.1" +version = "1.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "147e8eea63a40315d704b97bf9bc9b8c1402ae94f89d5ad6f7550d963309da1b" +checksum = "1053b5e587e6fa40ce5a79ea27957b04ba660baa02b28b7436f64850152234f1" dependencies = [ "aws-smithy-async", "aws-smithy-runtime-api", @@ -861,27 +862,27 @@ dependencies = [ [[package]] name = "aws-smithy-json" -version = "0.61.5" +version = "0.61.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eaa31b350998e703e9826b2104dd6f63be0508666e1aba88137af060e8944047" +checksum = "cff418fc8ec5cadf8173b10125f05c2e7e1d46771406187b2c878557d4503390" dependencies = [ "aws-smithy-types", ] [[package]] name = "aws-smithy-observability" -version = "0.1.3" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9364d5989ac4dd918e5cc4c4bdcc61c9be17dcd2586ea7f69e348fc7c6cab393" +checksum = "2d1881b1ea6d313f9890710d65c158bdab6fb08c91ea825f74c1c8c357baf4cc" dependencies = [ "aws-smithy-runtime-api", ] [[package]] name = "aws-smithy-query" -version = "0.60.7" +version = "0.60.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2fbd61ceb3fe8a1cb7352e42689cec5335833cd9f94103a61e98f9bb61c64bb" +checksum = "d28a63441360c477465f80c7abac3b9c4d075ca638f982e605b7dc2a2c7156c9" dependencies = [ "aws-smithy-types", "urlencoding", @@ -889,9 +890,9 @@ dependencies = [ [[package]] name = "aws-smithy-runtime" -version = "1.9.2" +version = "1.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fa63ad37685ceb7762fa4d73d06f1d5493feb88e3f27259b9ed277f4c01b185" +checksum = "40ab99739082da5347660c556689256438defae3bcefd66c52b095905730e404" dependencies = [ "aws-smithy-async", "aws-smithy-http", @@ -913,9 +914,9 @@ dependencies = [ [[package]] name = "aws-smithy-runtime-api" -version = "1.9.0" +version = "1.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07f5e0fc8a6b3f2303f331b94504bbf754d85488f402d6f1dd7a6080f99afe56" +checksum = "3683c5b152d2ad753607179ed71988e8cfd52964443b4f74fd8e552d0bbfeb46" dependencies = [ "aws-smithy-async", "aws-smithy-types", @@ -930,9 +931,9 @@ dependencies = [ [[package]] name = "aws-smithy-types" -version = "1.3.2" +version = "1.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d498595448e43de7f4296b7b7a18a8a02c61ec9349128c80a368f7c3b4ab11a8" +checksum = "9f5b3a7486f6690ba25952cabf1e7d75e34d69eaff5081904a47bc79074d6457" dependencies = [ "base64-simd", "bytes", @@ -956,18 +957,18 @@ dependencies = [ [[package]] name = "aws-smithy-xml" -version = "0.60.10" +version = "0.60.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3db87b96cb1b16c024980f133968d52882ca0daaee3a086c6decc500f6c99728" +checksum = "e9c34127e8c624bc2999f3b657e749c1393bedc9cd97b92a804db8ced4d2e163" dependencies = [ "xmlparser", ] [[package]] name = "aws-types" -version = "1.3.8" +version = "1.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b069d19bf01e46298eaedd7c6f283fe565a59263e53eebec945f3e6398f42390" +checksum = "e2fd329bf0e901ff3f60425691410c69094dc2a1f34b331f37bfc4e9ac1565a1" dependencies = [ "aws-credential-types", "aws-smithy-async", @@ -1075,9 +1076,9 @@ dependencies = [ [[package]] name = "backtrace" -version = "0.3.75" +version = "0.3.76" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6806a6321ec58106fea15becdad98371e28d92ccbc7c8f1b3b6dd724fe8f1002" +checksum = "bb531853791a215d7c62a30daf0dde835f381ab5de4589cfe7c649d2cbe92bd6" dependencies = [ "addr2line", "cfg-if", @@ -1085,7 +1086,7 @@ dependencies = [ "miniz_oxide", "object", "rustc-demangle", - "windows-targets 0.52.6", + "windows-link 0.2.1", ] [[package]] @@ -1094,6 +1095,12 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "349a06037c7bf932dd7e7d1f653678b2038b9ad46a74102f1fc7bd7872678cce" +[[package]] +name = "base16ct" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c7f02d4ea65f2c1853089ffd8d2787bdbc63de2f0d29dedbcf8ccdfa0ccd4cf" + [[package]] name = "base64" version = "0.21.7" @@ -1236,9 +1243,9 @@ checksum = "46c5e41b57b8bba42a04676d81cb89e9ee8e859a1a66f80a5a72e1cb76b34d43" [[package]] name = "bytemuck" -version = "1.23.2" +version = "1.24.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3995eaeebcdf32f91f980d360f78732ddc061097ab4e39991ae7a6ace9194677" +checksum = "1fbdf580320f38b612e485521afda1ee26d10cc9884efaaa750d383e13e3c5f4" [[package]] name = "byteorder" @@ -1310,9 +1317,9 @@ dependencies = [ [[package]] name = "camino" -version = "1.2.0" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1de8bc0aa9e9385ceb3bf0c152e3a9b9544f6c4a912c8ae504e80c1f0368603" +checksum = "276a59bf2b2c967788139340c9f0c5b12d7fd6630315c15c217e559de85d2609" dependencies = [ "serde_core", ] @@ -1365,9 +1372,9 @@ checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5" [[package]] name = "cc" -version = "1.2.38" +version = "1.2.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80f41ae168f955c12fb8960b057d70d0ca153fb83182b57d86380443527be7e9" +checksum = "e1d05d92f4b1fd76aad469d46cdd858ca761576082cd37df81416691e50199fb" dependencies = [ "find-msvc-tools", "jobserver", @@ -1431,7 +1438,7 @@ dependencies = [ "num-traits", "serde", "wasm-bindgen", - "windows-link 0.2.0", + "windows-link 0.2.1", ] [[package]] @@ -1622,9 +1629,9 @@ dependencies = [ [[package]] name = "const_format" -version = "0.2.34" +version = "0.2.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "126f97965c8ad46d6d9163268ff28432e8f6a1196a55578867832e3049df63dd" +checksum = "7faa7469a93a566e9ccc1c73fe783b4a65c274c5ace346038dca9c39fe0030ad" dependencies = [ "const_format_proc_macros", ] @@ -1860,8 +1867,10 @@ version = "0.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0dc92fb57ca44df6db8059111ab3af99a63d5d0f8375d9972e319a379c6bab76" dependencies = [ + "generic-array", "rand_core 0.6.4", "subtle", + "zeroize", ] [[package]] @@ -1914,6 +1923,33 @@ dependencies = [ "cipher", ] +[[package]] +name = "curve25519-dalek" +version = "4.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97fb8b7c4503de7d6ae7b42ab72a5a59857b4c937ec27a3d4539dba95b5ab2be" +dependencies = [ + "cfg-if", + "cpufeatures", + "curve25519-dalek-derive", + "digest 0.10.7", + "fiat-crypto", + "rustc_version", + "subtle", + "zeroize", +] + +[[package]] +name = "curve25519-dalek-derive" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.106", +] + [[package]] name = "darling" version = "0.14.4" @@ -2041,9 +2077,9 @@ checksum = "2a2330da5de22e8a3cb63252ce2abb30116bf5265e89c0e01bc17015ce30a476" [[package]] name = "datafusion" -version = "50.0.0" +version = "50.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "481d0c1cad7606cee11233abcdff8eec46e43dd25abda007db6d5d26ae8483c4" +checksum = "4016a135c11820d9c9884a1f7924d5456c563bd3657b7d691a6e7b937a452df7" dependencies = [ "arrow", "arrow-ipc", @@ -2096,9 +2132,9 @@ dependencies = [ [[package]] name = "datafusion-catalog" -version = "50.0.0" +version = "50.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d70327e81ab3a1f5832d8b372d55fa607851d7cea6d1f8e65ff0c98fcc32d222" +checksum = "1721d3973afeb8a0c3f235a79101cc61e4a558dd3f02fdc9ae6c61e882e544d9" dependencies = [ "arrow", "async-trait", @@ -2122,9 +2158,9 @@ dependencies = [ [[package]] name = "datafusion-catalog-listing" -version = "50.0.0" +version = "50.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "268819e6bb20ba70a664abddc20deac604f30d3267f8c91847064542a8c0720c" +checksum = "44841d3efb0c89c6a5ac6fde5ac61d4f2474a2767f170db6d97300a8b4df8904" dependencies = [ "arrow", "async-trait", @@ -2145,9 +2181,9 @@ dependencies = [ [[package]] name = "datafusion-common" -version = "50.0.0" +version = "50.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "054873d5563f115f83ef4270b560ac2ce4de713905e825a40cac49d6ff348254" +checksum = "eabb89b9d1ea8198d174b0838b91b40293b780261d694d6ac59bd20c38005115" dependencies = [ "ahash", "arrow", @@ -2170,9 +2206,9 @@ dependencies = [ [[package]] name = "datafusion-common-runtime" -version = "50.0.0" +version = "50.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8a1d1bc69aaaadb8008b65329ed890b33e845dc063225c190f77b20328fbe1d" +checksum = "f03fe3936f978fe8e76776d14ad8722e33843b01d81d11707ca72d54d2867787" dependencies = [ "futures", "log", @@ -2181,9 +2217,9 @@ dependencies = [ [[package]] name = "datafusion-datasource" -version = "50.0.0" +version = "50.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d855160469020982880fd9bd0962e033d2f4728f56f85a83d8c90785638b6519" +checksum = "4543216d2f4fc255780a46ae9e062e50c86ac23ecab6718cc1ba3fe4a8d5a8f2" dependencies = [ "arrow", "async-compression", @@ -2218,9 +2254,9 @@ dependencies = [ [[package]] name = "datafusion-datasource-csv" -version = "50.0.0" +version = "50.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ec3aa7575378d23aae96b955b5233bea6f9d461648174f6ccc8f3c160f2b7a7" +checksum = "8ab662d4692ca5929ce32eb609c6c8a741772537d98363b3efb3bc68148cd530" dependencies = [ "arrow", "async-trait", @@ -2243,9 +2279,9 @@ dependencies = [ [[package]] name = "datafusion-datasource-json" -version = "50.0.0" +version = "50.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00cfb8f33e2864eeb3188b6818acf5546d56a5a487d423cce9b684a554caabfa" +checksum = "7dad4492ba9a2fca417cb211f8f05ffeb7f12a1f0f8e5bdcf548c353ff923779" dependencies = [ "arrow", "async-trait", @@ -2268,9 +2304,9 @@ dependencies = [ [[package]] name = "datafusion-datasource-parquet" -version = "50.0.0" +version = "50.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab3bfb48fb4ff42ac1485a12ea56434eaab53f7da8f00b2443b1a3d35a0b6d10" +checksum = "2925432ce04847cc09b4789a53fc22b0fdf5f2e73289ad7432759d76c6026e9e" dependencies = [ "arrow", "async-trait", @@ -2301,15 +2337,15 @@ dependencies = [ [[package]] name = "datafusion-doc" -version = "50.0.0" +version = "50.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2fbf41013cf55c2369b5229594898e8108c8a1beeb49d97feb5e0cce9933eb8f" +checksum = "b71f8c2c0d5c57620003c3bf1ee577b738404a7fd9642f6cf73d10e44ffaa70f" [[package]] name = "datafusion-execution" -version = "50.0.0" +version = "50.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26fd0c1ffe3885687758f985ed548184bf63b17b2a7a5ae695de422ad6432118" +checksum = "aa51cf4d253927cb65690c05a18e7720cdda4c47c923b0dd7d641f7fcfe21b14" dependencies = [ "arrow", "async-trait", @@ -2327,9 +2363,9 @@ dependencies = [ [[package]] name = "datafusion-expr" -version = "50.0.0" +version = "50.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c4fe6411218a9dab656437b1e69b00a470a7a2d7db087867a366c145eb164a7" +checksum = "4a347435cfcd1de0498c8410d32e0b1fc3920e198ce0378f8e259da717af9e0f" dependencies = [ "arrow", "async-trait", @@ -2349,9 +2385,9 @@ dependencies = [ [[package]] name = "datafusion-expr-common" -version = "50.0.0" +version = "50.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a45bee7d2606bfb41ceb1d904ba7cecf69bd5a6f8f3e6c57c3f5a83d84bdd97" +checksum = "4e73951bdf1047d7af212bb11310407230b4067921df648781ae7f7f1241e87e" dependencies = [ "arrow", "datafusion-common", @@ -2362,9 +2398,9 @@ dependencies = [ [[package]] name = "datafusion-functions" -version = "50.0.0" +version = "50.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c7e1c532ff9d14f291160bca23e55ffd4899800301dd2389786c2f02d76904a" +checksum = "a3b181e79552d764a2589910d1e0420ef41b07ab97c3e3efdbce612b692141e7" dependencies = [ "arrow", "arrow-buffer", @@ -2391,9 +2427,9 @@ dependencies = [ [[package]] name = "datafusion-functions-aggregate" -version = "50.0.0" +version = "50.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b05d47426645aef1e73b1a034c75ab2401bc504175feb191accbe211ec24a342" +checksum = "b7e8cfb3b3f9e48e756939c85816b388264bed378d166a993fb265d800e1c83c" dependencies = [ "ahash", "arrow", @@ -2412,9 +2448,9 @@ dependencies = [ [[package]] name = "datafusion-functions-aggregate-common" -version = "50.0.0" +version = "50.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05c99f648b2b1743de0c1c19eef07e8cc5a085237f172b2e20bf6934e0a804e4" +checksum = "9501537e235e4e86828bc8bf4e22968c1514c2cb4c860b7c7cf7dc99e172d43c" dependencies = [ "ahash", "arrow", @@ -2425,9 +2461,9 @@ dependencies = [ [[package]] name = "datafusion-functions-nested" -version = "50.0.0" +version = "50.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4227782023f4fb68d3d5c5eb190665212f43c9a0b437553e4b938b379aff6cf6" +checksum = "6cbc3ecce122389530af091444e923f2f19153c38731893f5b798e19a46fbf86" dependencies = [ "arrow", "arrow-ord", @@ -2447,9 +2483,9 @@ dependencies = [ [[package]] name = "datafusion-functions-table" -version = "50.0.0" +version = "50.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d902b1769f69058236e89f04f3bff2cf62f24311adb7bf3c6c3e945c9451076" +checksum = "a8ad370763644d6626b15900fe2268e7d55c618fadf5cff3a7f717bb6fb50ec1" dependencies = [ "arrow", "async-trait", @@ -2463,9 +2499,9 @@ dependencies = [ [[package]] name = "datafusion-functions-window" -version = "50.0.0" +version = "50.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b8ee43974c92eb9920fe8e97e0fab48675e93b062abcb48bef4c1d4305b6ee4" +checksum = "44b14fc52c77461f359d1697826a4373c7887a6adfca94eedc81c35decd0df9f" dependencies = [ "arrow", "datafusion-common", @@ -2481,9 +2517,9 @@ dependencies = [ [[package]] name = "datafusion-functions-window-common" -version = "50.0.0" +version = "50.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1e149d36cdd44fb425dc815c5fac55025aa9a592dd65cb3c421881096292c02" +checksum = "851c80de71ff8bc9be7f8478f26e8060e25cab868a36190c4ebdaacc72ceade1" dependencies = [ "datafusion-common", "datafusion-physical-expr-common", @@ -2491,9 +2527,9 @@ dependencies = [ [[package]] name = "datafusion-macros" -version = "50.0.0" +version = "50.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07c9faa0cdefb6e6e756482b846397b5c2d84d369e30b009472b9ab9b1430fbd" +checksum = "386208ac4f475a099920cdbe9599188062276a09cb4c3f02efdc54e0c015ab14" dependencies = [ "datafusion-expr", "quote", @@ -2502,9 +2538,9 @@ dependencies = [ [[package]] name = "datafusion-optimizer" -version = "50.0.0" +version = "50.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f16a4f7059302ad1de6e97ab0eebb5c34405917b1f80806a30a66e38ad118251" +checksum = "b20ff1cec8c23fbab8523e2937790fb374b92d3b273306a64b7d8889ff3b8614" dependencies = [ "arrow", "chrono", @@ -2522,9 +2558,9 @@ dependencies = [ [[package]] name = "datafusion-physical-expr" -version = "50.0.0" +version = "50.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "10bb87a605d8ce9672d5347c0293c12211b0c03923fc12fbdc665fe76e6f9e01" +checksum = "945659046d27372e38e8a37927f0b887f50846202792063ad6b197c6eaf9fb5b" dependencies = [ "ahash", "arrow", @@ -2540,7 +2576,7 @@ dependencies = [ "log", "parking_lot", "paste", - "petgraph 0.8.2", + "petgraph 0.8.3", ] [[package]] @@ -2560,9 +2596,9 @@ dependencies = [ [[package]] name = "datafusion-physical-expr-common" -version = "50.0.0" +version = "50.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "845eb44ef1e04d2a15c6d955cb146b40a41814a7be4377f0a541857d3e257d6f" +checksum = "218d60e94d829d8a52bf50e694f2f567313508f0c684af4954def9f774ce3518" dependencies = [ "ahash", "arrow", @@ -2574,9 +2610,9 @@ dependencies = [ [[package]] name = "datafusion-physical-optimizer" -version = "50.0.0" +version = "50.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32b9b648ee2785722c79eae366528e52e93ece6808aef9297cf8e5521de381da" +checksum = "f96a93ebfd35cc52595e85c3100730a5baa6def39ff5390d6f90d2f3f89ce53f" dependencies = [ "arrow", "datafusion-common", @@ -2594,9 +2630,9 @@ dependencies = [ [[package]] name = "datafusion-physical-plan" -version = "50.0.0" +version = "50.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e6688d17b78104e169d7069749832c20ff50f112be853d2c058afe46c889064" +checksum = "3f6516a95911f763f05ec29bddd6fe987a0aa987409c213eac12faa5db7f3c9c" dependencies = [ "ahash", "arrow", @@ -2625,9 +2661,9 @@ dependencies = [ [[package]] name = "datafusion-pruning" -version = "50.0.0" +version = "50.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a893a46c56f5f190085e13949eb8ec163672c7ec2ac33bdb82c84572e71ca73" +checksum = "40befe63ab3bd9f3b05d02d13466055aa81876ad580247b10bdde1ba3782cebb" dependencies = [ "arrow", "arrow-schema", @@ -2643,9 +2679,9 @@ dependencies = [ [[package]] name = "datafusion-session" -version = "50.0.0" +version = "50.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8b62684c7a1db6121a8c83100209cffa1e664a8d9ced87e1a32f8cdc2fff3c2" +checksum = "26aa059f478e6fa31158e80e4685226490b39f67c2e357401e26da84914be8b2" dependencies = [ "arrow", "async-trait", @@ -2667,9 +2703,9 @@ dependencies = [ [[package]] name = "datafusion-sql" -version = "50.0.0" +version = "50.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f09cff94b8242843e1da5d069e9d2cfc53807f1f00b1c0da78c297f47c21456e" +checksum = "ea3ce7cb3c31bfc6162026f6f4b11eb5a3a83c8a6b88d8b9c529ddbe97d53525" dependencies = [ "arrow", "bigdecimal", @@ -2693,9 +2729,9 @@ dependencies = [ [[package]] name = "deflate64" -version = "0.1.9" +version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da692b8d1080ea3045efaab14434d40468c3d8657e42abddfffca87b428f4c1b" +checksum = "26bf8fc351c5ed29b5c2f0cbbac1b209b74f60ecd62e675a998df72c49af5204" [[package]] name = "der" @@ -2849,7 +2885,7 @@ dependencies = [ "libc", "option-ext", "redox_users", - "windows-sys 0.61.0", + "windows-sys 0.61.2", ] [[package]] @@ -2901,7 +2937,7 @@ dependencies = [ "serde_json", "serial_test", "tokio", - "tonic 0.14.2", + "tonic", "tracing", "tracing-subscriber", "url", @@ -2915,11 +2951,49 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "413301934810f597c1d19ca71c8710e99a3f1ba28a0d2ebc01551a2daeea3c5c" dependencies = [ "der 0.6.1", - "elliptic-curve", - "rfc6979", + "elliptic-curve 0.12.3", + "rfc6979 0.3.1", "signature 1.6.4", ] +[[package]] +name = "ecdsa" +version = "0.16.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee27f32b5c5292967d2d4a9d7f1e0b0aed2c15daded5a60300e4abb9d8020bca" +dependencies = [ + "der 0.7.10", + "digest 0.10.7", + "elliptic-curve 0.13.8", + "rfc6979 0.4.0", + "signature 2.2.0", + "spki 0.7.3", +] + +[[package]] +name = "ed25519" +version = "2.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "115531babc129696a58c64a4fef0a8bf9e9698629fb97e9e40767d235cfbcd53" +dependencies = [ + "pkcs8 0.10.2", + "signature 2.2.0", +] + +[[package]] +name = "ed25519-dalek" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70e796c081cee67dc755e1a36a0a172b897fab85fc3f6bc48307991f64e4eca9" +dependencies = [ + "curve25519-dalek", + "ed25519", + "serde", + "sha2 0.10.9", + "subtle", + "zeroize", +] + [[package]] name = "either" version = "1.15.0" @@ -2932,16 +3006,37 @@ version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e7bb888ab5300a19b8e5bceef25ac745ad065f3c9f7efc6de1b91958110891d3" dependencies = [ - "base16ct", + "base16ct 0.1.1", "crypto-bigint 0.4.9", "der 0.6.1", "digest 0.10.7", - "ff", + "ff 0.12.1", "generic-array", - "group", + "group 0.12.1", "pkcs8 0.9.0", "rand_core 0.6.4", - "sec1", + "sec1 0.3.0", + "subtle", + "zeroize", +] + +[[package]] +name = "elliptic-curve" +version = "0.13.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" +dependencies = [ + "base16ct 0.2.0", + "crypto-bigint 0.5.5", + "digest 0.10.7", + "ff 0.13.1", + "generic-array", + "group 0.13.0", + "hkdf", + "pem-rfc7468", + "pkcs8 0.10.2", + "rand_core 0.6.4", + "sec1 0.7.3", "subtle", "zeroize", ] @@ -3032,7 +3127,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" dependencies = [ "libc", - "windows-sys 0.61.0", + "windows-sys 0.61.2", ] [[package]] @@ -3072,6 +3167,22 @@ dependencies = [ "subtle", ] +[[package]] +name = "ff" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0b50bfb653653f9ca9095b427bed08ab8d75a137839d9ad64eb11810d5b6393" +dependencies = [ + "rand_core 0.6.4", + "subtle", +] + +[[package]] +name = "fiat-crypto" +version = "0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28dea519a9695b9977216879a3ebfddf92f1c08c05d984f8996aecd6ecdc811d" + [[package]] name = "filetime" version = "0.2.26" @@ -3086,9 +3197,9 @@ dependencies = [ [[package]] name = "find-msvc-tools" -version = "0.1.2" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ced73b1dacfc750a6db6c0a0c3a3853c8b41997e2e2c563dc90804ae6867959" +checksum = "0399f9d26e5191ce32c498bebd31e7a3ceabc2745f0ac54af3f335126c3f24b3" [[package]] name = "findshlibs" @@ -3126,9 +3237,9 @@ dependencies = [ [[package]] name = "flate2" -version = "1.1.2" +version = "1.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a3d7db9596fecd151c5f638c0ee5d5bd487b6e0ea232e5dc96d5250f6f94b1d" +checksum = "dc5a4e564e38c699f2880d3fda590bedc2e69f3f84cd48b457bd892ce61d0aa9" dependencies = [ "crc32fast", "libz-rs-sys", @@ -3137,9 +3248,9 @@ dependencies = [ [[package]] name = "flexi_logger" -version = "0.31.4" +version = "0.31.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff38b61724dd492b5171d5dbb0921dfc8e859022c5993b22f80f74e9afe6d573" +checksum = "31e5335674a3a259527f97e9176a3767dcc9b220b8e29d643daeb2d6c72caf8b" dependencies = [ "chrono", "crossbeam-channel", @@ -3180,6 +3291,12 @@ version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" +[[package]] +name = "foldhash" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77ce24cb58228fbb8aa041425bb1050850ac19177686ea6e0f41a70416f56fdb" + [[package]] name = "form_urlencoded" version = "1.2.2" @@ -3191,9 +3308,9 @@ dependencies = [ [[package]] name = "fs-err" -version = "3.1.2" +version = "3.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44f150ffc8782f35521cec2b23727707cb4045706ba3c854e86bef66b3a8cdbd" +checksum = "6ad492b2cf1d89d568a43508ab24f98501fe03f2f31c01e1d0fe7366a71745d2" dependencies = [ "autocfg", "tokio", @@ -3311,6 +3428,7 @@ checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" dependencies = [ "typenum", "version_check", + "zeroize", ] [[package]] @@ -3352,9 +3470,9 @@ dependencies = [ [[package]] name = "gimli" -version = "0.31.1" +version = "0.32.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" +checksum = "e629b9b98ef3dd8afe6ca2bd0f89306cec16d43d907889945bc5d6687f2f13c7" [[package]] name = "glob" @@ -3368,7 +3486,18 @@ version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5dfbfb3a6cfbd390d5c9564ab283a0349b9b9fcd46a706c1eb10e0db70bfbac7" dependencies = [ - "ff", + "ff 0.12.1", + "rand_core 0.6.4", + "subtle", +] + +[[package]] +name = "group" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" +dependencies = [ + "ff 0.13.1", "rand_core 0.6.4", "subtle", ] @@ -3413,13 +3542,14 @@ dependencies = [ [[package]] name = "half" -version = "2.6.0" +version = "2.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "459196ed295495a68f7d7fe1d84f6c4b7ff0e21fe3017b2f283c6fac3ad803c9" +checksum = "e54c115d4f30f52c67202f079c5f9d8b49db4691f460fdb0b4c2e838261b2ba5" dependencies = [ "cfg-if", "crunchy", "num-traits", + "zerocopy", ] [[package]] @@ -3440,7 +3570,7 @@ checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" dependencies = [ "allocator-api2", "equivalent", - "foldhash", + "foldhash 0.1.5", ] [[package]] @@ -3448,6 +3578,13 @@ name = "hashbrown" version = "0.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5419bdc4f6a9207fbeba6d11b604d481addf78ecd10c11ad51e76c2f6482748d" +dependencies = [ + "allocator-api2", + "equivalent", + "foldhash 0.2.0", + "rayon", + "serde", +] [[package]] name = "heck" @@ -3534,6 +3671,15 @@ version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9040319a6910b901d5d49cbada4a99db52836a1b63228a05f7e2b7f8feef89b1" +[[package]] +name = "hkdf" +version = "0.12.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b5f8eb2ad728638ea2c7d47a21db23b7b58a72ed6a38256b8a1849f15fbbdf7" +dependencies = [ + "hmac 0.12.1", +] + [[package]] name = "hmac" version = "0.12.1" @@ -3637,9 +3783,9 @@ checksum = "135b12329e5e3ce057a9f972339ea52bc954fe1e9358ef27f95e89716fbc5424" [[package]] name = "hybrid-array" -version = "0.4.3" +version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed7c10d9cd8b8e0733111482917f4f7e188cf6f57fc8eb0ff9b26a51db9fbd3c" +checksum = "f471e0a81b2f90ffc0cb2f951ae04da57de8baa46fa99112b062a5173a5088d0" dependencies = [ "typenum", ] @@ -3777,7 +3923,7 @@ dependencies = [ "js-sys", "log", "wasm-bindgen", - "windows-core 0.62.0", + "windows-core 0.62.2", ] [[package]] @@ -4072,9 +4218,9 @@ dependencies = [ [[package]] name = "js-sys" -version = "0.3.80" +version = "0.3.81" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "852f13bec5eba4ba9afbeb93fd7c13fe56147f055939ae21c43a29a0ecb2702e" +checksum = "ec48937a97411dcb524a265206ccd4c90bb711fca92b2792c407f268825b9305" dependencies = [ "once_cell", "wasm-bindgen", @@ -4082,16 +4228,24 @@ dependencies = [ [[package]] name = "jsonwebtoken" -version = "9.3.1" +version = "10.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a87cc7a48537badeae96744432de36f4be2b4a34a05a5ef32e9dd8a1c169dde" +checksum = "f1417155a38e99d7704ddb3ea7445fe57fdbd5d756d727740a9ed8b9ebaed6e1" dependencies = [ "base64 0.22.1", + "ed25519-dalek", + "getrandom 0.2.16", + "hmac 0.12.1", "js-sys", + "p256 0.13.2", + "p384", "pem", - "ring", + "rand 0.8.5", + "rsa", "serde", "serde_json", + "sha2 0.10.9", + "signature 2.2.0", "simple_asn1", ] @@ -4189,18 +4343,18 @@ checksum = "2c4a545a15244c7d945065b5d392b2d2d7f21526fba56ce51467b06ed445e8f7" [[package]] name = "libc" -version = "0.2.176" +version = "0.2.177" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "58f929b4d672ea937a23a1ab494143d968337a5f47e56d0815df1e0890ddf174" +checksum = "2874a2af47a2325c2001a6e6fad9b16a53b802102b528163885171cf92b15976" [[package]] name = "libloading" -version = "0.8.9" +version = "0.8.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7c4b02199fee7c5d21a5ae7d8cfa79a6ef5bb2fc834d6e9058e89c825efdc55" +checksum = "07033963ba89ebaf1584d767badaa2e8fcec21aedea6b8c0346d487d49c28667" dependencies = [ "cfg-if", - "windows-link 0.2.0", + "windows-targets 0.53.5", ] [[package]] @@ -4227,7 +4381,7 @@ checksum = "416f7e718bdb06000964960ffa43b4335ad4012ae8b99060261aa4a8088d5ccb" dependencies = [ "bitflags 2.9.4", "libc", - "redox_syscall 0.5.17", + "redox_syscall 0.5.18", ] [[package]] @@ -4301,11 +4455,10 @@ dependencies = [ [[package]] name = "lock_api" -version = "0.4.13" +version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96936507f153605bddfcda068dd804796c84324ed2510809e5b2a624c81da765" +checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965" dependencies = [ - "autocfg", "scopeguard", ] @@ -4482,6 +4635,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" dependencies = [ "adler2", + "simd-adler32", ] [[package]] @@ -4846,18 +5000,18 @@ dependencies = [ [[package]] name = "objc2-core-foundation" -version = "0.3.1" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c10c2894a6fed806ade6027bcd50662746363a9589d3ec9d9bef30a4e4bc166" +checksum = "2a180dd8642fa45cdb7dd721cd4c11b1cadd4929ce112ebd8b9f5803cc79d536" dependencies = [ "bitflags 2.9.4", ] [[package]] name = "objc2-io-kit" -version = "0.3.1" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "71c1c64d6120e51cd86033f67176b1cb66780c2efe34dec55176f77befd93c0a" +checksum = "33fafba39597d6dc1fb709123dfa8289d39406734be322956a69f0931c73bb15" dependencies = [ "libc", "objc2-core-foundation", @@ -4865,9 +5019,9 @@ dependencies = [ [[package]] name = "object" -version = "0.36.7" +version = "0.37.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" +checksum = "ff76201f031d8863c38aa7f905eca4f53abbfa15f609db4277d44cd8938f33fe" dependencies = [ "memchr", ] @@ -4932,9 +5086,9 @@ checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e" [[package]] name = "opentelemetry" -version = "0.30.0" +version = "0.31.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aaf416e4cb72756655126f7dd7bb0af49c674f4c1b9903e80c009e0c37e552e6" +checksum = "b84bcd6ae87133e903af7ef497404dda70c60d0ea14895fc8a5e6722754fc2a0" dependencies = [ "futures-core", "futures-sink", @@ -4946,9 +5100,9 @@ dependencies = [ [[package]] name = "opentelemetry-appender-tracing" -version = "0.30.1" +version = "0.31.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e68f63eca5fad47e570e00e893094fc17be959c80c79a7d6ec1abdd5ae6ffc16" +checksum = "ef6a1ac5ca3accf562b8c306fa8483c85f4390f768185ab775f242f7fe8fdcc2" dependencies = [ "opentelemetry", "tracing", @@ -4959,45 +5113,59 @@ dependencies = [ ] [[package]] -name = "opentelemetry-otlp" -version = "0.30.0" +name = "opentelemetry-http" +version = "0.31.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dbee664a43e07615731afc539ca60c6d9f1a9425e25ca09c57bc36c87c55852b" +checksum = "d7a6d09a73194e6b66df7c8f1b680f156d916a1a942abf2de06823dd02b7855d" +dependencies = [ + "async-trait", + "bytes", + "http 1.3.1", + "opentelemetry", +] + +[[package]] +name = "opentelemetry-otlp" +version = "0.31.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a2366db2dca4d2ad033cad11e6ee42844fd727007af5ad04a1730f4cb8163bf" dependencies = [ "http 1.3.1", "opentelemetry", + "opentelemetry-http", "opentelemetry-proto", "opentelemetry_sdk", - "prost 0.13.5", + "prost", "thiserror 2.0.17", "tokio", - "tonic 0.13.1", + "tonic", "tracing", ] [[package]] name = "opentelemetry-proto" -version = "0.30.0" +version = "0.31.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e046fd7660710fe5a05e8748e70d9058dc15c94ba914e7c4faa7c728f0e8ddc" +checksum = "a7175df06de5eaee9909d4805a3d07e28bb752c34cab57fa9cff549da596b30f" dependencies = [ "opentelemetry", "opentelemetry_sdk", - "prost 0.13.5", - "tonic 0.13.1", + "prost", + "tonic", + "tonic-prost", ] [[package]] name = "opentelemetry-semantic-conventions" -version = "0.30.0" +version = "0.31.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83d059a296a47436748557a353c5e6c5705b9470ef6c95cfc52c21a8814ddac2" +checksum = "e62e29dfe041afb8ed2a6c9737ab57db4907285d999ef8ad3a59092a36bdc846" [[package]] name = "opentelemetry-stdout" -version = "0.30.0" +version = "0.31.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "447191061af41c3943e082ea359ab8b64ff27d6d34d30d327df309ddef1eef6f" +checksum = "bc8887887e169414f637b18751487cce4e095be787d23fad13c454e2fb1b3811" dependencies = [ "chrono", "opentelemetry", @@ -5006,9 +5174,9 @@ dependencies = [ [[package]] name = "opentelemetry_sdk" -version = "0.30.0" +version = "0.31.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11f644aa9e5e31d11896e024305d7e3c98a88884d9f8919dbf37a9991bc47a4b" +checksum = "e14ae4f5991976fd48df6d843de219ca6d31b01daaab2dad5af2badeded372bd" dependencies = [ "futures-channel", "futures-executor", @@ -5016,7 +5184,6 @@ dependencies = [ "opentelemetry", "percent-encoding", "rand 0.9.2", - "serde_json", "thiserror 2.0.17", "tokio", "tokio-stream", @@ -5049,8 +5216,32 @@ version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "51f44edd08f51e2ade572f141051021c5af22677e42b7dd28a88155151c33594" dependencies = [ - "ecdsa", - "elliptic-curve", + "ecdsa 0.14.8", + "elliptic-curve 0.12.3", + "sha2 0.10.9", +] + +[[package]] +name = "p256" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9863ad85fa8f4460f9c48cb909d38a0d689dba1f6f6988a5e3e0d31071bcd4b" +dependencies = [ + "ecdsa 0.16.9", + "elliptic-curve 0.13.8", + "primeorder", + "sha2 0.10.9", +] + +[[package]] +name = "p384" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe42f1670a52a47d448f14b6a5c61dd78fce51856e68edaa38f7ae3a46b8d6b6" +dependencies = [ + "ecdsa 0.16.9", + "elliptic-curve 0.13.8", + "primeorder", "sha2 0.10.9", ] @@ -5062,9 +5253,9 @@ checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" [[package]] name = "parking_lot" -version = "0.12.4" +version = "0.12.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70d58bf43669b5795d1576d0641cfb6fbb2057bf629506267a92807158584a13" +checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a" dependencies = [ "lock_api", "parking_lot_core", @@ -5072,15 +5263,15 @@ dependencies = [ [[package]] name = "parking_lot_core" -version = "0.9.11" +version = "0.9.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc838d2a56b5b1a6c25f55575dfc605fabb63bb2365f6c2353ef9159aa69e4a5" +checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1" dependencies = [ "cfg-if", "libc", - "redox_syscall 0.5.17", + "redox_syscall 0.5.18", "smallvec", - "windows-targets 0.52.6", + "windows-link 0.2.1", ] [[package]] @@ -5208,9 +5399,9 @@ dependencies = [ [[package]] name = "petgraph" -version = "0.8.2" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54acf3a685220b533e437e264e4d932cfbdc4cc7ec0cd232ed73c08d03b8a7ca" +checksum = "8701b58ea97060d5e5b155d383a69952a60943f0e6dfe30b04c287beb0b27455" dependencies = [ "fixedbitset 0.5.7", "hashbrown 0.15.5", @@ -5436,6 +5627,15 @@ dependencies = [ "syn 2.0.106", ] +[[package]] +name = "primeorder" +version = "0.13.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "353e1ca18966c16d9deb1c69278edbc5f194139612772bd9537af60ac231e1e6" +dependencies = [ + "elliptic-curve 0.13.8", +] + [[package]] name = "proc-macro-crate" version = "3.4.0" @@ -5454,16 +5654,6 @@ dependencies = [ "unicode-ident", ] -[[package]] -name = "prost" -version = "0.13.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2796faa41db3ec313a31f7624d9286acf277b52de526150b7e69f3debf891ee5" -dependencies = [ - "bytes", - "prost-derive 0.13.5", -] - [[package]] name = "prost" version = "0.14.1" @@ -5471,7 +5661,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7231bd9b3d3d33c86b58adbac74b5ec0ad9f496b19d22801d773636feaa95f3d" dependencies = [ "bytes", - "prost-derive 0.14.1", + "prost-derive", ] [[package]] @@ -5487,7 +5677,7 @@ dependencies = [ "once_cell", "petgraph 0.7.1", "prettyplease", - "prost 0.14.1", + "prost", "prost-types", "pulldown-cmark", "pulldown-cmark-to-cmark", @@ -5496,19 +5686,6 @@ dependencies = [ "tempfile", ] -[[package]] -name = "prost-derive" -version = "0.13.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a56d757972c98b346a9b766e3f02746cde6dd1cd1d1d563472929fdd74bec4d" -dependencies = [ - "anyhow", - "itertools 0.14.0", - "proc-macro2", - "quote", - "syn 2.0.106", -] - [[package]] name = "prost-derive" version = "0.14.1" @@ -5528,7 +5705,7 @@ version = "0.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b9b4db3d6da204ed77bb26ba83b6122a73aeb2e87e25fbf7ad2e84c4ccbf8f72" dependencies = [ - "prost 0.14.1", + "prost", ] [[package]] @@ -5584,9 +5761,9 @@ dependencies = [ [[package]] name = "psm" -version = "0.1.26" +version = "0.1.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e944464ec8536cd1beb0bbfd96987eb5e3b72f2ecdafdc5c769a37f1fa2ae1f" +checksum = "e66fcd288453b748497d8fb18bccc83a16b0518e3906d4b8df0a8d42d93dbb1c" dependencies = [ "cc", ] @@ -5698,9 +5875,9 @@ dependencies = [ [[package]] name = "quote" -version = "1.0.40" +version = "1.0.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" +checksum = "ce25767e7b499d1b604768e7cde645d14cc8584231ea6b295e9c9eb22c02e1d1" dependencies = [ "proc-macro2", ] @@ -5717,6 +5894,7 @@ version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" dependencies = [ + "libc", "rand_chacha 0.3.1", "rand_core 0.6.4", ] @@ -5856,9 +6034,9 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.5.17" +version = "0.5.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5407465600fb0548f1442edf71dd20683c6ed326200ace4b1ef0763521bb3b77" +checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" dependencies = [ "bitflags 2.9.4", ] @@ -5886,18 +6064,18 @@ dependencies = [ [[package]] name = "ref-cast" -version = "1.0.24" +version = "1.0.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a0ae411dbe946a674d89546582cea4ba2bb8defac896622d6496f14c23ba5cf" +checksum = "f354300ae66f76f1c85c5f84693f0ce81d747e2c3f21a45fef496d89c960bf7d" dependencies = [ "ref-cast-impl", ] [[package]] name = "ref-cast-impl" -version = "1.0.24" +version = "1.0.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1165225c21bff1f3bbce98f5a1f889949bc902d3575308cc7b0de30b4f6d27c7" +checksum = "b7186006dcb21920990093f30e3dea63b7d6e977bf1256be20c3563a5db070da" dependencies = [ "proc-macro2", "quote", @@ -6001,6 +6179,16 @@ dependencies = [ "zeroize", ] +[[package]] +name = "rfc6979" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8dd2a808d456c4a54e300a23e9f5a67e122c3024119acbfd73e3bf664491cb2" +dependencies = [ + "hmac 0.12.1", + "subtle", +] + [[package]] name = "rgb" version = "0.8.52" @@ -6026,9 +6214,9 @@ dependencies = [ [[package]] name = "rmcp" -version = "0.6.4" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41ab0892f4938752b34ae47cb53910b1b0921e55e77ddb6e44df666cab17939f" +checksum = "6f35acda8f89fca5fd8c96cae3c6d5b4c38ea0072df4c8030915f3b5ff469c1c" dependencies = [ "base64 0.22.1", "chrono", @@ -6047,9 +6235,9 @@ dependencies = [ [[package]] name = "rmcp-macros" -version = "0.6.4" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1827cd98dab34cade0513243c6fe0351f0f0b2c9d6825460bcf45b42804bdda0" +checksum = "c9f1d5220aaa23b79c3d02e18f7a554403b3ccea544bbb6c69d6bcb3e854a274" dependencies = [ "darling 0.21.3", "proc-macro2", @@ -6196,6 +6384,7 @@ dependencies = [ "flatbuffers", "futures", "futures-util", + "hashbrown 0.16.0", "http 1.3.1", "http-body 1.0.1", "hyper 1.7.0", @@ -6249,7 +6438,7 @@ dependencies = [ "tokio-stream", "tokio-tar", "tokio-util", - "tonic 0.14.2", + "tonic", "tower", "tower-http", "tracing", @@ -6345,7 +6534,7 @@ dependencies = [ "s3s", "serde", "tokio", - "tonic 0.14.2", + "tonic", "uuid", ] @@ -6446,7 +6635,7 @@ dependencies = [ "tokio", "tokio-stream", "tokio-util", - "tonic 0.14.2", + "tonic", "tower", "tracing", "url", @@ -6547,7 +6736,7 @@ dependencies = [ "smartstring", "thiserror 2.0.17", "tokio", - "tonic 0.14.2", + "tonic", "tracing", "url", "uuid", @@ -6589,18 +6778,21 @@ dependencies = [ "async-trait", "axum", "chrono", - "dashmap", "form_urlencoded", "futures", + "hashbrown 0.16.0", "once_cell", "quick-xml 0.38.3", + "rayon", "rumqttc", + "rustc-hash", "rustfs-config", "rustfs-ecstore", "rustfs-targets", "rustfs-utils", "serde", "serde_json", + "starshard", "thiserror 2.0.17", "tokio", "tracing", @@ -6665,9 +6857,9 @@ name = "rustfs-protos" version = "0.0.5" dependencies = [ "flatbuffers", - "prost 0.14.1", + "prost", "rustfs-common", - "tonic 0.14.2", + "tonic", "tonic-prost", "tonic-prost-build", ] @@ -6808,11 +7000,13 @@ dependencies = [ "crc32fast", "flate2", "futures", + "hashbrown 0.16.0", "hex-simd", "hickory-resolver", "highway", "hmac 0.12.1", "hyper 1.7.0", + "libc", "local-ip-address", "lz4", "md-5", @@ -6917,7 +7111,7 @@ dependencies = [ "errno", "libc", "linux-raw-sys 0.11.0", - "windows-sys 0.61.0", + "windows-sys 0.61.2", ] [[package]] @@ -6943,7 +7137,7 @@ dependencies = [ "once_cell", "ring", "rustls-pki-types", - "rustls-webpki 0.103.6", + "rustls-webpki 0.103.7", "subtle", "zeroize", ] @@ -6969,7 +7163,7 @@ dependencies = [ "openssl-probe", "rustls-pki-types", "schannel", - "security-framework 3.5.0", + "security-framework 3.5.1", ] [[package]] @@ -7023,9 +7217,9 @@ dependencies = [ [[package]] name = "rustls-webpki" -version = "0.103.6" +version = "0.103.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8572f3c2cb9934231157b45499fc41e1f58c589fdfb81a844ba873265e80f8eb" +checksum = "e10b3f4191e8a80e6b43eebabfac91e5dcecebb27a71f04e820c47ec41d314bf" dependencies = [ "aws-lc-rs", "ring", @@ -7121,7 +7315,7 @@ version = "0.1.28" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "891d81b926048e76efe18581bf793546b4c0eaf8448d72be8de2bbee5fd166e1" dependencies = [ - "windows-sys 0.61.0", + "windows-sys 0.61.2", ] [[package]] @@ -7178,7 +7372,7 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3be24c1842290c45df0a7bf069e0c268a747ad05a192f2fd7dcfdbc1cba40928" dependencies = [ - "base16ct", + "base16ct 0.1.1", "der 0.6.1", "generic-array", "pkcs8 0.9.0", @@ -7186,6 +7380,20 @@ dependencies = [ "zeroize", ] +[[package]] +name = "sec1" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3e97a565f76233a6003f9f5c54be1d9c5bdfa3eccfb189469f11ec4901c47dc" +dependencies = [ + "base16ct 0.2.0", + "der 0.7.10", + "generic-array", + "pkcs8 0.10.2", + "subtle", + "zeroize", +] + [[package]] name = "security-framework" version = "2.11.1" @@ -7201,9 +7409,9 @@ dependencies = [ [[package]] name = "security-framework" -version = "3.5.0" +version = "3.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc198e42d9b7510827939c9a15f5062a0c913f3371d765977e586d2fe6c16f4a" +checksum = "b3297343eaf830f66ede390ea39da1d462b6b0c1b000f420d0a83f898bbbe6ef" dependencies = [ "bitflags 2.9.4", "core-foundation 0.10.1", @@ -7669,15 +7877,15 @@ dependencies = [ [[package]] name = "stable_deref_trait" -version = "1.2.0" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" +checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" [[package]] name = "stacker" -version = "0.1.21" +version = "0.1.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cddb07e32ddb770749da91081d8d0ac3a16f1a569a18b20348cd371f5dead06b" +checksum = "e1f8b29fb42aafcea4edeeb6b2f2d7ecd0d969c48b4cf0d2e64aafc471dd6e59" dependencies = [ "cc", "cfg-if", @@ -7686,6 +7894,19 @@ dependencies = [ "windows-sys 0.59.0", ] +[[package]] +name = "starshard" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "936738ae18fdc3ed76ab469988e8b78614b3e81d8063910e0868d2793d6c48c2" +dependencies = [ + "hashbrown 0.16.0", + "rayon", + "rustc-hash", + "serde", + "tokio", +] + [[package]] name = "static_assertions" version = "1.1.0" @@ -7768,15 +7989,15 @@ checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" [[package]] name = "sval" -version = "2.14.1" +version = "2.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7cc9739f56c5d0c44a5ed45473ec868af02eb896af8c05f616673a31e1d1bb09" +checksum = "d94c4464e595f0284970fd9c7e9013804d035d4a61ab74b113242c874c05814d" [[package]] name = "sval_buffer" -version = "2.14.1" +version = "2.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f39b07436a8c271b34dad5070c634d1d3d76d6776e938ee97b4a66a5e8003d0b" +checksum = "a0f46e34b20a39e6a2bf02b926983149b3af6609fd1ee8a6e63f6f340f3e2164" dependencies = [ "sval", "sval_ref", @@ -7784,18 +8005,18 @@ dependencies = [ [[package]] name = "sval_dynamic" -version = "2.14.1" +version = "2.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffcb072d857431bf885580dacecf05ed987bac931230736739a79051dbf3499b" +checksum = "03d0970e53c92ab5381d3b2db1828da8af945954d4234225f6dd9c3afbcef3f5" dependencies = [ "sval", ] [[package]] name = "sval_fmt" -version = "2.14.1" +version = "2.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f214f427ad94a553e5ca5514c95c6be84667cbc5568cce957f03f3477d03d5c" +checksum = "43e5e6e1613e1e7fc2e1a9fdd709622e54c122ceb067a60d170d75efd491a839" dependencies = [ "itoa", "ryu", @@ -7804,9 +8025,9 @@ dependencies = [ [[package]] name = "sval_json" -version = "2.14.1" +version = "2.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "389ed34b32e638dec9a99c8ac92d0aa1220d40041026b625474c2b6a4d6f4feb" +checksum = "aec382f7bfa6e367b23c9611f129b94eb7daaf3d8fae45a8d0a0211eb4d4c8e6" dependencies = [ "itoa", "ryu", @@ -7815,9 +8036,9 @@ dependencies = [ [[package]] name = "sval_nested" -version = "2.14.1" +version = "2.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14bae8fcb2f24fee2c42c1f19037707f7c9a29a0cda936d2188d48a961c4bb2a" +checksum = "3049d0f99ce6297f8f7d9953b35a0103b7584d8f638de40e64edb7105fa578ae" dependencies = [ "sval", "sval_buffer", @@ -7826,20 +8047,20 @@ dependencies = [ [[package]] name = "sval_ref" -version = "2.14.1" +version = "2.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a4eaea3821d3046dcba81d4b8489421da42961889902342691fb7eab491d79e" +checksum = "f88913e77506085c0a8bf6912bb6558591a960faf5317df6c1d9b227224ca6e1" dependencies = [ "sval", ] [[package]] name = "sval_serde" -version = "2.14.1" +version = "2.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "172dd4aa8cb3b45c8ac8f3b4111d644cd26938b0643ede8f93070812b87fb339" +checksum = "f579fd7254f4be6cd7b450034f856b78523404655848789c451bacc6aa8b387d" dependencies = [ - "serde", + "serde_core", "sval", "sval_nested", ] @@ -7937,9 +8158,9 @@ dependencies = [ [[package]] name = "sysinfo" -version = "0.37.1" +version = "0.37.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3bddd368fda2f82ead69c03d46d351987cfa0c2a57abfa37a017f3aa3e9bf69a" +checksum = "16607d5caffd1c07ce073528f9ed972d88db15dd44023fa57142963be3feb11f" dependencies = [ "libc", "memchr", @@ -7995,7 +8216,7 @@ dependencies = [ "getrandom 0.3.3", "once_cell", "rustix 1.1.2", - "windows-sys 0.61.0", + "windows-sys 0.61.2", ] [[package]] @@ -8363,33 +8584,6 @@ version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5d99f8c9a7727884afe522e9bd5edbfc91a3312b36a77b5fb8926e4c31a41801" -[[package]] -name = "tonic" -version = "0.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e581ba15a835f4d9ea06c55ab1bd4dce26fc53752c69a04aac00703bfb49ba9" -dependencies = [ - "async-trait", - "base64 0.22.1", - "bytes", - "flate2", - "http 1.3.1", - "http-body 1.0.1", - "http-body-util", - "hyper 1.7.0", - "hyper-timeout", - "hyper-util", - "percent-encoding", - "pin-project", - "prost 0.13.5", - "tokio", - "tokio-stream", - "tower", - "tower-layer", - "tower-service", - "tracing", -] - [[package]] name = "tonic" version = "0.14.2" @@ -8439,8 +8633,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "66bd50ad6ce1252d87ef024b3d64fe4c3cf54a86fb9ef4c631fdd0ded7aeaa67" dependencies = [ "bytes", - "prost 0.14.1", - "tonic 0.14.2", + "prost", + "tonic", ] [[package]] @@ -8570,15 +8764,16 @@ dependencies = [ [[package]] name = "tracing-opentelemetry" -version = "0.31.0" +version = "0.32.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ddcf5959f39507d0d04d6413119c04f33b623f4f951ebcbdddddfad2d0623a9c" +checksum = "1e6e5658463dd88089aba75c7791e1d3120633b1bfde22478b28f625a9bb1b8e" dependencies = [ "js-sys", - "once_cell", "opentelemetry", "opentelemetry_sdk", + "rustversion", "smallvec", + "thiserror 2.0.17", "tracing", "tracing-core", "tracing-log", @@ -8647,9 +8842,9 @@ checksum = "bc7d623258602320d5c55d1bc22793b57daff0ec7efc270ea7d55ce1d5f5471c" [[package]] name = "typenum" -version = "1.18.0" +version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f" +checksum = "562d481066bde0658276a35467c4af00bdc6ee726305698a55b86e61d7ad82bb" [[package]] name = "tz-rs" @@ -8697,9 +8892,9 @@ checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" [[package]] name = "unicode-width" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a1a07cc7db3810833284e8d372ccdc6da29741639ecc70c9ec107df0fa6154c" +checksum = "b4ac048d71ede7ee76d585517add45da530660ef4390e49b098733c6e897f254" [[package]] name = "unicode-xid" @@ -8903,9 +9098,9 @@ dependencies = [ [[package]] name = "wasm-bindgen" -version = "0.2.103" +version = "0.2.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab10a69fbd0a177f5f649ad4d8d3305499c42bab9aef2f7ff592d0ec8f833819" +checksum = "c1da10c01ae9f1ae40cbfac0bac3b1e724b320abfcf52229f80b547c0d250e2d" dependencies = [ "cfg-if", "once_cell", @@ -8916,9 +9111,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.103" +version = "0.2.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0bb702423545a6007bbc368fde243ba47ca275e549c8a28617f56f6ba53b1d1c" +checksum = "671c9a5a66f49d8a47345ab942e2cb93c7d1d0339065d4f8139c486121b43b19" dependencies = [ "bumpalo", "log", @@ -8930,9 +9125,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-futures" -version = "0.4.53" +version = "0.4.54" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0b221ff421256839509adbb55998214a70d829d3a28c69b4a6672e9d2a42f67" +checksum = "7e038d41e478cc73bae0ff9b36c60cff1c98b8f38f8d7e8061e79ee63608ac5c" dependencies = [ "cfg-if", "js-sys", @@ -8943,9 +9138,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.103" +version = "0.2.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc65f4f411d91494355917b605e1480033152658d71f722a90647f56a70c88a0" +checksum = "7ca60477e4c59f5f2986c50191cd972e3a50d8a95603bc9434501cf156a9a119" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -8953,9 +9148,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.103" +version = "0.2.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffc003a991398a8ee604a401e194b6b3a39677b3173d6e74495eb51b82e99a32" +checksum = "9f07d2f20d4da7b26400c9f4a0511e6e0345b040694e8a75bd41d578fa4421d7" dependencies = [ "proc-macro2", "quote", @@ -8966,9 +9161,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-shared" -version = "0.2.103" +version = "0.2.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "293c37f4efa430ca14db3721dfbe48d8c33308096bd44d80ebaa775ab71ba1cf" +checksum = "bad67dc8b2a1a6e5448428adec4c3e84c43e561d8c9ee8a9e5aabeb193ec41d1" dependencies = [ "unicode-ident", ] @@ -8988,9 +9183,9 @@ dependencies = [ [[package]] name = "web-sys" -version = "0.3.80" +version = "0.3.81" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fbe734895e869dc429d78c4b433f8d17d95f8d05317440b4fad5ab2d33e596dc" +checksum = "9367c417a924a74cae129e6a2ae3b47fabb1f8995595ab474029da749a8be120" dependencies = [ "js-sys", "wasm-bindgen", @@ -9008,9 +9203,9 @@ dependencies = [ [[package]] name = "webpki-roots" -version = "1.0.2" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e8983c3ab33d6fb807cfcdad2491c4ea8cbc8ed839181c7dfd9c67c83e261b2" +checksum = "32b130c0d2d49f8b6889abc456e795e82525204f27c42cf767cf0d7734e089b8" dependencies = [ "rustls-pki-types", ] @@ -9029,9 +9224,9 @@ dependencies = [ [[package]] name = "widestring" -version = "1.2.0" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd7cf3379ca1aac9eea11fba24fd7e315d621f8dfe35c8d7d2be8b793726e07d" +checksum = "72069c3113ab32ab29e5584db3c6ec55d416895e60715417b5b883a357c3e471" [[package]] name = "wildmatch" @@ -9064,7 +9259,7 @@ version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" dependencies = [ - "windows-sys 0.61.0", + "windows-sys 0.61.2", ] [[package]] @@ -9110,15 +9305,15 @@ dependencies = [ [[package]] name = "windows-core" -version = "0.62.0" +version = "0.62.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57fe7168f7de578d2d8a05b07fd61870d2e73b4020e9f49aa00da8471723497c" +checksum = "b8e83a14d34d0623b51dce9581199302a221863196a1dde71a7663a4c2be9deb" dependencies = [ "windows-implement", "windows-interface", - "windows-link 0.2.0", - "windows-result 0.4.0", - "windows-strings 0.5.0", + "windows-link 0.2.1", + "windows-result 0.4.1", + "windows-strings 0.5.1", ] [[package]] @@ -9134,9 +9329,9 @@ dependencies = [ [[package]] name = "windows-implement" -version = "0.60.0" +version = "0.60.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a47fddd13af08290e67f4acabf4b459f647552718f683a7b415d290ac744a836" +checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" dependencies = [ "proc-macro2", "quote", @@ -9145,9 +9340,9 @@ dependencies = [ [[package]] name = "windows-interface" -version = "0.59.1" +version = "0.59.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd9211b69f8dcdfa817bfd14bf1c97c9188afa36f4750130fcdf3f400eca9fa8" +checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" dependencies = [ "proc-macro2", "quote", @@ -9162,9 +9357,9 @@ checksum = "5e6ad25900d524eaabdbbb96d20b4311e1e7ae1699af4fb28c17ae66c80d798a" [[package]] name = "windows-link" -version = "0.2.0" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "45e46c0661abb7180e7b9c281db115305d49ca1709ab8242adf09666d2173c65" +checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" [[package]] name = "windows-numerics" @@ -9198,11 +9393,11 @@ dependencies = [ [[package]] name = "windows-result" -version = "0.4.0" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7084dcc306f89883455a206237404d3eaf961e5bd7e0f312f7c91f57eb44167f" +checksum = "7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5" dependencies = [ - "windows-link 0.2.0", + "windows-link 0.2.1", ] [[package]] @@ -9216,11 +9411,11 @@ dependencies = [ [[package]] name = "windows-strings" -version = "0.5.0" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7218c655a553b0bed4426cf54b20d7ba363ef543b52d515b3e48d7fd55318dda" +checksum = "7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091" dependencies = [ - "windows-link 0.2.0", + "windows-link 0.2.1", ] [[package]] @@ -9256,16 +9451,16 @@ version = "0.60.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" dependencies = [ - "windows-targets 0.53.3", + "windows-targets 0.53.5", ] [[package]] name = "windows-sys" -version = "0.61.0" +version = "0.61.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e201184e40b2ede64bc2ea34968b28e33622acdbbf37104f0e4a33f7abe657aa" +checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" dependencies = [ - "windows-link 0.2.0", + "windows-link 0.2.1", ] [[package]] @@ -9301,19 +9496,19 @@ dependencies = [ [[package]] name = "windows-targets" -version = "0.53.3" +version = "0.53.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d5fe6031c4041849d7c496a8ded650796e7b6ecc19df1a431c1a363342e5dc91" +checksum = "4945f9f551b88e0d65f3db0bc25c33b8acea4d9e41163edf90dcd0b19f9069f3" dependencies = [ - "windows-link 0.1.3", - "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", + "windows-link 0.2.1", + "windows_aarch64_gnullvm 0.53.1", + "windows_aarch64_msvc 0.53.1", + "windows_i686_gnu 0.53.1", + "windows_i686_gnullvm 0.53.1", + "windows_i686_msvc 0.53.1", + "windows_x86_64_gnu 0.53.1", + "windows_x86_64_gnullvm 0.53.1", + "windows_x86_64_msvc 0.53.1", ] [[package]] @@ -9339,9 +9534,9 @@ checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" [[package]] name = "windows_aarch64_gnullvm" -version = "0.53.0" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86b8d5f90ddd19cb4a147a5fa63ca848db3df085e25fee3cc10b39b6eebae764" +checksum = "a9d8416fa8b42f5c947f8482c43e7d89e73a173cead56d044f6a56104a6d1b53" [[package]] name = "windows_aarch64_msvc" @@ -9357,9 +9552,9 @@ checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" [[package]] name = "windows_aarch64_msvc" -version = "0.53.0" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7651a1f62a11b8cbd5e0d42526e55f2c99886c77e007179efff86c2b137e66c" +checksum = "b9d782e804c2f632e395708e99a94275910eb9100b2114651e04744e9b125006" [[package]] name = "windows_i686_gnu" @@ -9375,9 +9570,9 @@ checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" [[package]] name = "windows_i686_gnu" -version = "0.53.0" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1dc67659d35f387f5f6c479dc4e28f1d4bb90ddd1a5d3da2e5d97b42d6272c3" +checksum = "960e6da069d81e09becb0ca57a65220ddff016ff2d6af6a223cf372a506593a3" [[package]] name = "windows_i686_gnullvm" @@ -9387,9 +9582,9 @@ checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" [[package]] name = "windows_i686_gnullvm" -version = "0.53.0" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ce6ccbdedbf6d6354471319e781c0dfef054c81fbc7cf83f338a4296c0cae11" +checksum = "fa7359d10048f68ab8b09fa71c3daccfb0e9b559aed648a8f95469c27057180c" [[package]] name = "windows_i686_msvc" @@ -9405,9 +9600,9 @@ checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" [[package]] name = "windows_i686_msvc" -version = "0.53.0" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "581fee95406bb13382d2f65cd4a908ca7b1e4c2f1917f143ba16efe98a589b5d" +checksum = "1e7ac75179f18232fe9c285163565a57ef8d3c89254a30685b57d83a38d326c2" [[package]] name = "windows_x86_64_gnu" @@ -9423,9 +9618,9 @@ checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" [[package]] name = "windows_x86_64_gnu" -version = "0.53.0" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e55b5ac9ea33f2fc1716d1742db15574fd6fc8dadc51caab1c16a3d3b4190ba" +checksum = "9c3842cdd74a865a8066ab39c8a7a473c0778a3f29370b5fd6b4b9aa7df4a499" [[package]] name = "windows_x86_64_gnullvm" @@ -9441,9 +9636,9 @@ checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" [[package]] name = "windows_x86_64_gnullvm" -version = "0.53.0" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a6e035dd0599267ce1ee132e51c27dd29437f63325753051e71dd9e42406c57" +checksum = "0ffa179e2d07eee8ad8f57493436566c7cc30ac536a3379fdf008f47f6bb7ae1" [[package]] name = "windows_x86_64_msvc" @@ -9459,9 +9654,9 @@ checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" [[package]] name = "windows_x86_64_msvc" -version = "0.53.0" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "271414315aff87387382ec3d271b52d7ae78726f5d44ac98b4f4030c91880486" +checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650" [[package]] name = "winnow" diff --git a/Cargo.toml b/Cargo.toml index 599b2201..521217a4 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -99,7 +99,10 @@ async-recursion = "1.1.1" async-trait = "0.1.89" async-compression = { version = "0.4.19" } atomic_enum = "0.3.0" -aws-config = { version = "1.8.6" } +aws-config = { version = "1.8.8" } +aws-credential-types = { version = "1.2.8" } +aws-smithy-types = { version = "1.3.3" } +aws-smithy-runtime-api = { version = "1.9.1" } aws-sdk-s3 = { version = "1.106.0", default-features = false, features = ["sigv4a", "rustls", "rt-tokio"] } axum = "0.8.6" axum-extra = "0.10.3" @@ -111,6 +114,7 @@ bytes = { version = "1.10.1", features = ["serde"] } bytesize = "2.1.0" byteorder = "1.5.0" cfg-if = "1.0.3" +convert_case = "0.8.0" crc-fast = "1.3.0" chacha20poly1305 = { version = "0.10.1" } chrono = { version = "0.4.42", features = ["serde"] } @@ -119,18 +123,18 @@ const-str = { version = "0.7.0", features = ["std", "proc"] } crc32fast = "1.5.0" criterion = { version = "0.7", features = ["html_reports"] } crossbeam-queue = "0.3.12" -dashmap = "6.1.0" -datafusion = "50.0.0" +datafusion = "50.1.0" derive_builder = "0.20.2" enumset = "1.1.10" flatbuffers = "25.9.23" -flate2 = "1.1.2" -flexi_logger = { version = "0.31.4", features = ["trc", "dont_minimize_extra_stacks", "compress", "kv"] } +flate2 = "1.1.4" +flexi_logger = { version = "0.31.7", features = ["trc", "dont_minimize_extra_stacks", "compress", "kv"] } form_urlencoded = "1.2.2" futures = "0.3.31" futures-core = "0.3.31" futures-util = "0.3.31" glob = "0.3.3" +hashbrown = { version = "0.16.0", features = ["serde", "rayon"] } hex-simd = "0.8.0" highway = { version = "1.3.0" } hickory-resolver = { version = "0.25.2", features = ["tls-ring"] } @@ -146,8 +150,9 @@ http = "1.3.1" http-body = "1.0.1" humantime = "2.3.0" ipnetwork = { version = "0.21.1", features = ["serde"] } -jsonwebtoken = "9.3.1" +jsonwebtoken = { version = "10.0.0", features = ["rust_crypto"] } lazy_static = "1.5.0" +libc = "0.2.177" libsystemd = { version = "0.7.2" } local-ip-address = "0.6.5" lz4 = "1.28.1" @@ -163,21 +168,21 @@ num_cpus = { version = "1.17.0" } nvml-wrapper = "0.11.0" object_store = "0.12.4" once_cell = "1.21.3" -opentelemetry = { version = "0.30.0" } -opentelemetry-appender-tracing = { version = "0.30.1", features = [ +opentelemetry = { version = "0.31.0" } +opentelemetry-appender-tracing = { version = "0.31.1", features = [ "experimental_use_tracing_span_context", "experimental_metadata_attributes", "spec_unstable_logs_enabled" ] } -opentelemetry_sdk = { version = "0.30.0" } -opentelemetry-stdout = { version = "0.30.0" } -opentelemetry-otlp = { version = "0.30.0", default-features = false, features = [ +opentelemetry_sdk = { version = "0.31.0" } +opentelemetry-stdout = { version = "0.31.0" } +opentelemetry-otlp = { version = "0.31.0", default-features = false, features = [ "grpc-tonic", "gzip-tonic", "trace", "metrics", "logs", "internal-logs" ] } -opentelemetry-semantic-conventions = { version = "0.30.0", features = [ +opentelemetry-semantic-conventions = { version = "0.31.0", features = [ "semconv_experimental", ] } -parking_lot = "0.12.4" +parking_lot = "0.12.5" path-absolutize = "3.1.1" path-clean = "1.0.1" blake3 = { version = "1.8.2" } @@ -188,6 +193,7 @@ prost = "0.14.1" pretty_assertions = "1.4.1" quick-xml = "0.38.3" rand = "0.9.2" +rayon = "1.11.0" rdkafka = { version = "0.38.0", features = ["tokio"] } reed-solomon-simd = { version = "3.0.1" } regex = { version = "1.11.3" } @@ -200,12 +206,13 @@ reqwest = { version = "0.12.23", default-features = false, features = [ "json", "blocking", ] } -rmcp = { version = "0.6.4" } +rmcp = { version = "0.8.1" } rmp = "0.8.14" rmp-serde = "1.3.0" rsa = "0.9.8" rumqttc = { version = "0.25.0" } rust-embed = { version = "8.7.2" } +rustc-hash = { version = "2.1.1" } rustfs-rsc = "2025.506.1" rustls = { version = "0.23.32", features = ["ring", "logging", "std", "tls12"], default-features = false } rustls-pki-types = "1.12.0" @@ -225,6 +232,7 @@ smartstring = "1.0.1" snafu = "0.8.9" snap = "1.1.1" socket2 = "0.6.0" +starshard = { version = "0.5.0", features = ["rayon", "async", "serde"] } strum = { version = "0.27.2", features = ["derive"] } sysinfo = "0.37.1" sysctl = "0.7.1" @@ -253,7 +261,7 @@ tower-http = { version = "0.6.6", features = ["cors"] } tracing = "0.1.41" tracing-core = "0.1.34" tracing-error = "0.2.1" -tracing-opentelemetry = "0.31.0" +tracing-opentelemetry = "0.32.0" tracing-subscriber = { version = "0.3.20", features = ["env-filter", "time"] } transform-stream = "0.3.1" url = "2.5.7" diff --git a/crates/audit/src/global.rs b/crates/audit/src/global.rs index 0e53d476..4c458ca2 100644 --- a/crates/audit/src/global.rs +++ b/crates/audit/src/global.rs @@ -12,9 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -use crate::AuditEntry; -use crate::AuditResult; -use crate::AuditSystem; +use crate::{AuditEntry, AuditResult, AuditSystem}; use once_cell::sync::OnceCell; use rustfs_ecstore::config::Config; use std::sync::Arc; diff --git a/crates/audit/src/system.rs b/crates/audit/src/system.rs index 05b6b07c..4f0c4d61 100644 --- a/crates/audit/src/system.rs +++ b/crates/audit/src/system.rs @@ -17,9 +17,11 @@ use crate::AuditRegistry; use crate::observability; use crate::{AuditError, AuditResult}; use rustfs_ecstore::config::Config; -use rustfs_targets::store::{Key, Store}; -use rustfs_targets::target::EntityTarget; -use rustfs_targets::{StoreError, Target, TargetError}; +use rustfs_targets::{ + StoreError, Target, TargetError, + store::{Key, Store}, + target::EntityTarget, +}; use std::sync::Arc; use tokio::sync::{Mutex, RwLock}; use tracing::{error, info, warn}; @@ -257,7 +259,7 @@ impl AuditSystem { let target_id_clone = target_id.clone(); // Create EntityTarget for the audit log entry - let entity_target = rustfs_targets::target::EntityTarget { + let entity_target = EntityTarget { object_name: entry.api.name.clone().unwrap_or_default(), bucket_name: entry.api.bucket.clone().unwrap_or_default(), event_name: rustfs_targets::EventName::ObjectCreatedPut, // Default, should be derived from entry @@ -337,7 +339,7 @@ impl AuditSystem { let mut success_count = 0; let mut errors = Vec::new(); for entry in entries_clone { - let entity_target = rustfs_targets::target::EntityTarget { + let entity_target = EntityTarget { object_name: entry.api.name.clone().unwrap_or_default(), bucket_name: entry.api.bucket.clone().unwrap_or_default(), event_name: rustfs_targets::EventName::ObjectCreatedPut, diff --git a/crates/ecstore/Cargo.toml b/crates/ecstore/Cargo.toml index 974d6df2..0c436eb4 100644 --- a/crates/ecstore/Cargo.toml +++ b/crates/ecstore/Cargo.toml @@ -101,11 +101,11 @@ rustfs-signer.workspace = true rustfs-checksums.workspace = true futures-util.workspace = true async-recursion.workspace = true -aws-credential-types = "1.2.6" -aws-smithy-types = "1.3.2" -parking_lot = "0.12" -moka = { version = "0.12", features = ["future"] } -aws-smithy-runtime-api = "1.9.0" +aws-credential-types = { workspace = true } +aws-smithy-types = { workspace = true } +parking_lot = { workspace = true } +moka = { workspace = true } +aws-smithy-runtime-api = { workspace = true } [target.'cfg(not(windows))'.dependencies] nix = { workspace = true } diff --git a/crates/iam/src/utils.rs b/crates/iam/src/utils.rs index 14edd735..33d1640a 100644 --- a/crates/iam/src/utils.rs +++ b/crates/iam/src/utils.rs @@ -87,7 +87,7 @@ pub fn generate_jwt(claims: &T, secret: &str) -> std::result::Resu jsonwebtoken::encode(&header, &claims, &EncodingKey::from_secret(secret.as_bytes())) } -pub fn extract_claims( +pub fn extract_claims( token: &str, secret: &str, ) -> std::result::Result, jsonwebtoken::errors::Error> { @@ -193,7 +193,7 @@ mod tests { assert_eq!(error.to_string(), "secret key length is too short"); } - #[derive(Debug, Serialize, Deserialize, PartialEq)] + #[derive(Debug, Serialize, Deserialize, PartialEq, Clone)] struct Claims { sub: String, company: String, diff --git a/crates/notify/Cargo.toml b/crates/notify/Cargo.toml index 541ac861..5f2ca8ac 100644 --- a/crates/notify/Cargo.toml +++ b/crates/notify/Cargo.toml @@ -32,14 +32,17 @@ rustfs-utils = { workspace = true, features = ["path", "sys"] } rustfs-targets = { workspace = true } async-trait = { workspace = true } chrono = { workspace = true, features = ["serde"] } -dashmap = { workspace = true } futures = { workspace = true } form_urlencoded = { workspace = true } +hashbrown = { workspace = true } once_cell = { workspace = true } quick-xml = { workspace = true, features = ["serialize", "async-tokio"] } +rayon = { workspace = true } rumqttc = { workspace = true } +rustc-hash = { workspace = true } serde = { workspace = true } serde_json = { workspace = true } +starshard = { workspace = true } thiserror = { workspace = true } tokio = { workspace = true, features = ["rt-multi-thread", "sync", "time"] } tracing = { workspace = true } diff --git a/crates/notify/src/event.rs b/crates/notify/src/event.rs index 6bbda17c..786771f9 100644 --- a/crates/notify/src/event.rs +++ b/crates/notify/src/event.rs @@ -13,9 +13,9 @@ // limitations under the License. use chrono::{DateTime, Utc}; +use hashbrown::HashMap; use rustfs_targets::EventName; use serde::{Deserialize, Serialize}; -use std::collections::HashMap; use url::form_urlencoded; /// Represents the identity of the user who triggered the event diff --git a/crates/notify/src/factory.rs b/crates/notify/src/factory.rs index a5d06c8b..84cf1be6 100644 --- a/crates/notify/src/factory.rs +++ b/crates/notify/src/factory.rs @@ -14,6 +14,7 @@ use crate::Event; use async_trait::async_trait; +use hashbrown::HashSet; use rumqttc::QoS; use rustfs_config::notify::{ENV_NOTIFY_MQTT_KEYS, ENV_NOTIFY_WEBHOOK_KEYS, NOTIFY_MQTT_KEYS, NOTIFY_WEBHOOK_KEYS}; use rustfs_config::{ @@ -27,7 +28,6 @@ use rustfs_targets::{ error::TargetError, target::{mqtt::MQTTArgs, webhook::WebhookArgs}, }; -use std::collections::HashSet; use std::time::Duration; use tracing::{debug, warn}; use url::Url; diff --git a/crates/notify/src/integration.rs b/crates/notify/src/integration.rs index d03454d2..97d2c41e 100644 --- a/crates/notify/src/integration.rs +++ b/crates/notify/src/integration.rs @@ -15,13 +15,13 @@ use crate::{ Event, error::NotificationError, notifier::EventNotifier, registry::TargetRegistry, rules::BucketNotificationConfig, stream, }; +use hashbrown::HashMap; use rustfs_ecstore::config::{Config, KVS}; use rustfs_targets::EventName; use rustfs_targets::arn::TargetID; use rustfs_targets::store::{Key, Store}; use rustfs_targets::target::EntityTarget; use rustfs_targets::{StoreError, Target}; -use std::collections::HashMap; use std::sync::Arc; use std::sync::atomic::{AtomicUsize, Ordering}; use std::time::{Duration, Instant}; @@ -212,11 +212,6 @@ impl NotificationSystem { return Ok(()); } - // if let Err(e) = rustfs_ecstore::config::com::save_server_config(store, &new_config).await { - // error!("Failed to save config: {}", e); - // return Err(NotificationError::SaveConfig(e.to_string())); - // } - info!("Configuration updated. Reloading system..."); self.reload_config(new_config).await } diff --git a/crates/notify/src/notifier.rs b/crates/notify/src/notifier.rs index 8a266fa3..b570fd6f 100644 --- a/crates/notify/src/notifier.rs +++ b/crates/notify/src/notifier.rs @@ -13,19 +13,20 @@ // limitations under the License. use crate::{error::NotificationError, event::Event, rules::RulesMap}; -use dashmap::DashMap; +use hashbrown::HashMap; use rustfs_targets::EventName; use rustfs_targets::Target; use rustfs_targets::arn::TargetID; use rustfs_targets::target::EntityTarget; -use std::{collections::HashMap, sync::Arc}; +use starshard::AsyncShardedHashMap; +use std::sync::Arc; use tokio::sync::RwLock; use tracing::{debug, error, info, instrument, warn}; /// Manages event notification to targets based on rules pub struct EventNotifier { target_list: Arc>, - bucket_rules_map: Arc>, + bucket_rules_map: Arc>, } impl Default for EventNotifier { @@ -39,7 +40,7 @@ impl EventNotifier { pub fn new() -> Self { EventNotifier { target_list: Arc::new(RwLock::new(TargetList::new())), - bucket_rules_map: Arc::new(DashMap::new()), + bucket_rules_map: Arc::new(AsyncShardedHashMap::new(0)), } } @@ -58,7 +59,7 @@ impl EventNotifier { /// This method removes all rules associated with the specified bucket name. /// It will log a message indicating the removal of rules. pub async fn remove_rules_map(&self, bucket_name: &str) { - if self.bucket_rules_map.remove(bucket_name).is_some() { + if self.bucket_rules_map.remove(&bucket_name.to_string()).await.is_some() { info!("Removed all notification rules for bucket: {}", bucket_name); } } @@ -76,21 +77,21 @@ impl EventNotifier { /// Adds a rules map for a bucket pub async fn add_rules_map(&self, bucket_name: &str, rules_map: RulesMap) { if rules_map.is_empty() { - self.bucket_rules_map.remove(bucket_name); + self.bucket_rules_map.remove(&bucket_name.to_string()).await; } else { - self.bucket_rules_map.insert(bucket_name.to_string(), rules_map); + self.bucket_rules_map.insert(bucket_name.to_string(), rules_map).await; } info!("Added rules for bucket: {}", bucket_name); } /// Gets the rules map for a specific bucket. - pub fn get_rules_map(&self, bucket_name: &str) -> Option { - self.bucket_rules_map.get(bucket_name).map(|r| r.clone()) + pub async fn get_rules_map(&self, bucket_name: &str) -> Option { + self.bucket_rules_map.get(&bucket_name.to_string()).await } /// Removes notification rules for a bucket pub async fn remove_notification(&self, bucket_name: &str) { - self.bucket_rules_map.remove(bucket_name); + self.bucket_rules_map.remove(&bucket_name.to_string()).await; info!("Removed notification rules for bucket: {}", bucket_name); } @@ -113,7 +114,7 @@ impl EventNotifier { /// Return `true` if at least one matching notification rule exists. pub async fn has_subscriber(&self, bucket_name: &str, event_name: &EventName) -> bool { // Rules to check if the bucket exists - if let Some(rules_map) = self.bucket_rules_map.get(bucket_name) { + if let Some(rules_map) = self.bucket_rules_map.get(&bucket_name.to_string()).await { // A composite event (such as ObjectCreatedAll) is expanded to multiple single events. // We need to check whether any of these single events have the rules configured. rules_map.has_subscriber(event_name) @@ -129,7 +130,7 @@ impl EventNotifier { let bucket_name = &event.s3.bucket.name; let object_key = &event.s3.object.key; let event_name = event.event_name; - if let Some(rules) = self.bucket_rules_map.get(bucket_name) { + if let Some(rules) = self.bucket_rules_map.get(bucket_name).await { let target_ids = rules.match_rules(event_name, object_key); if target_ids.is_empty() { debug!("No matching targets for event in bucket: {}", bucket_name); diff --git a/crates/notify/src/registry.rs b/crates/notify/src/registry.rs index 8bbaaa89..9bb9cf03 100644 --- a/crates/notify/src/registry.rs +++ b/crates/notify/src/registry.rs @@ -15,13 +15,13 @@ use crate::Event; use crate::factory::{MQTTTargetFactory, TargetFactory, WebhookTargetFactory}; use futures::stream::{FuturesUnordered, StreamExt}; +use hashbrown::{HashMap, HashSet}; use rustfs_config::notify::NOTIFY_ROUTE_PREFIX; use rustfs_config::{DEFAULT_DELIMITER, ENABLE_KEY, ENV_PREFIX}; use rustfs_ecstore::config::{Config, KVS}; use rustfs_targets::Target; use rustfs_targets::TargetError; use rustfs_targets::target::ChannelTargetType; -use std::collections::{HashMap, HashSet}; use tracing::{debug, error, info, warn}; /// Registry for managing target factories diff --git a/crates/notify/src/rules/config.rs b/crates/notify/src/rules/config.rs index eda91472..5be48e8d 100644 --- a/crates/notify/src/rules/config.rs +++ b/crates/notify/src/rules/config.rs @@ -17,10 +17,10 @@ use super::xml_config::ParseConfigError as BucketNotificationConfigError; use crate::rules::NotificationConfiguration; use crate::rules::pattern_rules; use crate::rules::target_id_set; +use hashbrown::HashMap; use rustfs_targets::EventName; use rustfs_targets::arn::TargetID; use serde::{Deserialize, Serialize}; -use std::collections::HashMap; use std::io::Read; /// Configuration for bucket notifications. diff --git a/crates/notify/src/rules/pattern_rules.rs b/crates/notify/src/rules/pattern_rules.rs index ecc3dfaa..20b0fe93 100644 --- a/crates/notify/src/rules/pattern_rules.rs +++ b/crates/notify/src/rules/pattern_rules.rs @@ -14,9 +14,10 @@ use super::pattern; use super::target_id_set::TargetIdSet; +use hashbrown::HashMap; +use rayon::prelude::*; use rustfs_targets::arn::TargetID; use serde::{Deserialize, Serialize}; -use std::collections::HashMap; /// PatternRules - Event rule that maps object name patterns to TargetID collections. /// `event.Rules` (map[string]TargetIDSet) in the Go code @@ -43,13 +44,19 @@ impl PatternRules { /// Returns all TargetIDs that match the object name. pub fn match_targets(&self, object_name: &str) -> TargetIdSet { - let mut matched_targets = TargetIdSet::new(); - for (pattern_str, target_set) in &self.rules { - if pattern::match_simple(pattern_str, object_name) { - matched_targets.extend(target_set.iter().cloned()); - } - } - matched_targets + self.rules + .par_iter() + .filter_map(|(pattern_str, target_set)| { + if pattern::match_simple(pattern_str, object_name) { + Some(target_set.iter().cloned().collect::()) + } else { + None + } + }) + .reduce(TargetIdSet::new, |mut acc, set| { + acc.extend(set); + acc + }) } pub fn is_empty(&self) -> bool { diff --git a/crates/notify/src/rules/rules_map.rs b/crates/notify/src/rules/rules_map.rs index 02aae743..59bb9c6c 100644 --- a/crates/notify/src/rules/rules_map.rs +++ b/crates/notify/src/rules/rules_map.rs @@ -14,10 +14,10 @@ use super::pattern_rules::PatternRules; use super::target_id_set::TargetIdSet; +use hashbrown::HashMap; use rustfs_targets::EventName; use rustfs_targets::arn::TargetID; use serde::{Deserialize, Serialize}; -use std::collections::HashMap; /// RulesMap - Rule mapping organized by event name。 /// `event.RulesMap` (map[Name]Rules) in the corresponding Go code diff --git a/crates/notify/src/rules/target_id_set.rs b/crates/notify/src/rules/target_id_set.rs index 45f790dc..d5036975 100644 --- a/crates/notify/src/rules/target_id_set.rs +++ b/crates/notify/src/rules/target_id_set.rs @@ -12,8 +12,8 @@ // See the License for the specific language governing permissions and // limitations under the License. +use hashbrown::HashSet; use rustfs_targets::arn::TargetID; -use std::collections::HashSet; /// TargetIDSet - A collection representation of TargetID. pub type TargetIdSet = HashSet; diff --git a/crates/notify/src/rules/xml_config.rs b/crates/notify/src/rules/xml_config.rs index 518218ff..134f0db2 100644 --- a/crates/notify/src/rules/xml_config.rs +++ b/crates/notify/src/rules/xml_config.rs @@ -13,10 +13,10 @@ // limitations under the License. use super::pattern; +use hashbrown::HashSet; use rustfs_targets::EventName; use rustfs_targets::arn::{ARN, ArnError, TargetIDError}; use serde::{Deserialize, Serialize}; -use std::collections::HashSet; use std::io::Read; use thiserror::Error; diff --git a/crates/policy/src/error.rs b/crates/policy/src/error.rs index e9b39920..04c58a02 100644 --- a/crates/policy/src/error.rs +++ b/crates/policy/src/error.rs @@ -228,7 +228,7 @@ mod tests { use jsonwebtoken::{Algorithm, DecodingKey, Validation, decode}; use serde::{Deserialize, Serialize}; - #[derive(Debug, Serialize, Deserialize)] + #[derive(Debug, Serialize, Deserialize, Clone)] struct Claims { sub: String, exp: usize, diff --git a/crates/policy/src/utils.rs b/crates/policy/src/utils.rs index 103c7c50..6a1e7fff 100644 --- a/crates/policy/src/utils.rs +++ b/crates/policy/src/utils.rs @@ -59,7 +59,7 @@ pub fn generate_jwt(claims: &T, secret: &str) -> std::result::Resu jsonwebtoken::encode(&header, &claims, &EncodingKey::from_secret(secret.as_bytes())) } -pub fn extract_claims( +pub fn extract_claims( token: &str, secret: &str, ) -> std::result::Result, jsonwebtoken::errors::Error> { diff --git a/crates/targets/Cargo.toml b/crates/targets/Cargo.toml index f0ac418b..5d7bb63c 100644 --- a/crates/targets/Cargo.toml +++ b/crates/targets/Cargo.toml @@ -13,7 +13,7 @@ documentation = "https://docs.rs/rustfs-target/latest/rustfs_target/" [dependencies] rustfs-config = { workspace = true, features = ["notify", "constants", "audit"] } -rustfs-utils = { workspace = true, features = ["sys"] } +rustfs-utils = { workspace = true, features = ["sys", "notify"] } async-trait = { workspace = true } reqwest = { workspace = true } rumqttc = { workspace = true } diff --git a/crates/targets/src/check.rs b/crates/targets/src/check.rs new file mode 100644 index 00000000..cf2363d3 --- /dev/null +++ b/crates/targets/src/check.rs @@ -0,0 +1,70 @@ +// Copyright 2024 RustFS Team +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +/// Check if MQTT Broker is available +/// # Arguments +/// * `broker_url` - URL of MQTT Broker, for example `mqtt://localhost:1883` +/// * `topic` - Topic for testing connections +/// # Returns +/// * `Ok(())` - If the connection is successful +/// * `Err(String)` - If the connection fails, contains an error message +/// +/// # Example +/// ```rust,no_run +/// #[tokio::main] +/// async fn main() { +/// let result = rustfs_targets::check_mqtt_broker_available("mqtt://localhost:1883", "test/topic").await; +/// if result.is_ok() { +/// println!("MQTT Broker is available"); +/// } else { +/// println!("MQTT Broker is not available: {}", result.err().unwrap()); +/// } +/// } +/// ``` +/// # Note +/// Need to add `rumqttc` and `url` dependencies in `Cargo.toml` +/// ```toml +/// [dependencies] +/// rumqttc = "0.25.0" +/// url = "2.5.7" +/// tokio = { version = "1", features = ["full"] } +/// ``` +pub async fn check_mqtt_broker_available(broker_url: &str, topic: &str) -> Result<(), String> { + use rumqttc::{AsyncClient, MqttOptions, QoS}; + let url = rustfs_utils::parse_url(broker_url).map_err(|e| format!("Broker URL parsing failed:{e}"))?; + let url = url.url(); + + match url.scheme() { + "tcp" | "ssl" | "ws" | "wss" | "mqtt" | "mqtts" | "tls" | "tcps" => {} + _ => return Err("unsupported broker url scheme".to_string()), + } + + let host = url.host_str().ok_or("Broker is missing host")?; + let port = url.port().unwrap_or(1883); + let mut mqtt_options = MqttOptions::new("rustfs_check", host, port); + mqtt_options.set_keep_alive(std::time::Duration::from_secs(5)); + let (client, mut eventloop) = AsyncClient::new(mqtt_options, 1); + + // Try to connect and subscribe + client + .subscribe(topic, QoS::AtLeastOnce) + .await + .map_err(|e| format!("MQTT subscription failed:{e}"))?; + // Wait for eventloop to receive at least one event + match tokio::time::timeout(std::time::Duration::from_secs(3), eventloop.poll()).await { + Ok(Ok(_)) => Ok(()), + Ok(Err(e)) => Err(format!("MQTT connection failed:{e}")), + Err(_) => Err("MQTT connection timeout".to_string()), + } +} diff --git a/crates/targets/src/lib.rs b/crates/targets/src/lib.rs index a3e35160..aae0ac3e 100644 --- a/crates/targets/src/lib.rs +++ b/crates/targets/src/lib.rs @@ -13,11 +13,13 @@ // limitations under the License. pub mod arn; +mod check; pub mod error; mod event_name; pub mod store; pub mod target; +pub use check::check_mqtt_broker_available; pub use error::{StoreError, TargetError}; pub use event_name::EventName; use serde::{Deserialize, Serialize}; diff --git a/crates/targets/src/target/mqtt.rs b/crates/targets/src/target/mqtt.rs index d3dad907..45b73e5e 100644 --- a/crates/targets/src/target/mqtt.rs +++ b/crates/targets/src/target/mqtt.rs @@ -324,7 +324,7 @@ async fn run_mqtt_event_loop( Ok(Err(e)) => Err(e), Err(_) => { debug!(target_id = %target_id, "MQTT poll timed out (EVENT_LOOP_POLL_TIMEOUT) while not connected or status pending."); - Err(rumqttc::ConnectionError::NetworkTimeout) + Err(ConnectionError::NetworkTimeout) } } } else { @@ -376,7 +376,7 @@ async fn run_mqtt_event_loop( connected_status.store(false, Ordering::SeqCst); error!(target_id = %target_id, error = %e, "Error from MQTT event loop poll"); - if matches!(e, rumqttc::ConnectionError::NetworkTimeout) && (!initial_connection_established || !connected_status.load(Ordering::SeqCst)) { + if matches!(e, ConnectionError::NetworkTimeout) && (!initial_connection_established || !connected_status.load(Ordering::SeqCst)) { warn!(target_id = %target_id, "Timeout during initial poll or pending state, will retry."); continue; } @@ -395,8 +395,8 @@ async fn run_mqtt_event_loop( error!(target_id = %target_id, error = %e, "Fatal MQTT error, terminating event loop."); break; } - // rumqttc's eventloop.poll() may return Err and terminate after some errors, - // Or it will handle reconnection internally. The continue here will make select! wait again. + // rumqttc's eventloop.poll() may return Err and terminate after some errors, + // Or it will handle reconnection internally. To continue here will make select! wait again. // If the error is temporary and rumqttc is handling reconnection, poll() should eventually succeed or return a different error again. // Sleep briefly to avoid busy cycles in case of rapid failure. tokio::time::sleep(Duration::from_secs(1)).await; diff --git a/crates/utils/Cargo.toml b/crates/utils/Cargo.toml index 9c03dc54..bade90c4 100644 --- a/crates/utils/Cargo.toml +++ b/crates/utils/Cargo.toml @@ -32,11 +32,13 @@ bytes = { workspace = true, optional = true } crc32fast = { workspace = true } flate2 = { workspace = true, optional = true } futures = { workspace = true, optional = true } +hashbrown = { workspace = true, optional = true } hex-simd = { workspace = true, optional = true } highway = { workspace = true, optional = true } hickory-resolver = { workspace = true, optional = true } hmac = { workspace = true, optional = true } hyper = { workspace = true, optional = true } +libc = { workspace = true, optional = true } local-ip-address = { workspace = true, optional = true } lz4 = { workspace = true, optional = true } md-5 = { workspace = true, optional = true } @@ -53,7 +55,7 @@ s3s = { workspace = true, optional = true } serde = { workspace = true, optional = true } sha1 = { workspace = true, optional = true } sha2 = { workspace = true, optional = true } -convert_case = "0.8.0" +convert_case = { workspace = true, optional = true } siphasher = { workspace = true, optional = true } snap = { workspace = true, optional = true } sysinfo = { workspace = true, optional = true } @@ -83,7 +85,7 @@ tls = ["dep:rustls", "dep:rustls-pemfile", "dep:rustls-pki-types"] # tls charac net = ["ip", "dep:url", "dep:netif", "dep:futures", "dep:transform-stream", "dep:bytes", "dep:s3s", "dep:hyper", "dep:hickory-resolver", "dep:moka", "dep:thiserror", "dep:tokio"] # network features with DNS resolver io = ["dep:tokio"] path = [] -notify = ["dep:hyper", "dep:s3s"] # file system notification features +notify = ["dep:hyper", "dep:s3s", "dep:hashbrown", "dep:thiserror", "dep:serde", "dep:libc"] # file system notification features compress = ["dep:flate2", "dep:brotli", "dep:snap", "dep:lz4", "dep:zstd"] string = ["dep:regex", "dep:rand"] crypto = ["dep:base64-simd", "dep:hex-simd", "dep:hmac", "dep:hyper", "dep:sha1"] @@ -91,5 +93,5 @@ hash = ["dep:highway", "dep:md-5", "dep:sha2", "dep:blake3", "dep:serde", "dep:s os = ["dep:nix", "dep:tempfile", "winapi"] # operating system utilities integration = [] # integration test features sys = ["dep:sysinfo"] # system information features -http = [] -full = ["ip", "tls", "net", "io", "hash", "os", "integration", "path", "crypto", "string", "compress", "sys", "notify","http"] # all features +http = ["dep:convert_case"] +full = ["ip", "tls", "net", "io", "hash", "os", "integration", "path", "crypto", "string", "compress", "sys", "notify", "http"] # all features diff --git a/crates/utils/src/notify/mod.rs b/crates/utils/src/notify/mod.rs index f5a7dcb9..9b2029d5 100644 --- a/crates/utils/src/notify/mod.rs +++ b/crates/utils/src/notify/mod.rs @@ -12,9 +12,13 @@ // See the License for the specific language governing permissions and // limitations under the License. +mod net; + +use hashbrown::HashMap; use hyper::HeaderMap; use s3s::{S3Request, S3Response}; -use std::collections::HashMap; + +pub use net::*; /// Extract request parameters from S3Request, mainly header information. #[allow(dead_code)] diff --git a/crates/utils/src/notify/net.rs b/crates/utils/src/notify/net.rs new file mode 100644 index 00000000..32fcbac8 --- /dev/null +++ b/crates/utils/src/notify/net.rs @@ -0,0 +1,533 @@ +// Copyright 2024 RustFS Team +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +use regex::Regex; +use serde::{Deserialize, Serialize}; +use std::net::IpAddr; +use std::path::Path; +use std::sync::LazyLock; +use thiserror::Error; +use url::Url; + +// Lazy static for the host label regex. +static HOST_LABEL_REGEX: LazyLock = LazyLock::new(|| Regex::new(r"^[a-zA-Z0-9]([a-zA-Z0-9-]*[a-zA-Z0-9])?$").unwrap()); + +/// NetError represents errors that can occur in network operations. +#[derive(Error, Debug)] +pub enum NetError { + #[error("invalid argument")] + InvalidArgument, + #[error("invalid hostname")] + InvalidHost, + #[error("missing '[' in host")] + MissingBracket, + #[error("parse error: {0}")] + ParseError(String), + #[error("unexpected scheme: {0}")] + UnexpectedScheme(String), + #[error("scheme appears with empty host")] + SchemeWithEmptyHost, +} + +// Host represents a network host with IP/name and port. +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +pub struct Host { + pub name: String, + pub port: Option, // Using Option to represent if port is set, similar to IsPortSet. +} + +// Implementation of Host methods. +impl Host { + // is_empty returns true if the host name is empty. + pub fn is_empty(&self) -> bool { + self.name.is_empty() + } + + // equal checks if two hosts are equal by comparing their string representations. + pub fn equal(&self, other: &Host) -> bool { + self.to_string() == other.to_string() + } +} + +impl std::fmt::Display for Host { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + match self.port { + Some(p) => write!(f, "{}:{}", self.name, p), + None => write!(f, "{}", self.name), + } + } +} + +// parse_host parses a string into a Host, with validation similar to Go's ParseHost. +pub fn parse_host(s: &str) -> Result { + if s.is_empty() { + return Err(NetError::InvalidArgument); + } + + // is_valid_host validates the host string, checking for IP or hostname validity. + let is_valid_host = |host: &str| -> bool { + if host.is_empty() { + return true; + } + if host.parse::().is_ok() { + return true; + } + if !(1..=253).contains(&host.len()) { + return false; + } + for (i, label) in host.split('.').enumerate() { + if i + 1 == host.split('.').count() && label.is_empty() { + continue; + } + if !(1..=63).contains(&label.len()) || !HOST_LABEL_REGEX.is_match(label) { + return false; + } + } + true + }; + + // Split host and port, similar to net.SplitHostPort. + let (host_str, port_str) = s.rsplit_once(':').map_or((s, ""), |(h, p)| (h, p)); + let port = if !port_str.is_empty() { + Some(port_str.parse().map_err(|_| NetError::ParseError(port_str.to_string()))?) + } else { + None + }; + + // Trim IPv6 brackets if present. + let host = trim_ipv6(host_str)?; + + // Handle IPv6 zone identifier. + let trimmed_host = host.split('%').next().unwrap_or(&host); + + if !is_valid_host(trimmed_host) { + return Err(NetError::InvalidHost); + } + + Ok(Host { name: host, port }) +} + +// trim_ipv6 removes square brackets from IPv6 addresses, similar to Go's trimIPv6. +fn trim_ipv6(host: &str) -> Result { + if host.ends_with(']') { + if !host.starts_with('[') { + return Err(NetError::MissingBracket); + } + Ok(host[1..host.len() - 1].to_string()) + } else { + Ok(host.to_string()) + } +} + +// URL is a wrapper around url::Url for custom handling. +#[derive(Debug, Clone)] +pub struct ParsedURL(pub Url); + +impl ParsedURL { + /// is_empty returns true if the URL is empty or "about:blank". + pub fn is_empty(&self) -> bool { + self.0.as_str() == "" || (self.0.scheme() == "about" && self.0.path() == "blank") + } + + /// hostname returns the hostname of the URL. + pub fn hostname(&self) -> String { + self.0.host_str().unwrap_or("").to_string() + } + + /// port returns the port of the URL as a string, defaulting to "80" for http and "443" for https if not set. + pub fn port(&self) -> String { + match self.0.port() { + Some(p) => p.to_string(), + None => match self.0.scheme() { + "http" => "80".to_string(), + "https" => "443".to_string(), + _ => "".to_string(), + }, + } + } + + /// scheme returns the scheme of the URL. + pub fn scheme(&self) -> &str { + self.0.scheme() + } + + /// url returns a reference to the underlying Url. + pub fn url(&self) -> &Url { + &self.0 + } +} + +impl std::fmt::Display for ParsedURL { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + let mut url = self.0.clone(); + if let Some(host) = url.host_str().map(|h| h.to_string()) { + if let Some(port) = url.port() { + if (url.scheme() == "http" && port == 80) || (url.scheme() == "https" && port == 443) { + url.set_host(Some(&host)).unwrap(); + url.set_port(None).unwrap(); + } + } + } + let mut s = url.to_string(); + + // If the URL ends with a slash and the path is just "/", remove the trailing slash. + if s.ends_with('/') && url.path() == "/" { + s.pop(); + } + + write!(f, "{}", s) + } +} + +impl serde::Serialize for ParsedURL { + fn serialize(&self, serializer: S) -> Result + where + S: serde::Serializer, + { + serializer.serialize_str(&self.to_string()) + } +} + +impl<'de> serde::Deserialize<'de> for ParsedURL { + fn deserialize(deserializer: D) -> Result + where + D: serde::Deserializer<'de>, + { + let s: String = serde::Deserialize::deserialize(deserializer)?; + if s.is_empty() { + Ok(ParsedURL(Url::parse("about:blank").unwrap())) + } else { + parse_url(&s).map_err(serde::de::Error::custom) + } + } +} + +// parse_url parses a string into a ParsedURL, with host validation and path cleaning. +pub fn parse_url(s: &str) -> Result { + if let Some(scheme_end) = s.find("://") { + if s[scheme_end + 3..].starts_with('/') { + let scheme = &s[..scheme_end]; + if !scheme.is_empty() { + return Err(NetError::SchemeWithEmptyHost); + } + } + } + + let mut uu = Url::parse(s).map_err(|e| NetError::ParseError(e.to_string()))?; + if uu.host_str().is_none_or(|h| h.is_empty()) { + if uu.scheme() != "" { + return Err(NetError::SchemeWithEmptyHost); + } + } else { + let port_str = uu.port().map(|p| p.to_string()).unwrap_or_else(|| match uu.scheme() { + "http" => "80".to_string(), + "https" => "443".to_string(), + _ => "".to_string(), + }); + + if !port_str.is_empty() { + let host_port = format!("{}:{}", uu.host_str().unwrap(), port_str); + parse_host(&host_port)?; // Validate host. + } + } + + // Clean path: Use Url's path_segments to normalize. + if !uu.path().is_empty() { + // Url automatically cleans paths, but we ensure trailing slash if original had it. + let mut cleaned_path = String::new(); + for comp in Path::new(uu.path()).components() { + use std::path::Component; + match comp { + Component::RootDir => cleaned_path.push('/'), + Component::Normal(s) => { + if !cleaned_path.ends_with('/') { + cleaned_path.push('/'); + } + cleaned_path.push_str(&s.to_string_lossy()); + } + _ => {} + } + } + if s.ends_with('/') && !cleaned_path.ends_with('/') { + cleaned_path.push('/'); + } + if cleaned_path.is_empty() { + cleaned_path.push('/'); + } + uu.set_path(&cleaned_path); + } + + Ok(ParsedURL(uu)) +} + +#[allow(dead_code)] +/// parse_http_url parses a string into a ParsedURL, ensuring the scheme is http or https. +pub fn parse_http_url(s: &str) -> Result { + let u = parse_url(s)?; + match u.0.scheme() { + "http" | "https" => Ok(u), + _ => Err(NetError::UnexpectedScheme(u.0.scheme().to_string())), + } +} + +#[allow(dead_code)] +/// is_network_or_host_down checks if an error indicates network or host down, considering timeouts. +pub fn is_network_or_host_down(err: &std::io::Error, expect_timeouts: bool) -> bool { + if err.kind() == std::io::ErrorKind::TimedOut { + return !expect_timeouts; + } + // Simplified checks based on Go logic; adapt for Rust as needed + let err_str = err.to_string().to_lowercase(); + err_str.contains("connection reset by peer") + || err_str.contains("connection timed out") + || err_str.contains("broken pipe") + || err_str.contains("use of closed network connection") +} + +#[allow(dead_code)] +/// is_conn_reset_err checks if an error indicates a connection reset by peer. +pub fn is_conn_reset_err(err: &std::io::Error) -> bool { + err.to_string().contains("connection reset by peer") || matches!(err.raw_os_error(), Some(libc::ECONNRESET)) +} + +#[allow(dead_code)] +/// is_conn_refused_err checks if an error indicates a connection refused. +pub fn is_conn_refused_err(err: &std::io::Error) -> bool { + err.to_string().contains("connection refused") || matches!(err.raw_os_error(), Some(libc::ECONNREFUSED)) +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn parse_host_with_empty_string_returns_error() { + let result = parse_host(""); + assert!(matches!(result, Err(NetError::InvalidArgument))); + } + + #[test] + fn parse_host_with_valid_ipv4() { + let result = parse_host("192.168.1.1:8080"); + assert!(result.is_ok()); + let host = result.unwrap(); + assert_eq!(host.name, "192.168.1.1"); + assert_eq!(host.port, Some(8080)); + } + + #[test] + fn parse_host_with_valid_hostname() { + let result = parse_host("example.com:443"); + assert!(result.is_ok()); + let host = result.unwrap(); + assert_eq!(host.name, "example.com"); + assert_eq!(host.port, Some(443)); + } + + #[test] + fn parse_host_with_ipv6_brackets() { + let result = parse_host("[::1]:8080"); + assert!(result.is_ok()); + let host = result.unwrap(); + assert_eq!(host.name, "::1"); + assert_eq!(host.port, Some(8080)); + } + + #[test] + fn parse_host_with_invalid_ipv6_missing_bracket() { + let result = parse_host("::1]:8080"); + assert!(matches!(result, Err(NetError::MissingBracket))); + } + + #[test] + fn parse_host_with_invalid_hostname() { + let result = parse_host("invalid..host:80"); + assert!(matches!(result, Err(NetError::InvalidHost))); + } + + #[test] + fn parse_host_without_port() { + let result = parse_host("example.com"); + assert!(result.is_ok()); + let host = result.unwrap(); + assert_eq!(host.name, "example.com"); + assert_eq!(host.port, None); + } + + #[test] + fn host_is_empty_when_name_is_empty() { + let host = Host { + name: "".to_string(), + port: None, + }; + assert!(host.is_empty()); + } + + #[test] + fn host_is_not_empty_when_name_present() { + let host = Host { + name: "example.com".to_string(), + port: Some(80), + }; + assert!(!host.is_empty()); + } + + #[test] + fn host_to_string_with_port() { + let host = Host { + name: "example.com".to_string(), + port: Some(80), + }; + assert_eq!(host.to_string(), "example.com:80"); + } + + #[test] + fn host_to_string_without_port() { + let host = Host { + name: "example.com".to_string(), + port: None, + }; + assert_eq!(host.to_string(), "example.com"); + } + + #[test] + fn host_equal_when_same() { + let host1 = Host { + name: "example.com".to_string(), + port: Some(80), + }; + let host2 = Host { + name: "example.com".to_string(), + port: Some(80), + }; + assert!(host1.equal(&host2)); + } + + #[test] + fn host_not_equal_when_different() { + let host1 = Host { + name: "example.com".to_string(), + port: Some(80), + }; + let host2 = Host { + name: "example.com".to_string(), + port: Some(443), + }; + assert!(!host1.equal(&host2)); + } + + #[test] + fn parse_url_with_valid_http_url() { + let result = parse_url("http://example.com/path"); + assert!(result.is_ok()); + let parsed = result.unwrap(); + assert_eq!(parsed.hostname(), "example.com"); + assert_eq!(parsed.port(), "80"); + } + + #[test] + fn parse_url_with_valid_https_url() { + let result = parse_url("https://example.com:443/path"); + assert!(result.is_ok()); + let parsed = result.unwrap(); + assert_eq!(parsed.hostname(), "example.com"); + assert_eq!(parsed.port(), "443"); + } + + #[test] + fn parse_url_with_scheme_but_empty_host() { + let result = parse_url("http:///path"); + assert!(matches!(result, Err(NetError::SchemeWithEmptyHost))); + } + + #[test] + fn parse_url_with_invalid_host() { + let result = parse_url("http://invalid..host/path"); + assert!(matches!(result, Err(NetError::InvalidHost))); + } + + #[test] + fn parse_url_with_path_cleaning() { + let result = parse_url("http://example.com//path/../path/"); + assert!(result.is_ok()); + let parsed = result.unwrap(); + assert_eq!(parsed.0.path(), "/path/"); + } + + #[test] + fn parse_http_url_with_http_scheme() { + let result = parse_http_url("http://example.com"); + assert!(result.is_ok()); + } + + #[test] + fn parse_http_url_with_https_scheme() { + let result = parse_http_url("https://example.com"); + assert!(result.is_ok()); + } + + #[test] + fn parse_http_url_with_invalid_scheme() { + let result = parse_http_url("ftp://example.com"); + assert!(matches!(result, Err(NetError::UnexpectedScheme(_)))); + } + + #[test] + fn parsed_url_is_empty_when_url_is_empty() { + let url = ParsedURL(Url::parse("about:blank").unwrap()); + assert!(url.is_empty()); + } + + #[test] + fn parsed_url_hostname() { + let url = ParsedURL(Url::parse("http://example.com:8080").unwrap()); + assert_eq!(url.hostname(), "example.com"); + } + + #[test] + fn parsed_url_port() { + let url = ParsedURL(Url::parse("http://example.com:8080").unwrap()); + assert_eq!(url.port(), "8080"); + } + + #[test] + fn parsed_url_to_string_removes_default_ports() { + let url = ParsedURL(Url::parse("http://example.com:80").unwrap()); + assert_eq!(url.to_string(), "http://example.com"); + } + + #[test] + fn is_network_or_host_down_with_timeout() { + let err = std::io::Error::new(std::io::ErrorKind::TimedOut, "timeout"); + assert!(is_network_or_host_down(&err, false)); + } + + #[test] + fn is_network_or_host_down_with_expected_timeout() { + let err = std::io::Error::new(std::io::ErrorKind::TimedOut, "timeout"); + assert!(!is_network_or_host_down(&err, true)); + } + + #[test] + fn is_conn_reset_err_with_reset_message() { + let err = std::io::Error::other("connection reset by peer"); + assert!(is_conn_reset_err(&err)); + } + + #[test] + fn is_conn_refused_err_with_refused_message() { + let err = std::io::Error::other("connection refused"); + assert!(is_conn_refused_err(&err)); + } +} diff --git a/deploy/data/dev/.gitkeep b/deploy/data/dev/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/deploy/data/pro/.gitkeep b/deploy/data/pro/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/docker-compose.yml b/docker-compose.yml index e3f863c7..2ccf80a5 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -30,7 +30,7 @@ services: - "9000:9000" # S3 API port - "9001:9001" # Console port environment: - - RUSTFS_VOLUMES=/data/rustfs0,/data/rustfs1,/data/rustfs2,/data/rustfs3 + - RUSTFS_VOLUMES=/data/rustfs{0..3} # Define 4 storage volumes - RUSTFS_ADDRESS=0.0.0.0:9000 - RUSTFS_CONSOLE_ADDRESS=0.0.0.0:9001 - RUSTFS_CONSOLE_ENABLE=true @@ -43,12 +43,9 @@ services: - RUSTFS_TLS_PATH=/opt/tls - RUSTFS_OBS_ENDPOINT=http://otel-collector:4317 volumes: - - rustfs_data_0:/data/rustfs0 - - rustfs_data_1:/data/rustfs1 - - rustfs_data_2:/data/rustfs2 - - rustfs_data_3:/data/rustfs3 - - logs_data:/app/logs - - .docker/tls/:/opt/tls # TLS configuration, you should create tls directory and put your tls files in it and then specify the path here + - deploy/data/pro:/data + - deploy/logs:/app/logs + - deploy/data/certs/:/opt/tls # TLS configuration, you should create tls directory and put your tls files in it and then specify the path here networks: - rustfs-network restart: unless-stopped @@ -78,7 +75,7 @@ services: - "9010:9000" # S3 API port - "9011:9001" # Console port environment: - - RUSTFS_VOLUMES=/data/rustfs0,/data/rustfs1 + - RUSTFS_VOLUMES=/data/rustfs{1..4} - RUSTFS_ADDRESS=0.0.0.0:9000 - RUSTFS_CONSOLE_ADDRESS=0.0.0.0:9001 - RUSTFS_CONSOLE_ENABLE=true @@ -90,7 +87,7 @@ services: - RUSTFS_LOG_LEVEL=debug volumes: - .:/app # Mount source code to /app for development - - rustfs_dev_data:/data + - deploy/data/dev:/data networks: - rustfs-network restart: unless-stopped @@ -98,7 +95,7 @@ services: test: [ "CMD", - "sh", "-c", + "sh", "-c", "curl -f http://localhost:9000/health && curl -f http://localhost:9001/health" ] interval: 30s @@ -239,5 +236,5 @@ volumes: driver: local redis_data: driver: local - logs_data: + logs: driver: local diff --git a/rustfs/Cargo.toml b/rustfs/Cargo.toml index b6547458..c5cccda5 100644 --- a/rustfs/Cargo.toml +++ b/rustfs/Cargo.toml @@ -70,6 +70,7 @@ clap = { workspace = true } datafusion = { workspace = true } const-str = { workspace = true } futures.workspace = true +hashbrown = { workspace = true } hyper.workspace = true hyper-util.workspace = true http.workspace = true diff --git a/rustfs/src/admin/handlers/event.rs b/rustfs/src/admin/handlers/event.rs index 48a90d79..0501a3fc 100644 --- a/rustfs/src/admin/handlers/event.rs +++ b/rustfs/src/admin/handlers/event.rs @@ -12,21 +12,16 @@ // See the License for the specific language governing permissions and // limitations under the License. -#![allow(dead_code)] - use crate::admin::router::Operation; use crate::auth::{check_key_valid, get_session_token}; use http::{HeaderMap, StatusCode}; use matchit::Params; use rustfs_config::notify::{NOTIFY_MQTT_SUB_SYS, NOTIFY_WEBHOOK_SUB_SYS}; use rustfs_config::{ENABLE_KEY, EnableState}; -use rustfs_notify::rules::{BucketNotificationConfig, PatternRules}; -use rustfs_targets::EventName; +use rustfs_targets::check_mqtt_broker_available; use s3s::header::CONTENT_LENGTH; use s3s::{Body, S3Error, S3ErrorCode, S3Request, S3Response, S3Result, header::CONTENT_TYPE, s3_error}; use serde::{Deserialize, Serialize}; -use serde_urlencoded::from_bytes; -use std::collections::HashMap; use std::future::Future; use std::io::{Error, ErrorKind}; use std::net::SocketAddr; @@ -36,12 +31,6 @@ use tokio::time::{Duration, sleep}; use tracing::{debug, error, info, warn}; use url::Url; -#[derive(Debug, Deserialize)] -struct BucketQuery { - #[serde(rename = "bucketName")] - bucket_name: String, -} - #[derive(Debug, Deserialize)] pub struct KeyValue { pub key: String, @@ -177,6 +166,7 @@ impl Operation for NotificationTarget { let mut client_cert_val = None; let mut client_key_val = None; let mut qos_val = None; + let mut topic_val = String::new(); for kv in notification_body.key_values.iter() { if !allowed_keys.contains(kv.key.as_str()) { @@ -190,6 +180,16 @@ impl Operation for NotificationTarget { if kv.key == "endpoint" { endpoint_val = Some(kv.value.clone()); } + + if target_type == NOTIFY_MQTT_SUB_SYS { + if kv.key == rustfs_config::MQTT_BROKER { + endpoint_val = Some(kv.value.clone()); + } + if kv.key == rustfs_config::MQTT_TOPIC { + topic_val = kv.value.clone(); + } + } + if kv.key == "queue_dir" { queue_dir_val = Some(kv.value.clone()); } @@ -236,12 +236,15 @@ impl Operation for NotificationTarget { } if target_type == NOTIFY_MQTT_SUB_SYS { - let endpoint = endpoint_val.ok_or_else(|| s3_error!(InvalidArgument, "endpoint is required"))?; - let url = Url::parse(&endpoint).map_err(|e| s3_error!(InvalidArgument, "invalid endpoint url: {}", e))?; - match url.scheme() { - "tcp" | "ssl" | "ws" | "wss" | "mqtt" | "mqtts" => {} - _ => return Err(s3_error!(InvalidArgument, "unsupported broker url scheme")), + let endpoint = endpoint_val.ok_or_else(|| s3_error!(InvalidArgument, "broker endpoint is required"))?; + if topic_val.is_empty() { + return Err(s3_error!(InvalidArgument, "topic is required")); } + // Check MQTT Broker availability + if let Err(e) = check_mqtt_broker_available(&endpoint, &topic_val).await { + return Err(s3_error!(InvalidArgument, "MQTT Broker unavailable: {}", e)); + } + if let Some(queue_dir) = queue_dir_val { validate_queue_dir(&queue_dir).await?; if let Some(qos) = qos_val { @@ -420,113 +423,3 @@ fn extract_target_params<'a>(params: &'a Params<'_, '_>) -> S3Result<(&'a str, & let target_name = extract_param(params, "target_name")?; Ok((target_type, target_name)) } - -/// Set notification rules for buckets -pub struct SetBucketNotification {} -#[async_trait::async_trait] -impl Operation for SetBucketNotification { - async fn call(&self, req: S3Request, _params: Params<'_, '_>) -> S3Result> { - // 1. Analyze query parameters - let query: BucketQuery = from_bytes(req.uri.query().unwrap_or("").as_bytes()) - .map_err(|e| s3_error!(InvalidArgument, "invalid query parameters: {}", e))?; - - // 2. Permission verification - let Some(input_cred) = &req.credentials else { - return Err(s3_error!(InvalidRequest, "credentials not found")); - }; - let (_cred, _owner) = - check_key_valid(get_session_token(&req.uri, &req.headers).unwrap_or_default(), &input_cred.access_key).await?; - - // 3. Get notification system instance - let Some(ns) = rustfs_notify::global::notification_system() else { - return Err(s3_error!(InternalError, "notification system not initialized")); - }; - - // 4. The parsing request body is BucketNotificationConfig - let mut input = req.input; - let body = input.store_all_unlimited().await.map_err(|e| { - warn!("failed to read request body: {:?}", e); - s3_error!(InvalidRequest, "failed to read request body") - })?; - let config: BucketNotificationConfig = serde_json::from_slice(&body) - .map_err(|e| s3_error!(InvalidArgument, "invalid json body for bucket notification config: {}", e))?; - - // 5. Load bucket notification configuration - info!("Loading notification config for bucket '{}'", &query.bucket_name); - ns.load_bucket_notification_config(&query.bucket_name, &config) - .await - .map_err(|e| { - error!("failed to load bucket notification config: {}", e); - S3Error::with_message(S3ErrorCode::InternalError, format!("failed to load bucket notification config: {e}")) - })?; - - let mut header = HeaderMap::new(); - header.insert(CONTENT_TYPE, "application/json".parse().unwrap()); - header.insert(CONTENT_LENGTH, "0".parse().unwrap()); - Ok(S3Response::with_headers((StatusCode::OK, Body::empty()), header)) - } -} - -/// Get notification rules for buckets -#[derive(Serialize)] -struct BucketRulesResponse { - rules: HashMap, -} -pub struct GetBucketNotification {} -#[async_trait::async_trait] -impl Operation for GetBucketNotification { - async fn call(&self, req: S3Request, _params: Params<'_, '_>) -> S3Result> { - let query: BucketQuery = from_bytes(req.uri.query().unwrap_or("").as_bytes()) - .map_err(|e| s3_error!(InvalidArgument, "invalid query parameters: {}", e))?; - - let Some(input_cred) = &req.credentials else { - return Err(s3_error!(InvalidRequest, "credentials not found")); - }; - let (_cred, _owner) = - check_key_valid(get_session_token(&req.uri, &req.headers).unwrap_or_default(), &input_cred.access_key).await?; - - let Some(ns) = rustfs_notify::global::notification_system() else { - return Err(s3_error!(InternalError, "notification system not initialized")); - }; - - let rules_map = ns.notifier.get_rules_map(&query.bucket_name); - let response = BucketRulesResponse { - rules: rules_map.unwrap_or_default().inner().clone(), - }; - - let data = serde_json::to_vec(&response) - .map_err(|e| S3Error::with_message(S3ErrorCode::InternalError, format!("failed to serialize rules: {e}")))?; - - let mut header = HeaderMap::new(); - header.insert(CONTENT_TYPE, "application/json".parse().unwrap()); - Ok(S3Response::with_headers((StatusCode::OK, Body::from(data)), header)) - } -} - -/// Remove all notification rules for a bucket -pub struct RemoveBucketNotification {} -#[async_trait::async_trait] -impl Operation for RemoveBucketNotification { - async fn call(&self, req: S3Request, _params: Params<'_, '_>) -> S3Result> { - let query: BucketQuery = from_bytes(req.uri.query().unwrap_or("").as_bytes()) - .map_err(|e| s3_error!(InvalidArgument, "invalid query parameters: {}", e))?; - - let Some(input_cred) = &req.credentials else { - return Err(s3_error!(InvalidRequest, "credentials not found")); - }; - let (_cred, _owner) = - check_key_valid(get_session_token(&req.uri, &req.headers).unwrap_or_default(), &input_cred.access_key).await?; - - let Some(ns) = rustfs_notify::global::notification_system() else { - return Err(s3_error!(InternalError, "notification system not initialized")); - }; - - info!("Removing notification config for bucket '{}'", &query.bucket_name); - ns.remove_bucket_notification_config(&query.bucket_name).await; - - let mut header = HeaderMap::new(); - header.insert(CONTENT_TYPE, "application/json".parse().unwrap()); - header.insert(CONTENT_LENGTH, "0".parse().unwrap()); - Ok(S3Response::with_headers((StatusCode::OK, Body::empty()), header)) - } -} diff --git a/rustfs/src/admin/mod.rs b/rustfs/src/admin/mod.rs index 9e51ceba..98102c78 100644 --- a/rustfs/src/admin/mod.rs +++ b/rustfs/src/admin/mod.rs @@ -23,10 +23,7 @@ pub mod utils; use handlers::{ GetReplicationMetricsHandler, HealthCheckHandler, ListRemoteTargetHandler, RemoveRemoteTargetHandler, SetRemoteTargetHandler, bucket_meta, - event::{ - GetBucketNotification, ListNotificationTargets, NotificationTarget, RemoveBucketNotification, RemoveNotificationTarget, - SetBucketNotification, - }, + event::{ListNotificationTargets, ListTargetsArns, NotificationTarget, RemoveNotificationTarget}, group, kms, kms_dynamic, kms_keys, policies, pools, rebalance, service_account::{AddServiceAccount, DeleteServiceAccount, InfoServiceAccount, ListServiceAccount, UpdateServiceAccount}, sts, tier, user, @@ -519,25 +516,7 @@ fn register_user_route(r: &mut S3Router) -> std::io::Result<()> r.insert( Method::GET, format!("{}{}", ADMIN_PREFIX, "/v3/target/arns").as_str(), - AdminOperation(&ListNotificationTargets {}), - )?; - - r.insert( - Method::POST, - format!("{}{}", ADMIN_PREFIX, "/v3/target-set-bucket").as_str(), - AdminOperation(&SetBucketNotification {}), - )?; - - r.insert( - Method::POST, - format!("{}{}", ADMIN_PREFIX, "/v3/target-get-bucket").as_str(), - AdminOperation(&GetBucketNotification {}), - )?; - - r.insert( - Method::POST, - format!("{}{}", ADMIN_PREFIX, "/v3/target-remove-bucket").as_str(), - AdminOperation(&RemoveBucketNotification {}), + AdminOperation(&ListTargetsArns {}), )?; Ok(()) diff --git a/rustfs/src/admin/router.rs b/rustfs/src/admin/router.rs index 3b3149e6..9f7cee5c 100644 --- a/rustfs/src/admin/router.rs +++ b/rustfs/src/admin/router.rs @@ -92,6 +92,10 @@ where T: Operation, { fn is_match(&self, method: &Method, uri: &Uri, headers: &HeaderMap, _: &mut Extensions) -> bool { + if method == Method::GET && uri.path() == "/health" { + return true; + } + // AssumeRole if method == Method::POST && uri.path() == "/" { if let Some(val) = headers.get(header::CONTENT_TYPE) { @@ -104,36 +108,13 @@ where uri.path().starts_with(ADMIN_PREFIX) || uri.path().starts_with(RPC_PREFIX) || uri.path().starts_with(CONSOLE_PREFIX) } - async fn call(&self, req: S3Request) -> S3Result> { - if self.console_enabled && req.uri.path().starts_with(CONSOLE_PREFIX) { - if let Some(console_router) = &self.console_router { - let mut console_router = console_router.clone(); - let req = convert_request(req); - let result = console_router.call(req).await; - return match result { - Ok(resp) => Ok(convert_response(resp)), - Err(e) => Err(s3_error!(InternalError, "{}", e)), - }; - } - return Err(s3_error!(InternalError, "console is not enabled")); - } - - let uri = format!("{}|{}", &req.method, req.uri.path()); - - // warn!("get uri {}", &uri); - - if let Ok(mat) = self.router.at(&uri) { - let op: &T = mat.value; - let mut resp = op.call(req, mat.params).await?; - resp.status = Some(resp.output.0); - return Ok(resp.map_output(|x| x.1)); - } - - return Err(s3_error!(NotImplemented)); - } - // check_access before call async fn check_access(&self, req: &mut S3Request) -> S3Result<()> { + // Allow unauthenticated access to health check + if req.method == Method::GET && req.uri.path() == "/health" { + return Ok(()); + } + // Allow unauthenticated access to console static files if console is enabled if self.console_enabled && req.uri.path().starts_with(CONSOLE_PREFIX) { return Ok(()); } @@ -156,6 +137,31 @@ where None => Err(s3_error!(AccessDenied, "Signature is required")), } } + + async fn call(&self, req: S3Request) -> S3Result> { + if self.console_enabled && req.uri.path().starts_with(CONSOLE_PREFIX) { + if let Some(console_router) = &self.console_router { + let mut console_router = console_router.clone(); + let req = convert_request(req); + let result = console_router.call(req).await; + return match result { + Ok(resp) => Ok(convert_response(resp)), + Err(e) => Err(s3_error!(InternalError, "{}", e)), + }; + } + return Err(s3_error!(InternalError, "console is not enabled")); + } + + let uri = format!("{}|{}", &req.method, req.uri.path()); + if let Ok(mat) = self.router.at(&uri) { + let op: &T = mat.value; + let mut resp = op.call(req, mat.params).await?; + resp.status = Some(resp.output.0); + return Ok(resp.map_output(|x| x.1)); + } + + Err(s3_error!(NotImplemented)) + } } #[async_trait::async_trait] diff --git a/rustfs/src/server/audit.rs b/rustfs/src/server/audit.rs index 13705e0d..24bd365b 100644 --- a/rustfs/src/server/audit.rs +++ b/rustfs/src/server/audit.rs @@ -18,6 +18,11 @@ use rustfs_config::DEFAULT_DELIMITER; use rustfs_ecstore::config::GLOBAL_SERVER_CONFIG; use tracing::{error, info, warn}; +/// Start the audit system. +/// This function checks if the audit subsystem is configured in the global server configuration. +/// If configured, it initializes and starts the audit system. +/// If not configured, it skips the initialization. +/// It also handles cases where the audit system is already running or if the global configuration is not loaded. pub(crate) async fn start_audit_system() -> AuditResult<()> { info!( target: "rustfs::main::start_audit_system", @@ -94,6 +99,10 @@ pub(crate) async fn start_audit_system() -> AuditResult<()> { } } +/// Stop the audit system. +/// This function checks if the audit system is initialized and running. +/// If it is running, it prepares to stop the system, stops it, and records the stop time. +/// If the system is already stopped or not initialized, it logs a warning and returns. pub(crate) async fn stop_audit_system() -> AuditResult<()> { if let Some(system) = audit_system() { let state = system.get_state().await; diff --git a/rustfs/src/storage/ecfs.rs b/rustfs/src/storage/ecfs.rs index 363c2637..29b72e41 100644 --- a/rustfs/src/storage/ecfs.rs +++ b/rustfs/src/storage/ecfs.rs @@ -12,136 +12,112 @@ // See the License for the specific language governing permissions and // limitations under the License. -use super::access::authorize_request; -use super::options::del_opts; -use super::options::extract_metadata; -use super::options::put_opts; use crate::auth::get_condition_values; use crate::error::ApiError; -use crate::storage::access::ReqInfo; -use crate::storage::options::copy_dst_opts; -use crate::storage::options::copy_src_opts; -use crate::storage::options::get_complete_multipart_upload_opts; -use crate::storage::options::{extract_metadata_from_mime_with_object_name, get_opts, parse_copy_source_range}; -use bytes::Bytes; -use chrono::DateTime; -use chrono::Utc; -use datafusion::arrow::csv::WriterBuilder as CsvWriterBuilder; -use datafusion::arrow::json::WriterBuilder as JsonWriterBuilder; -use datafusion::arrow::json::writer::JsonArray; -use http::StatusCode; -use rustfs_ecstore::bucket::metadata_sys::get_replication_config; -use rustfs_ecstore::bucket::object_lock::objectlock_sys::BucketObjectLockSys; -use rustfs_ecstore::bucket::replication::DeletedObjectReplicationInfo; -use rustfs_ecstore::bucket::replication::REPLICATE_INCOMING_DELETE; -use rustfs_ecstore::bucket::replication::ReplicationConfigurationExt; -use rustfs_ecstore::bucket::replication::check_replicate_delete; -use rustfs_ecstore::bucket::replication::get_must_replicate_options; -use rustfs_ecstore::bucket::replication::must_replicate; -use rustfs_ecstore::bucket::replication::schedule_replication; -use rustfs_ecstore::bucket::replication::schedule_replication_delete; -use rustfs_ecstore::bucket::versioning::VersioningApi; -use rustfs_ecstore::disk::error::DiskError; -use rustfs_ecstore::disk::error_reduce::is_all_buckets_not_found; -use rustfs_ecstore::error::is_err_bucket_not_found; -use rustfs_ecstore::error::is_err_object_not_found; -use rustfs_ecstore::error::is_err_version_not_found; -use rustfs_ecstore::set_disk::MAX_PARTS_COUNT; -use rustfs_ecstore::store_api::ObjectInfo; -use rustfs_filemeta::ReplicationStatusType; -use rustfs_filemeta::ReplicationType; -use rustfs_filemeta::VersionPurgeStatusType; -use rustfs_s3select_api::object_store::bytes_stream; -use rustfs_s3select_api::query::Context; -use rustfs_s3select_api::query::Query; -use rustfs_s3select_query::get_global_db; - -// use rustfs_ecstore::store_api::RESERVED_METADATA_PREFIX; +use crate::storage::{ + access::{ReqInfo, authorize_request}, + options::{ + copy_dst_opts, copy_src_opts, del_opts, extract_metadata, extract_metadata_from_mime_with_object_name, + get_complete_multipart_upload_opts, get_opts, parse_copy_source_range, put_opts, + }, +}; use base64::{Engine, engine::general_purpose::STANDARD as BASE64_STANDARD}; +use bytes::Bytes; +use chrono::{DateTime, Utc}; +use datafusion::arrow::{ + csv::WriterBuilder as CsvWriterBuilder, json::WriterBuilder as JsonWriterBuilder, json::writer::JsonArray, +}; use futures::StreamExt; -use http::HeaderMap; -use rustfs_ecstore::bucket::lifecycle::bucket_lifecycle_ops::validate_transition_tier; -use rustfs_ecstore::bucket::lifecycle::lifecycle::Lifecycle; -use rustfs_ecstore::bucket::metadata::BUCKET_LIFECYCLE_CONFIG; -use rustfs_ecstore::bucket::metadata::BUCKET_NOTIFICATION_CONFIG; -use rustfs_ecstore::bucket::metadata::BUCKET_POLICY_CONFIG; -use rustfs_ecstore::bucket::metadata::BUCKET_REPLICATION_CONFIG; -use rustfs_ecstore::bucket::metadata::BUCKET_SSECONFIG; -use rustfs_ecstore::bucket::metadata::BUCKET_TAGGING_CONFIG; -use rustfs_ecstore::bucket::metadata::BUCKET_VERSIONING_CONFIG; -use rustfs_ecstore::bucket::metadata::OBJECT_LOCK_CONFIG; -use rustfs_ecstore::bucket::metadata_sys; -use rustfs_ecstore::bucket::policy_sys::PolicySys; -use rustfs_ecstore::bucket::tagging::decode_tags; -use rustfs_ecstore::bucket::tagging::encode_tags; -use rustfs_ecstore::bucket::utils::serialize; -use rustfs_ecstore::bucket::versioning_sys::BucketVersioningSys; -use rustfs_ecstore::client::object_api_utils::format_etag; -use rustfs_ecstore::compress::MIN_COMPRESSIBLE_SIZE; -use rustfs_ecstore::compress::is_compressible; -use rustfs_ecstore::error::StorageError; -use rustfs_ecstore::new_object_layer_fn; -use rustfs_ecstore::set_disk::{DEFAULT_READ_BUFFER_SIZE, is_valid_storage_class}; -use rustfs_ecstore::store_api::BucketOptions; -use rustfs_ecstore::store_api::CompletePart; -use rustfs_ecstore::store_api::DeleteBucketOptions; -use rustfs_ecstore::store_api::HTTPRangeSpec; -use rustfs_ecstore::store_api::MakeBucketOptions; -use rustfs_ecstore::store_api::MultipartUploadResult; -use rustfs_ecstore::store_api::ObjectIO; -use rustfs_ecstore::store_api::ObjectOptions; -use rustfs_ecstore::store_api::ObjectToDelete; -use rustfs_ecstore::store_api::PutObjReader; -use rustfs_ecstore::store_api::StorageAPI; -use rustfs_filemeta::fileinfo::ObjectPartInfo; -use rustfs_kms::DataKey; -use rustfs_kms::service_manager::get_global_encryption_service; -use rustfs_kms::types::{EncryptionMetadata, ObjectEncryptionContext}; +use http::{HeaderMap, StatusCode}; +use rustfs_ecstore::{ + bucket::{ + lifecycle::{bucket_lifecycle_ops::validate_transition_tier, lifecycle::Lifecycle}, + metadata::{ + BUCKET_LIFECYCLE_CONFIG, BUCKET_NOTIFICATION_CONFIG, BUCKET_POLICY_CONFIG, BUCKET_REPLICATION_CONFIG, + BUCKET_SSECONFIG, BUCKET_TAGGING_CONFIG, BUCKET_VERSIONING_CONFIG, OBJECT_LOCK_CONFIG, + }, + metadata_sys, + metadata_sys::get_replication_config, + object_lock::objectlock_sys::BucketObjectLockSys, + policy_sys::PolicySys, + replication::{ + DeletedObjectReplicationInfo, REPLICATE_INCOMING_DELETE, ReplicationConfigurationExt, check_replicate_delete, + get_must_replicate_options, must_replicate, schedule_replication, schedule_replication_delete, + }, + tagging::{decode_tags, encode_tags}, + utils::serialize, + versioning::VersioningApi, + versioning_sys::BucketVersioningSys, + }, + client::object_api_utils::format_etag, + compress::{MIN_COMPRESSIBLE_SIZE, is_compressible}, + disk::{error::DiskError, error_reduce::is_all_buckets_not_found}, + error::{StorageError, is_err_bucket_not_found, is_err_object_not_found, is_err_version_not_found}, + new_object_layer_fn, + set_disk::{DEFAULT_READ_BUFFER_SIZE, MAX_PARTS_COUNT, is_valid_storage_class}, + store_api::{ + BucketOptions, + CompletePart, + DeleteBucketOptions, + HTTPRangeSpec, + MakeBucketOptions, + MultipartUploadResult, + ObjectIO, + ObjectInfo, + ObjectOptions, + ObjectToDelete, + PutObjReader, + StorageAPI, + // RESERVED_METADATA_PREFIX, + }, +}; +use rustfs_filemeta::{ReplicationStatusType, ReplicationType, VersionPurgeStatusType, fileinfo::ObjectPartInfo}; +use rustfs_kms::{ + DataKey, + service_manager::get_global_encryption_service, + types::{EncryptionMetadata, ObjectEncryptionContext}, +}; use rustfs_notify::global::notifier_instance; -use rustfs_policy::auth; -use rustfs_policy::policy::action::Action; -use rustfs_policy::policy::action::S3Action; -use rustfs_policy::policy::{BucketPolicy, BucketPolicyArgs, Validator}; -use rustfs_rio::CompressReader; -use rustfs_rio::EtagReader; -use rustfs_rio::HashReader; -use rustfs_rio::Reader; -use rustfs_rio::WarpReader; -use rustfs_rio::{DecryptReader, EncryptReader, HardLimitReader}; -use rustfs_targets::EventName; -use rustfs_targets::arn::{TargetID, TargetIDError}; -use rustfs_utils::CompressionAlgorithm; -use rustfs_utils::http::AMZ_BUCKET_REPLICATION_STATUS; -use rustfs_utils::http::headers::RESERVED_METADATA_PREFIX_LOWER; -use rustfs_utils::http::headers::{AMZ_DECODED_CONTENT_LENGTH, AMZ_OBJECT_TAGGING}; -use rustfs_utils::path::is_dir_object; -use rustfs_utils::path::path_join_buf; +use rustfs_policy::{ + auth, + policy::{ + action::{Action, S3Action}, + {BucketPolicy, BucketPolicyArgs, Validator}, + }, +}; +use rustfs_rio::{CompressReader, DecryptReader, EncryptReader, EtagReader, HardLimitReader, HashReader, Reader, WarpReader}; +use rustfs_s3select_api::{ + object_store::bytes_stream, + query::{Context, Query}, +}; +use rustfs_s3select_query::get_global_db; +use rustfs_targets::{ + EventName, + arn::{TargetID, TargetIDError}, +}; +use rustfs_utils::{ + CompressionAlgorithm, + http::{ + AMZ_BUCKET_REPLICATION_STATUS, + headers::{AMZ_DECODED_CONTENT_LENGTH, AMZ_OBJECT_TAGGING, RESERVED_METADATA_PREFIX_LOWER}, + }, + path::{is_dir_object, path_join_buf}, +}; use rustfs_zip::CompressionFormat; -use s3s::S3; -use s3s::S3Error; -use s3s::S3ErrorCode; -use s3s::S3Result; -use s3s::dto::*; -use s3s::s3_error; -use s3s::{S3Request, S3Response}; -use std::collections::HashMap; -use std::fmt::Debug; -use std::path::Path; -use std::str::FromStr; -use std::sync::Arc; -use std::sync::LazyLock; -use time::OffsetDateTime; -use time::format_description::well_known::Rfc3339; -use tokio::io::AsyncRead; -use tokio::sync::mpsc; +use s3s::{S3, S3Error, S3ErrorCode, S3Request, S3Response, S3Result, dto::*, s3_error}; +use std::{ + collections::HashMap, + fmt::Debug, + path::Path, + str::FromStr, + sync::{Arc, LazyLock}, +}; +use time::{OffsetDateTime, format_description::well_known::Rfc3339}; +use tokio::{io::AsyncRead, sync::mpsc}; use tokio_stream::wrappers::ReceiverStream; use tokio_tar::Archive; -use tokio_util::io::ReaderStream; -use tokio_util::io::StreamReader; -use tracing::debug; -use tracing::error; -use tracing::info; -use tracing::warn; +use tokio_util::io::{ReaderStream, StreamReader}; +use tracing::{debug, error, info, warn}; use uuid::Uuid; macro_rules! try_ { diff --git a/scripts/run.sh b/scripts/run.sh index e61025fa..04e1ca67 100755 --- a/scripts/run.sh +++ b/scripts/run.sh @@ -58,7 +58,7 @@ export RUSTFS_EXTERNAL_ADDRESS=":9000" #export RUSTFS_OBS_METER_INTERVAL=1 # Sampling interval in seconds #export RUSTFS_OBS_SERVICE_NAME=rustfs # Service name #export RUSTFS_OBS_SERVICE_VERSION=0.1.0 # Service version -export RUSTFS_OBS_ENVIRONMENT=production # Environment name +export RUSTFS_OBS_ENVIRONMENT=develop # Environment name export RUSTFS_OBS_LOGGER_LEVEL=info # Log level, supports trace, debug, info, warn, error export RUSTFS_OBS_LOCAL_LOGGING_ENABLED=true # Whether to enable local logging export RUSTFS_OBS_LOG_DIRECTORY="$current_dir/deploy/logs" # Log directory @@ -123,6 +123,10 @@ export RUSTFS_COMPRESSION_ENABLED=true # Whether to enable compression #export RUSTFS_REGION="us-east-1" +export RUSTFS_ENABLE_SCANNER=false + +export RUSTFS_ENABLE_HEAL=false + # Event message configuration #export RUSTFS_EVENT_CONFIG="./deploy/config/event.example.toml"