build(deps): bump redis from 0.29.5 to 0.32.0#2776
Closed
dependabot[bot] wants to merge 1 commit into
Closed
Conversation
Bumps [redis](https://github.com/redis-rs/redis-rs) from 0.29.5 to 0.32.0. - [Release notes](https://github.com/redis-rs/redis-rs/releases) - [Commits](https://github.com/redis-rs/redis-rs/commits) --- updated-dependencies: - dependency-name: redis dependency-version: 0.32.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] <support@github.com>
c2a1359 to
cf0e849
Compare
Contributor
Author
|
Looks like redis is up-to-date now, so this is no longer needed. |
jqnatividad
added a commit
that referenced
this pull request
Jun 7, 2026
…oud), dc: stats cache (#3958) * feat(get): streaming ingest + parallel ranged cloud downloads Implements Phase 3 §2.3 items (1) streaming ingest and (2) cloud-path parallel ranged downloads for the `get` command, plus two fixes found along the way. - diskcache: add a streaming `BlobSink` (incremental BLAKE3 + streaming zstd to a temp file, atomically renamed to the content-addressed blob). It never buffers the whole object in memory, unlike `store_blob`. (`get_cloud`-gated for now since only the cloud path uses it.) - diskcache: rework `ingest_cloud` to fetch large cloud objects as concurrent, in-order byte-ranges streamed straight into the `BlobSink`, so peak memory is ~`concurrency * part_size` regardless of object size. The first-part ranged GET doubles as both the conditional revalidation request (preserving ETag/304 behavior) and the size probe (Content-Range carries the total), so there is no extra HEAD round-trip. Objects that fit in one part take a single request. Tunable via the new `QSV_GET_PART_SIZE` (default 8 MiB) and `QSV_GET_CONCURRENCY` (default 4) env vars (env-only, so they don't collide with object_store's `--cloud-opt` config keys). No new dependencies. - util: resolve the `dc:` prefix in `process_input` before its existence check. `dc:` was only resolved in `Config::new`, so commands that pre-validate inputs via `process_input` (cat, slice, joins, ...) wrongly rejected a valid `dc:` handle as a missing file. Now `dc:<name>` is resolved to its materialized CSV (with sibling .idx) up front. - diskcache: fix `alias_path` to pass `to_hex().as_str()` to `Path::join` (blake3's `ArrayString` impls `AsRef<str>`, not `AsRef<Path>`). A pre-existing break in minimal `get*` feature combos, masked by `all_features`. - tests: extend the mock S3 server with 206/Content-Range range support and a larger `big.csv` endpoint; add `get_s3_multipart_ranged_download` (byte-for-byte reassembly check via `--output`) and `get_dc_works_with_process_input_commands` (cat/slice/count over `dc:`). - docs: document `QSV_GET_PART_SIZE` and `QSV_GET_CONCURRENCY`. Validated: `all_features` build + full suite (3019 passed, 0 failed); clippy and `cargo +nightly fmt` clean. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * fix(get): make stats-cache consumers work on dc: + persist the cache Phase 3 §2.2 (derived stats cache for dc: inputs). The investigation found the stats-cache "smart" commands don't just miss a cache on dc: handles — they ERROR, so this is a bug fix plus the persist-on-use cache feature. Part A (src/util.rs) — fix: util::get_stats_records canonicalized the raw arg_input, so a "dc:<name>" handle failed with `No such file or directory`. Resolve the dc: prefix to the entry's materialized CSV path up front (and feed that real path to the stats subprocess). This repairs `frequency`, `schema`, `joinp`, `sample`, `pivotp`, and `profile` on dc: inputs, which previously errored. Part B (src/diskcache.rs) — persist-on-use stats cache: resolve_dc_path now captures the `.stats.csv.data.jsonl` sidecar a smart command leaves next to the temp CSV into a durable, content-addressed blob ({blake3}.stats.jsonl.zst) on the next dc: access, and restores it (with a fresh mtime, like the .idx) when the temp copy is gone or stale. So a warm stats cache survives temp-dir cleanup. The blob is freed alongside the data/idx blobs in delete_entry_by_keyhash (content-hash referenced). The BufWriter/Write imports (used only by the get_cloud BlobSink) are gated so a bare `-F get` build stays warning-free. Scope (per the chosen MVP): stats `.data.jsonl` only, captured once per content hash — a richer-mode consumer than the captured cache may still recompute. Frequency cache and full `qsv stats`/`frequency` self-acceleration are follow-ons. tests/test_get.rs: get_dc_stats_cache_for_smart_commands asserts frequency & schema work on dc: and that the stats blob is captured durably. Validated: all_features build + full suite (487 unit + 3020 integration passed, 0 failed); clippy and `cargo +nightly fmt` clean. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * feat(get): unify HTTP downloads — conditional+ranged, drop http-cache middleware Replace the http-cache-reqwest middleware on the HTTP fetch path with a new `ingest_http` that mirrors the cloud path: an ETag/Last-Modified conditional GET that doubles as a size probe (first ranged part), then parallel in-order ranged downloads for large objects. This brings HTTP streaming/ranges (no more whole-body buffering) and unifies the HTTP and cloud ingest paths. - New `ingest_http(opts, root, final_url, auth_token, ckan_resource_hash, is_ckan)`: 304 → not-modified; 206 + known total → stream first part then fetch remaining ranges via buffered concurrency (If-Match guarded); 206 + unknown total → re-fetch whole in one streamed pass; 200 → stream full body. Cache key `HTTP:{opts.source}`; persists ETag + Last-Modified and ckan_api_url only for ckan:// entries. Reuses QSV_GET_PART_SIZE / QSV_GET_CONCURRENCY. - Rewrite `get_resource` HTTP branch to resolve CKAN then delegate to ingest_http; remove QsvCacheManager + CacheManager impl, HttpStored, StoredEntry.http, BoxError, and the http-cache/* imports. - Un-gate BlobSink/BlobSinkWriter/env_u64/DEFAULT_PART_SIZE/ DEFAULT_DL_CONCURRENCY from get_cloud → get (shared by both ingest paths). - Drop deps: http-cache, http-cache-reqwest, http-cache-semantics, reqwest-middleware (4 crates gone from Cargo.lock); `get = ["zstd"]`. - Tests: `_fresh` mock handlers now honor If-None-Match (304) since the unified path always sends a conditional request; un-gate big_csv/serve_big/BIG_ETAG; new `get_http_ranged_download` asserts fan-out (body_sends > 1) and byte-for-byte reassembly. Tradeoff: RFC 9111 Cache-Control max-age freshness is no longer honored (a re-`qsv get` does an ETag/Last-Modified conditional GET → 304 instead of a zero-request hit). Minor for qsv — dc: staleness is governed by RefreshPolicy/ TTL, not http-cache. Also resolves the §2.5 http-cache-alpha tech debt. Full all_features suite: 3021 passed, 0 failed, 42 ignored. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * fix(get): harden ingest_http ranged downloads (roborev #2777) Address three Medium findings in the unified HTTP ranged downloader: - Lazy range generation: follow-up byte-ranges are now produced via `std::iter::from_fn` (consumed lazily by `buffered`) instead of a pre-built `Vec`, so the range list never materializes in full for a huge object + tiny `QSV_GET_PART_SIZE`. Next-offset uses `saturating_add` to avoid overflow on a hostile `Content-Range` total. - Weak-ETag If-Match: `If-Match` requires strong comparison, so a weak validator (`W/"..."`) made compliant origins answer 412 and fail the download. Now `If-Match` is sent only for strong ETags; a weak/absent ETag falls back to an `If-Unmodified-Since` guard from Last-Modified, else relies on per-range validation. - Per-range validation: each follow-up range response must be 206 with a Content-Range matching the requested start/end/total and a body of the exact requested length. A 200 full body, wrong slice, or short read now errors instead of being stitched into the blob (silent corruption). All 27 get tests pass (incl. get_http_ranged_download); fmt + clippy clean. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * fix(get): lazy range generation in ingest_cloud (parity with ingest_http) The cloud ranged-download path pre-built a `Vec` of every outstanding byte-range before streaming, so memory grew with `total / part_size` (unbounded for a huge object + tiny QSV_GET_PART_SIZE), and the `start + part_size` next-offset could overflow on a hostile total — the same class of issue just fixed in `ingest_http` (roborev #2777). Generate the ranges lazily via `std::iter::from_fn` (consumed by `buffered`) so the list never fully materializes, and use `saturating_add` for the next offset. Behavior is otherwise unchanged; object_store still guards each range with If-Match and returns exactly the requested bytes (or errors), so no per-range validation is needed here as on the raw-reqwest HTTP path. All 27 get tests pass (incl. get_s3_multipart_ranged_download); fmt + clippy clean. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * fix(get): scope dc: stats cache by extension; clean BlobSink temp on failure Address roborev #2776 (stats-cache cross-contamination + orphaned blob) and the remaining Low from #2775 (BlobSink temp-file leak). The #2775 Medium (unbounded cloud range Vec) was already fixed in 43aa583. #2776 Medium — stats-cache cross-contamination across extensions: The durable stats blob was keyed only by content hash, but a dc: handle's materialized extension selects the delimiter (.csv => comma, .tsv/.tab => tab, .ssv => semicolon), and two aliases of the same bytes that differ only in extension resolved to the SAME temp dir (keyed by blake3) — so they shared both the on-disk `.stats.csv.data.jsonl` sidecar (same temp stem) and the durable blob, producing wrong schema/frequency for the second delimiter. Now resolve_dc_path isolates each extension in its own temp subdir (`qsv-dc/{blake3}/{ext}/`) AND keys the stats blob by extension (`{blake3}.{ext}.stats.jsonl.zst`), so each delimiter gets its own correct cache. New shared `TABULAR_EXTS` const. #2776 Low — orphaned stats blob on refresh: write_entry's content-changed branch removed the old data + index blobs but not the stats blob; it now reclaims every per-extension stats blob for the old content (delete_entry_by_keyhash does the same). #2775 Low — BlobSink temp-file leak: If an ingest errored between BlobSink::new and finish(), the partial `blobs/ingest-*.tmp` was never removed. BlobSink.writer is now an Option and a Drop impl releases the handle (so Windows can unlink) and removes the temp unless finish() already took it. New regression test get_dc_stats_cache_not_shared_across_extensions proves a .csv alias (3 fields) and a .tsv alias (1 field) of the same bytes keep separate caches. All 28 get tests pass; fmt + clippy clean. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * docs(get): QSV_GET_PART_SIZE/CONCURRENCY apply to HTTP too, require `get` These tuning knobs are read by both ingest_http (HTTP path, `get` feature) and ingest_cloud (cloud path), and env_u64/DEFAULT_PART_SIZE/ DEFAULT_DL_CONCURRENCY are not get_cloud-gated. Correct the ENVIRONMENT_VARIABLES table, which described them as cloud-only and requiring the get_cloud feature. (roborev/Copilot review on #3958) Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Bumps redis from 0.29.5 to 0.32.0.
Release notes
Sourced from redis's releases.
Commits
Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting
@dependabot rebase.Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR:
@dependabot rebasewill rebase this PR@dependabot recreatewill recreate this PR, overwriting any edits that have been made to it@dependabot mergewill merge this PR after your CI passes on it@dependabot squash and mergewill squash and merge this PR after your CI passes on it@dependabot cancel mergewill cancel a previously requested merge and block automerging@dependabot reopenwill reopen this PR if it is closed@dependabot closewill close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually@dependabot show <dependency name> ignore conditionswill show all of the ignore conditions of the specified dependency@dependabot ignore this major versionwill close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)@dependabot ignore this minor versionwill close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)@dependabot ignore this dependencywill close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)