Skip to content

[8.2] MOD-11751: Support WITHCOUNT keyword in FT.AGGREGATE #7710

Merged
nafraf merged 8 commits into8.2from
nafraf_backport-7202-to-8.2
Dec 22, 2025
Merged

[8.2] MOD-11751: Support WITHCOUNT keyword in FT.AGGREGATE #7710
nafraf merged 8 commits into8.2from
nafraf_backport-7202-to-8.2

Conversation

@nafraf
Copy link
Collaborator

@nafraf nafraf commented Dec 10, 2025

Manual backport #7202 to 8.2


Note

Implements FT.AGGREGATE WITHCOUNT, adding pipeline depleter and a coordinator shard-response barrier to compute accurate total_results, plus related flagging, sorting/plan tweaks, timeout-aware channel ops, and extensive tests.

  • FT.AGGREGATE + WITHCOUNT:
    • Introduces QEXEC_F_HAS_WITHCOUNT, request helpers, gating via ENABLE_UNSTABLE_FEATURES, and mutual exclusion with WITHCURSOR.
    • Computes accurate total_results using a new pipeline strategy (no optimizer short-circuit) and coordination logic.
  • Result Processors:
    • Adds RP_DEPLETER to fully consume upstream and then page/limit; integrated where needed for WITHCOUNT.
    • Profile output updated to include Depleter type.
  • Coordinator/Cluster:
    • Adds shard-level response barrier to wait for first replies and aggregate total_results (RESP2/RESP3), with error/timeout handling.
    • Extends RMR: per-shard tracking, iterator private data, timed channel pop (MRChannel_PopWithTimeout), and MRIterator_NextWithTimeout.
    • Refactors net callback and RPNet to use the barrier; drains remaining replies for PROFILE.
  • Planning/Parsing:
    • NewArrangeStep, explicit flags for SORTBY, GROUPBY; zero-length sortKeys handling; hasQuerySortby now checks length.
    • Optimizer respects undecided type; arrange step requirement logic adjusted for WITHCOUNT.
  • Utilities:
    • Array array_del uses memmove; timeout helpers for timespec math.
  • Tests:
    • Extensive new tests for WITHCOUNT semantics (limits, sort/group/load/filter, ADDSCORES), barrier behavior (delays, timeouts, errors, concurrency), paging parity, profile expectations, and unstable-features guard.

Written by Cursor Bugbot for commit 83a39d8. This will update automatically on new commits. Configure here.

@nafraf nafraf force-pushed the nafraf_backport-7202-to-8.2 branch from 2f4f95d to d52b2cb Compare December 10, 2025 20:15
@nafraf nafraf force-pushed the nafraf_backport-7202-to-8.2 branch from b877b20 to 6cd63d0 Compare December 13, 2025 16:43
@oshadmi oshadmi marked this pull request as ready for review December 15, 2025 11:32
@codecov
Copy link

codecov bot commented Dec 15, 2025

Codecov Report

❌ Patch coverage is 93.96552% with 35 lines in your changes missing coverage. Please review.
✅ Project coverage is 89.58%. Comparing base (4d16f23) to head (83a39d8).
⚠️ Report is 12 commits behind head on 8.2.

Files with missing lines Patch % Lines
src/coord/dist_utils.c 87.25% 13 Missing ⚠️
src/coord/rpnet.c 95.91% 12 Missing ⚠️
src/coord/rmr/chan.c 86.48% 5 Missing ⚠️
src/aggregate/aggregate_request.c 95.23% 3 Missing ⚠️
src/util/timeout.h 60.00% 2 Missing ⚠️
Additional details and impacted files
@@            Coverage Diff             @@
##              8.2    #7710      +/-   ##
==========================================
+ Coverage   89.53%   89.58%   +0.05%     
==========================================
  Files         253      256       +3     
  Lines       41365    41705     +340     
  Branches     3719     3719              
==========================================
+ Hits        37035    37361     +326     
- Misses       4281     4295      +14     
  Partials       49       49              
Flag Coverage Δ
flow 82.37% <93.96%> (-0.49%) ⬇️
unit 47.27% <7.58%> (-0.27%) ⬇️

Flags with carried forward coverage won't be shown. Click here to find out more.

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

