Skip to content

build(deps): bump redis from 0.29.5 to 0.32.0#2776

Closed
dependabot[bot] wants to merge 1 commit into
masterfrom
dependabot/cargo/redis-0.32.0
Closed

build(deps): bump redis from 0.29.5 to 0.32.0#2776
dependabot[bot] wants to merge 1 commit into
masterfrom
dependabot/cargo/redis-0.32.0

Conversation

@dependabot
Copy link
Copy Markdown
Contributor

@dependabot dependabot Bot commented on behalf of github Jun 6, 2025

Bumps redis from 0.29.5 to 0.32.0.

Release notes

Sourced from redis's releases.

redis-0.31.0

Changes & Bug fixes

redis-0.30.0

Changes & Bug fixes

Documentation & CI improvements

Commits

Dependabot compatibility score

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 rebase will rebase this PR
  • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
  • @dependabot merge will merge this PR after your CI passes on it
  • @dependabot squash and merge will squash and merge this PR after your CI passes on it
  • @dependabot cancel merge will cancel a previously requested merge and block automerging
  • @dependabot reopen will reopen this PR if it is closed
  • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
  • @dependabot show <dependency name> ignore conditions will show all of the ignore conditions of the specified dependency
  • @dependabot ignore this major version will 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 version will 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 dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)

@dependabot dependabot Bot added dependencies Pull requests that update a dependency file rust Pull requests that update Rust code labels Jun 6, 2025
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>
@dependabot dependabot Bot force-pushed the dependabot/cargo/redis-0.32.0 branch from c2a1359 to cf0e849 Compare June 10, 2025 10:37
@dependabot @github
Copy link
Copy Markdown
Contributor Author

dependabot Bot commented on behalf of github Jun 10, 2025

Looks like redis is up-to-date now, so this is no longer needed.

@dependabot dependabot Bot closed this Jun 10, 2025
@dependabot dependabot Bot deleted the dependabot/cargo/redis-0.32.0 branch June 10, 2025 11:22
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>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

dependencies Pull requests that update a dependency file rust Pull requests that update Rust code

Projects

None yet

Development

Successfully merging this pull request may close these issues.

0 participants