diff --git a/.github/workflows/rustfs-table-test.yml b/.github/workflows/rustfs-table-test.yml index 90c601b17..108a2d903 100644 --- a/.github/workflows/rustfs-table-test.yml +++ b/.github/workflows/rustfs-table-test.yml @@ -58,7 +58,7 @@ jobs: printf 'TMPDIR=%s-scratch\n' "${FUNCTIONAL_ARTIFACTS_DIR}" } >> "${GITHUB_ENV}" - - name: Checkout auto-testing scripts (with retry) + - name: Checkout auto-testing scripts env: GH_TOKEN: ${{ secrets.PF_TESTING_GH_TOKEN }} run: | @@ -103,9 +103,6 @@ jobs: - name: Run table suite id: test - # Case failures keep the run green: the report and the backlog issue - # manager carry the product signal. - continue-on-error: true run: | set -euo pipefail chmod +x auto-testing/rustfs-table-test.sh @@ -146,20 +143,6 @@ jobs: RESULT=success fi - # Product gate: failing cases keep the run green — they are reported - # below and tracked in rustfs/backlog. Only harness/environment - # breakdowns (the suite never reached case level, or a wholesale - # failure with zero passes) turn the workflow red. - CASES_TOTAL="$(grep -cE '^\| [A-Z][A-Z0-9]*-[0-9]+ .*\| (PASS|FAIL|UNSUPPORTED|RUNNING) \|' "${CASE_TABLE}" 2>/dev/null || true)" - CASES_FAIL="$(grep -cE '^\| [A-Z][A-Z0-9]*-[0-9]+ .*\| FAIL \|' "${CASE_TABLE}" 2>/dev/null || true)" - CASES_TOTAL=$(( ${CASES_TOTAL:-0} + 0 )); CASES_FAIL=$(( ${CASES_FAIL:-0} + 0 )) - CASES_PASS=$(( CASES_TOTAL - CASES_FAIL )) - HARNESS_OK=0 - if [ '${{ steps.test.outcome }}' = 'success' ]; then - HARNESS_OK=1 - elif [ '${{ steps.test.outcome }}' = 'failure' ] && [ "${CASES_TOTAL}" -gt 0 ] && [ "${CASES_PASS}" -ge 1 ]; then - HARNESS_OK=1 - fi { echo "# RustFS S3 Tables (Iceberg REST Catalog) test report" echo "" @@ -171,24 +154,19 @@ jobs: echo "- Test Step Outcome: ${RESULT}" echo "- Suite Step Outcome: ${{ steps.test.outcome }}" echo "" - if [ -s "${CASE_TABLE}" ]; then + if [ "${RESULT}" = "success" ]; then cat "${CASE_TABLE}" echo "" - fi - echo "- Product result: ${CASES_PASS} passed, ${CASES_FAIL} failed (failing cases are tracked in rustfs/backlog)" - echo "" - if [ -s "${CASE_TABLE}" ]; then echo "## Log tail" echo '```text' - tail -n 200 "${LOG_FILE}" 2>/dev/null || true + tail -n 200 "${LOG_FILE}" echo '```' else echo "The suite or evidence validation failed. See this run's artifact for partial case results and suite.log." fi } | tee "${REPORT_FILE}" cat "${REPORT_FILE}" >> "${GITHUB_STEP_SUMMARY}" - # Red only for harness/environment breakdowns; case failures stay green. - [ "${HARNESS_OK}" = "1" ] + [ "${RESULT}" = "success" ] - name: Upload functional report to dashboard if: ${{ always() && steps.evidence.outcome == 'success' }} @@ -257,6 +235,66 @@ jobs: --log "${LOG_FILE}" \ --date "$(date -u +%Y-%m-%d)" + - name: File failure issue in rustfs/backlog + if: ${{ always() && (failure() || steps.test.outcome == 'failure' || steps.test.outcome == 'cancelled') }} + continue-on-error: true + env: + GH_TOKEN: ${{ secrets.PF_TESTING_GH_TOKEN }} + EVIDENCE_OUTCOME: ${{ steps.evidence.outcome }} + SUITE: 'table' + SUITE_LABEL: 'S3 Tables' + RUN_URL: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }} + run: | + set -euo pipefail + if [ -z "${GH_TOKEN:-}" ]; then + echo "PF_TESTING_GH_TOKEN is not configured; skipping backlog issue" + exit 0 + fi + TITLE="[functional][${SUITE}] ${SUITE_LABEL} suite failed (run ${GITHUB_RUN_ID})" + EXISTING="$(gh issue list -R rustfs/backlog --state all \ + --search "in:title \"run ${GITHUB_RUN_ID}\"" \ + --json number --jq '.[].number' || true)" + if [ -n "${EXISTING}" ]; then + echo "backlog issue already exists for run ${GITHUB_RUN_ID}; skipping" + exit 0 + fi + redact() { + sed -E \ + -e 's/(RUSTFS_(ACCESS_KEY|SECRET_KEY)[=: ]+)[^[:space:]]+/\1[REDACTED]/Ig' \ + -e 's/(Authorization:).*/\1 [REDACTED]/Ig' \ + -e 's/(X-Amz-Signature=)[^&[:space:]]+/\1[REDACTED]/Ig' \ + -e 's/^.*(password|secret|token)[=: ].*/[REDACTED SENSITIVE LINE]/Ig' + } + BODY_FILE="$(mktemp)" + { + echo "The **${SUITE_LABEL}** functional suite failed." + echo "" + echo "- Suite: \`${SUITE}\`" + echo "- Run: ${RUN_URL}" + echo "- Attempt: ${GITHUB_RUN_ATTEMPT}" + echo "- Workflow Commit: ${GITHUB_SHA}" + echo "- Trigger: ${GITHUB_EVENT_NAME}" + echo "- Date: $(date -u +%Y-%m-%d)" + echo "" + echo "## Report (errors and symptoms)" + echo "" + if [ "${EVIDENCE_OUTCOME}" = "success" ] && [ -s "${REPORT_FILE}" ]; then + redact < "${REPORT_FILE}" + elif [ "${EVIDENCE_OUTCOME}" = "success" ] && [ -s "${LOG_FILE:-}" ]; then + echo "(report file missing; log tail below)" + echo "" + tail -n 200 "${LOG_FILE}" | redact + else + echo "(no report or log file was produced)" + fi + } | head -c 55000 > "${BODY_FILE}" + gh label create functional-test -R rustfs/backlog --color d73a4a 2>/dev/null || true + if ! gh issue create -R rustfs/backlog --title "${TITLE}" \ + --body-file "${BODY_FILE}" --label functional-test; then + gh issue create -R rustfs/backlog --title "${TITLE}" --body-file "${BODY_FILE}" + fi + echo "filed backlog issue for suite ${SUITE}" + - name: Upload report and logs if: ${{ always() && steps.evidence.outcome == 'success' }} uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6 diff --git a/Cargo.lock b/Cargo.lock index 03c42c8c6..6c10f1d5f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -271,7 +271,7 @@ version = "1.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "40c48f72fd53cd289104fc64099abca73db4166ad86ea0b4341abe65af83dadc" dependencies = [ - "windows-sys 0.61.2", + "windows-sys 0.60.2", ] [[package]] @@ -282,7 +282,7 @@ checksum = "291e6a250ff86cd4a820112fb8898808a366d8f9f58ce16d1f538353ad55747d" dependencies = [ "anstyle", "once_cell_polyfill", - "windows-sys 0.61.2", + "windows-sys 0.60.2", ] [[package]] @@ -658,22 +658,6 @@ dependencies = [ "serde_json", ] -[[package]] -name = "astral-tokio-tar" -version = "0.7.0" -source = "git+https://github.com/cxymds/tokio-tar.git?rev=603756478b7668436e464519c77ccac22a99ba96#603756478b7668436e464519c77ccac22a99ba96" -dependencies = [ - "futures-core", - "libc", - "portable-atomic", - "rustc-hash", - "rustix", - "tokio", - "tokio-stream", - "xattr", - "zerocopy", -] - [[package]] name = "async-channel" version = "2.5.0" @@ -701,9 +685,9 @@ dependencies = [ [[package]] name = "async-compression" -version = "0.4.46" +version = "0.4.47" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f10dafd0c8d2e51ae9a748805777613ed0bbe17bf586b76c8311f45c020a32f" +checksum = "ef217a77a86a6e3dab9a5b3c81dc445b603fe743a90c1cb10a2f2144628d8cfa" dependencies = [ "compression-codecs", "compression-core", @@ -1885,9 +1869,9 @@ checksum = "cd17eb909a8c6a894926bfcc3400a4bb0e732f5a57d37b1f14e8b29e329bace8" [[package]] name = "camino" -version = "1.2.5" +version = "1.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb1307f12aa967b5a58416e87b3653360e0fd614a016b6e970db08fecbb1b80d" +checksum = "bbbad30e4b4c14a39e3cc8aed085a12a327257c316619c93581e017bc52be591" dependencies = [ "serde_core", ] @@ -1906,7 +1890,7 @@ dependencies = [ "maybe-owned", "rustix", "rustix-linux-procfs", - "windows-sys 0.61.2", + "windows-sys 0.60.2", "winx", ] @@ -2128,9 +2112,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.6.6" +version = "4.6.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "473c7e07f409a8d772161724aa8db6a765a2532a70f9667eeb7b49d3d02fbdca" +checksum = "aa8876b300ab35ba921adea3dfd70157a46249b33f95c9084ae5709785478946" dependencies = [ "clap_builder", "clap_derive", @@ -2138,9 +2122,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.6.6" +version = "4.6.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b48fea5a88e9ae728a2dcbedbfc0e730f7d60da42e1cb049a83c9fb8b789889" +checksum = "ec0797fb7aeb1406c84efac526901f7ec3ead2124f946b494e72879d4b54704d" dependencies = [ "anstream", "anstyle", @@ -2150,9 +2134,9 @@ dependencies = [ [[package]] name = "clap_derive" -version = "4.6.4" +version = "4.6.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d012d2b9d65aca7f18f4d9878a045bc17899bba951561ba5ec3c2ba1eed9a061" +checksum = "f9c751b79415d4e559e3d1fcf128e09e720eb673a06d26cf6f392d37d75b66e0" dependencies = [ "heck 0.5.0", "proc-macro2", @@ -2162,9 +2146,9 @@ dependencies = [ [[package]] name = "clap_lex" -version = "1.1.0" +version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8d4a3bb8b1e0c1050499d1815f5ab16d04f0959b233085fb31653fbfc9d98f9" +checksum = "1c133bc6a41be0d194c306b5506d15e6feeea7b1d6604bd3f8310dfb2ca96486" [[package]] name = "cmake" @@ -2238,9 +2222,9 @@ dependencies = [ [[package]] name = "compression-codecs" -version = "0.4.41" +version = "0.4.42" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "58a6d0db8759036a783bc7c3f7a07f8cef3bf9470eb1db3bc86e8bcd1c5d0fe8" +checksum = "257c7085cbb71be72d8fb97edff08b03d86d5d9f2222b9cc34a6bec87093bc10" dependencies = [ "brotli 8.0.4", "bzip2", @@ -3943,7 +3927,7 @@ dependencies = [ "libc", "option-ext", "redox_users", - "windows-sys 0.61.2", + "windows-sys 0.60.2", ] [[package]] @@ -3990,7 +3974,6 @@ name = "e2e_test" version = "1.0.0-rc.6" dependencies = [ "anyhow", - "astral-tokio-tar", "async-compression", "async-trait", "aws-config", @@ -4034,6 +4017,7 @@ dependencies = [ "rustfs-protos", "rustfs-rio", "rustfs-signer", + "rustfs-tokio-tar", "rustfs-utils", "rustls", "s3s", @@ -4288,7 +4272,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" dependencies = [ "libc", - "windows-sys 0.61.2", + "windows-sys 0.60.2", ] [[package]] @@ -4492,7 +4476,7 @@ checksum = "94e7099f6313ecacbe1256e8ff9d617b75d1bcb16a6fddef94866d225a01a14a" dependencies = [ "io-lifetimes 2.0.4", "rustix", - "windows-sys 0.59.0", + "windows-sys 0.52.0", ] [[package]] @@ -6965,7 +6949,7 @@ version = "0.50.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7957b9740744892f114936ab4a57b3f487491bbeafaf8083688b16841a4240e5" dependencies = [ - "windows-sys 0.61.2", + "windows-sys 0.60.2", ] [[package]] @@ -7125,7 +7109,7 @@ version = "5.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "51e219e79014df21a225b1860a479e2dcd7cbd9130f4defd4bd0e191ea31d67d" dependencies = [ - "base64 0.22.1", + "base64 0.21.7", "chrono", "getrandom 0.2.17", "http 1.5.0", @@ -8142,9 +8126,9 @@ checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" [[package]] name = "ppmd-rust" -version = "1.4.1" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e9219bcb9d7aca6b2f63c83cf100cf78bcd619ac46e6ecbd0dd90869a39345d" +checksum = "196a7c80b9a7652aba7cc070827516c2abe4ccdf53d128e1944003cf5726cff1" [[package]] name = "ppv-lite86" @@ -8662,9 +8646,9 @@ dependencies = [ [[package]] name = "quinn" -version = "0.11.11" +version = "0.11.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c1a41e437b6bbd489372cd4971de128e85c855f56c57f283d20ff016cf7c0a8" +checksum = "4051e23e9185c255a7e33ef59cdbca87a22d359052eecd22fc6b901fb37d9d11" dependencies = [ "bytes", "cfg_aliases", @@ -8682,9 +8666,9 @@ dependencies = [ [[package]] name = "quinn-proto" -version = "0.11.17" +version = "0.11.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04759210543be93709136e28212294a659ef5001836ff4eab4d663e4529bba83" +checksum = "a9746dbde176634f4f2f1faf2404e30a31b2bc1e9cafb5329c95d8177a18c9fc" dependencies = [ "aws-lc-rs", "bytes", @@ -8714,7 +8698,7 @@ dependencies = [ "once_cell", "socket2", "tracing", - "windows-sys 0.61.2", + "windows-sys 0.60.2", ] [[package]] @@ -9483,7 +9467,6 @@ dependencies = [ "aes-gcm", "anyhow", "apache-avro", - "astral-tokio-tar", "async-trait", "async_zip", "atoi 3.1.0", @@ -9588,6 +9571,7 @@ dependencies = [ "rustfs-targets", "rustfs-test-utils", "rustfs-tls-runtime", + "rustfs-tokio-tar", "rustfs-trusted-proxies", "rustfs-utils", "rustfs-zip", @@ -10445,7 +10429,6 @@ dependencies = [ name = "rustfs-protocols" version = "1.0.0-rc.6" dependencies = [ - "astral-tokio-tar", "async-compression", "async-trait", "axum", @@ -10479,6 +10462,7 @@ dependencies = [ "rustfs-storage-api", "rustfs-test-utils", "rustfs-tls-runtime", + "rustfs-tokio-tar", "rustfs-trusted-proxies", "rustfs-utils", "rustls", @@ -10922,6 +10906,23 @@ dependencies = [ "tracing", ] +[[package]] +name = "rustfs-tokio-tar" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7451523c123cf217e6f492b7cf0f9f07749c0c2aa5d569b3915b62af3b36cc3b" +dependencies = [ + "futures-core", + "libc", + "portable-atomic", + "rustc-hash", + "rustix", + "tokio", + "tokio-stream", + "xattr", + "zerocopy", +] + [[package]] name = "rustfs-trusted-proxies" version = "1.0.0-rc.6" @@ -11005,11 +11006,11 @@ dependencies = [ name = "rustfs-zip" version = "1.0.0-rc.6" dependencies = [ - "astral-tokio-tar", "async-compression", "futures", "hotpath", "rustfs-rio", + "rustfs-tokio-tar", "serde", "serde_json", "sha2 0.11.0", @@ -11072,7 +11073,7 @@ dependencies = [ "errno", "libc", "linux-raw-sys", - "windows-sys 0.61.2", + "windows-sys 0.60.2", ] [[package]] @@ -11155,7 +11156,7 @@ dependencies = [ "security-framework", "security-framework-sys", "webpki-root-certs", - "windows-sys 0.61.2", + "windows-sys 0.60.2", ] [[package]] @@ -11960,7 +11961,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c3d1e2c7f27f8d4cb10542a02c49005dbd6e93095799d6f3be745fae9f8fedd4" dependencies = [ "libc", - "windows-sys 0.61.2", + "windows-sys 0.60.2", ] [[package]] @@ -12111,7 +12112,7 @@ dependencies = [ "cfg-if", "libc", "psm", - "windows-sys 0.61.2", + "windows-sys 0.60.2", ] [[package]] @@ -12416,10 +12417,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32497e9a4c7b38532efcdebeef879707aa9f794296a4f0244f6f69e9bc8574bd" dependencies = [ "fastrand", - "getrandom 0.4.3", + "getrandom 0.3.4", "once_cell", "rustix", - "windows-sys 0.61.2", + "windows-sys 0.60.2", ] [[package]] @@ -13512,7 +13513,7 @@ version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" dependencies = [ - "windows-sys 0.61.2", + "windows-sys 0.60.2", ] [[package]] @@ -13642,15 +13643,6 @@ dependencies = [ "windows-targets 0.52.6", ] -[[package]] -name = "windows-sys" -version = "0.59.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" -dependencies = [ - "windows-targets 0.52.6", -] - [[package]] name = "windows-sys" version = "0.60.2" @@ -13823,7 +13815,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f3fd376f71958b862e7afb20cfe5a22830e1963462f3a17f49d82a6c1d1f42d" dependencies = [ "bitflags 2.13.2", - "windows-sys 0.59.0", + "windows-sys 0.52.0", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index 8eb757686..2eb94755b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -145,7 +145,7 @@ rustfs-zip = { path = "./crates/zip", version = "1.0.0-rc.6" } async-channel = "2.5.0" async_zip = { default-features = false, version = "0.0.19" } mysql_async = { default-features = false, version = "0.37.1" } -async-compression = { version = "0.4.46" } +async-compression = { version = "0.4.47" } async-recursion = "1.1.1" async-trait = "0.1.92" async-nats = { version = "0.50.0", default-features = false } @@ -235,8 +235,7 @@ tokio-postgres-rustls = "0.14.0" # Utilities and Tools anyhow = "1.0.104" arc-swap = "1.9.2" -# RUSTFS_COMPAT_TODO(tokio-tar-extension-limits): keep the fork pin while Snowball and Swift still depend on it. Remove after Snowball uses a released tar-codec/tar-framing API that exposes precedence-resolved MinIO vendor records, RustFS preserves cancellation-safe ownership of large streamed members, footerless minio-go input is accepted only at an authenticated complete request boundary, the existing resource-limit, cancellation, and error-fuse regressions pass, and Swift no longer needs this fork. -astral-tokio-tar = { git = "https://github.com/cxymds/tokio-tar.git", rev = "603756478b7668436e464519c77ccac22a99ba96" } +rustfs-tokio-tar = { version = "0.7.1" } # Candidate Snowball parser versions exercised by rustfs-zip compatibility fixtures. tar-codec = "0.0.14" tar-framing = "0.0.14" @@ -253,7 +252,7 @@ aws-smithy-runtime-api = { version = "1.16.0" } aws-smithy-types = { version = "1.6.3" } base64-simd = "0.8.0" brotli = "9.0.0" -clap = { version = "4.6.6" } +clap = { version = "4.6.7" } const-str = { version = "1.1.0" } convert_case = "0.12.0" criterion = { version = "0.8" } diff --git a/crates/e2e_test/Cargo.toml b/crates/e2e_test/Cargo.toml index 70d1bbeb9..6b1dd5ccf 100644 --- a/crates/e2e_test/Cargo.toml +++ b/crates/e2e_test/Cargo.toml @@ -131,7 +131,7 @@ md-5 = { workspace = true } opentelemetry-proto = { workspace = true } prost.workspace = true sha2 = { workspace = true } -astral-tokio-tar = { workspace = true } +rustfs-tokio-tar = { workspace = true } s3s = { workspace = true, features = ["minio"] } zstd.workspace = true time = { workspace = true, features = ["parsing", "formatting", "macros", "serde"] } diff --git a/crates/protocols/Cargo.toml b/crates/protocols/Cargo.toml index 7f8170d9c..24cd74d7f 100644 --- a/crates/protocols/Cargo.toml +++ b/crates/protocols/Cargo.toml @@ -102,7 +102,7 @@ swift = [ "dep:hex-simd", "dep:ipnetwork", "dep:rustfs-trusted-proxies", - "dep:astral-tokio-tar", + "dep:rustfs-tokio-tar", "dep:base64-simd", "dep:async-compression", ] @@ -166,7 +166,7 @@ sha1 = { workspace = true, optional = true } hex-simd = { workspace = true, optional = true } ipnetwork = { workspace = true, optional = true } rustfs-trusted-proxies = { workspace = true, optional = true } -astral-tokio-tar = { workspace = true, optional = true } +rustfs-tokio-tar = { workspace = true, optional = true } base64-simd = { workspace = true, optional = true } async-compression = { workspace = true, optional = true, features = ["tokio", "gzip", "bzip2"] } diff --git a/crates/protocols/src/swift/bulk.rs b/crates/protocols/src/swift/bulk.rs index 199b1296c..9ef5382a1 100644 --- a/crates/protocols/src/swift/bulk.rs +++ b/crates/protocols/src/swift/bulk.rs @@ -633,7 +633,7 @@ mod tests { /// Tests for the `extract_tar_entries` async function. /// /// Conditionally compiled with the `swift` feature, which gates the - /// `tokio_tar` (astral-tokio-tar) and `async_compression` dependencies. + /// `tokio_tar` (rustfs-tokio-tar) and `async_compression` dependencies. #[cfg(feature = "swift")] mod tar_extraction { use super::*; diff --git a/crates/zip/Cargo.toml b/crates/zip/Cargo.toml index 312d2928d..c0b21eb0e 100644 --- a/crates/zip/Cargo.toml +++ b/crates/zip/Cargo.toml @@ -50,7 +50,7 @@ tokio = { workspace = true, features = ["io-util", "macros", "rt"] } thiserror = { workspace = true } [dev-dependencies] -astral-tokio-tar = { workspace = true } +rustfs-tokio-tar = { workspace = true } futures = { workspace = true } serde = { workspace = true, features = ["derive"] } serde_json = { workspace = true } diff --git a/deny.toml b/deny.toml index 952a5d77e..cd645812d 100644 --- a/deny.toml +++ b/deny.toml @@ -36,11 +36,6 @@ unknown-registry = "deny" unknown-git = "deny" allow-registry = ["https://github.com/rust-lang/crates.io-index"] allow-git = [ - # Temporary tokio-tar fork pinned to the reviewed parser limits, - # cancellation safety, and error-fusing change while Snowball is - # prototyped against tar-codec and Swift retains its current reader. - # owner: cxymds review: 2026-10 - "https://github.com/cxymds/tokio-tar.git", # Official s3s repository. Temporarily pinned to the merged generic REST # SigV4 payload-checksum fix until it is available in a crates.io release. # owner: marshawcoco review: 2026-10 diff --git a/docs/architecture/compat-cleanup-register.md b/docs/architecture/compat-cleanup-register.md index 41acc7227..5b08542bf 100644 --- a/docs/architecture/compat-cleanup-register.md +++ b/docs/architecture/compat-cleanup-register.md @@ -15,7 +15,6 @@ - `backlog-2263` legacy heal MRF inspection: retained per-record journals remain readable while committed-snapshot ownership and writer activation are staged. Remove legacy import only after all supported direct-upgrade and rollback readers understand committed snapshots and migration tooling confirms that no retained or restorable legacy journal requires it. This does not enable a new writer or change the automatic legacy consumer. - `backlog-1337` legacy restore orphan recovery: releases that predate the restore worker-lock marker can leave a valid operation-id and `ongoing-request="true"` after cancellation or process failure, with no durable liveness proof. New servers allow an exact, non-nil legacy generation to be superseded only when its consistently parsed request date is at least 24 hours old. Remove the clock-based legacy fallback after the minimum supported direct-upgrade release writes the v1 worker-lock marker on every restore and operators have resolved every retained pre-v1 ongoing generation. - `backlog-2133-tier-delete-chunk-parent` bounded tier-delete dispatch compatibility: prefixes at or below the legacy manifest limit keep the byte-compatible v1 single-manifest protocol, while larger prefixes place a chunk-parent sentinel at the original deterministic root path and use operation-scoped child manifests. Older binaries reject the sentinel and child paths, preserving the v6 sole-owner downgrade fence instead of starting a competing local delete. Remove the v1 reader and fail-closed mixed-version sentinel only after every supported rollback release validates the parent/child protocol and migration tooling confirms that no retained v1 dispatch manifest remains. -- `tokio-tar-extension-limits` bounded archive parser hardening: Snowball extraction depends on precedence-resolved MinIO PAX metadata; per-entry and cumulative extension limits; a physical-entry limit; cancellation-safe parsing and ownership of large streamed members; fused streams after errors; and compatibility with minio-go streams that omit the two-block terminator. Swift bulk extraction also uses the same fork. Keep the reviewed pin while the Snowball path is prototyped against tar-codec/tar-framing. Remove it only after a released API exposes the effective allowed vendor records, RustFS provides a cancellation-safe handoff for borrowed member payloads, footerless input is accepted solely when authenticated request framing proves EOF immediately after a complete member, the existing resource-limit, cancellation, error-fuse, and real minio-go fixtures pass against the replacement, and Swift no longer depends on the fork. - `backlog-2102` rc.2/rc.3 empty scanner usage floor recovery: old DeleteBucket cleanup could synthesize an empty incomplete v2 usage primary/backup before leadership added an epoch, while newer scanners require a durable authoritative baseline identity. New scanners recognize only that exact serialized empty-fence shape, preserve its epoch through a CAS-protected recovery marker, and rebuild namespace coverage without treating zero usage as authoritative. Remove this recovery path and marker after rc.2 and rc.3 are no longer supported direct-upgrade sources. - `backlog-2122` rc.1-rc.3 non-empty scanner usage floor recovery: leadership fencing in those releases can stamp scanner_epoch onto a real bucket-usage snapshot before any scanner cycle completed, leaving a non-empty floor with no scanner_cycle and no authoritative baseline identity. New scanners recognize only this consistent incomplete fenced shape, preserve the epoch through the CAS-protected recovery marker, and rebuild namespace coverage without treating the old usage data as authoritative. Remove this recovery path after rc.1, rc.2, and rc.3 are no longer supported direct-upgrade sources. - `s3gate-metadata-xml` persisted bucket XML migration: mixed-version site-replication peers, retained `.metadata.bin` objects, and backup archives can all carry XML written by the s3s codec, so the gateway migration must keep the legacy codec available until every stored form has crossed a verified rewrite boundary. Remove the legacy s3s parser and serializer only after the minimum supported direct-upgrade release reads and writes every persisted XML configuration family through the gateway codec, every supported mixed-version site-replication topology has completed its writer upgrade, and migration tooling has verified or rewritten every retained bucket metadata object and restorable backup archive. diff --git a/rustfs/Cargo.toml b/rustfs/Cargo.toml index b8debf1dd..11bd1c8e0 100644 --- a/rustfs/Cargo.toml +++ b/rustfs/Cargo.toml @@ -328,7 +328,7 @@ jiff = { workspace = true, features = ["serde"] } time = { workspace = true, features = ["parsing", "formatting", "serde", "macros"] } # Utilities and Tools -astral-tokio-tar = { workspace = true } +rustfs-tokio-tar = { workspace = true } atoi = { workspace = true } atomic_enum = { workspace = true } async_zip = { workspace = true, default-features = false, features = ["tokio", "deflate"] }