@nafraf nafraf requested a review from oshadmi December 15, 2025 12:28
@nafraf nafraf added this pull request to the merge queue Dec 22, 2025
Merged via the queue into 8.2 with commit 2813e94 Dec 22, 2025
23 checks passed
@nafraf nafraf deleted the nafraf_backport-7202-to-8.2 branch December 22, 2025 18:11
alonre24 added a commit to alonre24/redis that referenced this pull request Jan 26, 2026
**Bug Fixes:**

* [redis#7219](RediSearch/RediSearch#7219) Fix a concurrency issue on Reducer in `FT.AGGREGATE`
* [redis#7255](RediSearch/RediSearch#7255) Fix `BM25STD` underflow wraparound
* [redis#7275](RediSearch/RediSearch#7275) Report used memory as `unsigned long long` to avoid underflows
* [redis#7264](RediSearch/RediSearch#7264) Fix `totalDocsLen` updates
* [redis#6995](RediSearch/RediSearch#6995) Do not fanout `FT.INFO` to replicas
* [redis#7350](RediSearch/RediSearch#7350) Fix `FT.CREATE` failure with LeanVec parameters on non-Intel architectures
* [redis#7384](RediSearch/RediSearch#7384) Fix index load from RDB temporary memory overhead
* [redis#7459](RediSearch/RediSearch#7459) Fix Fork GC potential double-free on error path
* [redis#7458](RediSearch/RediSearch#7458) Fix a GC performence regression
* [redis#7470](RediSearch/RediSearch#7470) Avoid draining worker thread pool from FLUSH callback to avoid deadlocks
* [redis#7554](RediSearch/RediSearch#7554) Handle the case where `SCORE` is sent alone without extra fields (coordinator)
* [redis#7685](RediSearch/RediSearch#7685) Fix cursor logical leak
* [redis#7794](RediSearch/RediSearch#7794) Fix `cmp_strings()` to correctly handle binary data with embedded NULLs in TOLIST reducer in FT.AGGREGATE
* [redis#7873](RediSearch/RediSearch#7873) Handle warnings in empty `FT.AGGREGATE` replies (cluster)
* [redis#7886](RediSearch/RediSearch#7886) Remove non-TEXT fields from the spec keys dictionary
* [redis#7904](RediSearch/RediSearch#7904) Refactor keys dictionary handling
* [redis#7901](RediSearch/RediSearch#7901) Support multiple warnings in reply
* [redis#8083](RediSearch/RediSearch#8083) Fix incorrect FULLTEXT field metric counts
* [redis#8153](RediSearch/RediSearch#8153) Fix configuration registration issues

**Improvements:**

* [redis#7154](RediSearch/RediSearch#7154) `FT.AGGREGATE` can return Background Indexing OOM warnings
* [redis#7083](RediSearch/RediSearch#7083) Add the default text scorer as a configuration option
* [redis#7341](RediSearch/RediSearch#7341) Rename `FT.PROFILE` counter fields
* [redis#7436](RediSearch/RediSearch#7436) Enhance `FT.PROFILE` with vector search execution details
* [redis#7435](RediSearch/RediSearch#7435) Ensure full `FT.PROFILE` output on timeout with RETURN policy
* [redis#7534](RediSearch/RediSearch#7534) Reduce the number of worker threads asynchronously to avoid deadlocks during queries
* [redis#7614](RediSearch/RediSearch#7614) Track timeout warnings and errors in INFO
* [redis#7646](RediSearch/RediSearch#7646) Track `maxprefixexpansions` warnings and errors in INFO
* [redis#7577](RediSearch/RediSearch#7577) Track query syntax/argument errors (basis for query error tracking)
* [redis#7737](RediSearch/RediSearch#7737) Add `Internal cursor reads` metric to cluster `FT.PROFILE` output
* [redis#7759](RediSearch/RediSearch#7759) Extend indexing metrics
* [redis#7710](RediSearch/RediSearch#7710) Support `WITHCOUNT` keyword in `FT.AGGREGATE`
* [redis#7957](RediSearch/RediSearch#7957) Persist query warnings across cursor reads
* [redis#8054](RediSearch/RediSearch#8054) Add logging for index-related commands
* [redis#8151](RediSearch/RediSearch#8151) Fix shard total profile time reporting in `FT.PROFILE`
* [redis#8103](RediSearch/RediSearch#8103) Output current thread IndexSpec information on crash
YaacovHazan pushed a commit to redis/redis that referenced this pull request Jan 26, 2026
**Bug Fixes:**

* [#7219](RediSearch/RediSearch#7219) Fix a
concurrency issue on Reducer in `FT.AGGREGATE`
* [#7255](RediSearch/RediSearch#7255) Fix
`BM25STD` underflow wraparound
* [#7275](RediSearch/RediSearch#7275) Report
used memory as `unsigned long long` to avoid underflows
* [#7264](RediSearch/RediSearch#7264) Fix
`totalDocsLen` updates
* [#6995](RediSearch/RediSearch#6995) Do not
fanout `FT.INFO` to replicas
* [#7350](RediSearch/RediSearch#7350) Fix
`FT.CREATE` failure with LeanVec parameters on non-Intel architectures
* [#7694](RediSearch/RediSearch#7694) Use
asynchronous jobs for GC in SVS to accelerate execution
* [#7384](RediSearch/RediSearch#7384) Fix index
load from RDB temporary memory overhead
* [#7459](RediSearch/RediSearch#7459) Fix Fork
GC potential double-free on error path
* [#7458](RediSearch/RediSearch#7458) Fix a GC
performence regression
* [#7470](RediSearch/RediSearch#7470) Avoid
draining worker thread pool from FLUSH callback to avoid deadlocks
* [#7554](RediSearch/RediSearch#7554) Handle the
case where `SCORE` is sent alone without extra fields (coordinator)
* [#7685](RediSearch/RediSearch#7685) Fix cursor
logical leak
* [#7794](RediSearch/RediSearch#7794) Fix
`cmp_strings()` to correctly handle binary data with embedded NULLs in
TOLIST reducer in FT.AGGREGATE
* [#7873](RediSearch/RediSearch#7873) Handle
warnings in empty `FT.AGGREGATE` replies (cluster)
* [#7886](RediSearch/RediSearch#7886) Remove
non-TEXT fields from the spec keys dictionary
* [#7904](RediSearch/RediSearch#7904) Refactor
keys dictionary handling
* [#7901](RediSearch/RediSearch#7901) Support
multiple warnings in reply
* [#8083](RediSearch/RediSearch#8083) Fix
incorrect FULLTEXT field metric counts
* [#8153](RediSearch/RediSearch#8153) Fix
configuration registration issues

**Improvements:**

* [#7154](RediSearch/RediSearch#7154)
`FT.AGGREGATE` can return Background Indexing OOM warnings
* [#7083](RediSearch/RediSearch#7083) Add the
default text scorer as a configuration option
* [#7341](RediSearch/RediSearch#7341) Rename
`FT.PROFILE` counter fields
* [#7436](RediSearch/RediSearch#7436) Enhance
`FT.PROFILE` with vector search execution details
* [#7435](RediSearch/RediSearch#7435) Ensure
full `FT.PROFILE` output on timeout with RETURN policy
* [#7534](RediSearch/RediSearch#7534) Reduce the
number of worker threads asynchronously to avoid deadlocks during
queries
* [#7614](RediSearch/RediSearch#7614) Track
timeout warnings and errors in INFO
* [#7646](RediSearch/RediSearch#7646) Track
`maxprefixexpansions` warnings and errors in INFO
* [#7577](RediSearch/RediSearch#7577) Track
query syntax/argument errors (basis for query error tracking)
* [#7737](RediSearch/RediSearch#7737) Add
`Internal cursor reads` metric to cluster `FT.PROFILE` output
* [#7759](RediSearch/RediSearch#7759) Extend
indexing metrics
* [#7710](RediSearch/RediSearch#7710) Support
`WITHCOUNT` keyword in `FT.AGGREGATE`
* [#7957](RediSearch/RediSearch#7957) Persist
query warnings across cursor reads
* [#8054](RediSearch/RediSearch#8054) Add
logging for index-related commands
* [#8151](RediSearch/RediSearch#8151) Fix shard
total profile time reporting in `FT.PROFILE`
* [#8103](RediSearch/RediSearch#8103) Output
current thread IndexSpec information on crash
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants