Skip to content

[8.2] [MOD-12417] Track maxprefixexpansions errors and warnings in info#7646

Merged
lerman25 merged 4 commits into8.2from
backport-7570-to-8.2
Dec 4, 2025
Merged

[8.2] [MOD-12417] Track maxprefixexpansions errors and warnings in info#7646
lerman25 merged 4 commits into8.2from
backport-7570-to-8.2

Conversation

@lerman25
Copy link
Collaborator

@lerman25 lerman25 commented Dec 4, 2025

backport #7570 to 8.2


Note

Add tracking and INFO exposure of max-prefix-expansions warnings, wiring them through execution, global stats, and tests for SA and cluster.

  • Stats/Info:
    • Add maxPrefixExpansion to QueryWarningGlobalStats and propagate via TotalGlobalStats_GetQueryStats.
    • Expose new metrics in INFO MODULES: shard_total_query_warnings_max_prefix_expansions and coord_total_query_warnings_max_prefix_expansions.
    • Update QueryWarningsGlobalStats_UpdateWarning to handle QUERY_WARNING_CODE_REACHED_MAX_PREFIX_EXPANSIONS.
  • Execution:
    • In aggregate_exec.c, increment warning counters when req->qiter.err->reachedMaxPrefixExpansions and include warning in RESP2/RESP3 replies; pass flag in ProfilePrinterCtx.
  • API/Header:
    • Remove unused QueryError_*ReachedMaxPrefixExpansionsWarning declarations; keep warning code in QUERY_XWARNS.
  • Tests:
    • Extend tests/pytests/test_info_modules.py to validate new metrics in standalone and cluster modes; minor setup tweak to FT.CREATE with PREFIX.

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

@github-actions github-actions bot added the size:M label Dec 4, 2025
# Test max prefix expansions warning in FT.HYBRID
# "hello*" will match "hello", "helloworld" - 2 terms, but limit is 1
query_vec = np.array([1.2, 0.2]).astype(np.float32).tobytes()
self.env.expect('FT.HYBRID', 'idx_vec', 'SEARCH', 'hello*', 'VSIM', '@vector', query_vec).noError()
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Bug: Test uses undefined index idx_vec causing test failure

The test_max_prefix_expansions_SA and test_max_prefix_expansions_cluster tests execute FT.HYBRID commands against an index named idx_vec, but this index is never created. The test setup functions _common_warnings_errors_test_scenario and _common_warnings_errors_cluster_test_scenario only create an index named idx with a TEXT field schema. The tests add documents with vector data (vec:3, vec:4, vec:maxprefix:*) but there's no corresponding vector index to support the FT.HYBRID query. These tests will fail at runtime because the index doesn't exist.

Additional Locations (1)

Fix in Cursor Fix in Web

// Non-fatal error
RedisModule_Reply_SimpleString(reply, QueryError_GetUserError(req->qiter.err));
} else if (req->qiter.err->reachedMaxPrefixExpansions) {
QueryWarningsGlobalStats_UpdateWarning(QUERY_WARNING_CODE_REACHED_MAX_PREFIX_EXPANSIONS, 1, !IsInternal(req));
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Bug: Inconsistent warning tracking between RESP2 and RESP3 paths

The max prefix expansions warning is tracked inconsistently between code paths. In one path (around line 535), timeout and maxPrefixExpansions warnings are tracked independently using separate if statements, allowing both to be counted for the same query. In the other path (line 672), the maxPrefixExpansions check uses else if after the timeout check, making them mutually exclusive. This means if a query both times out and reaches max prefix expansions, statistics will differ based on which code path executes - one path increments both counters while the other only increments the timeout counter.

Additional Locations (1)

Fix in Cursor Fix in Web

…7612](#7612))

[MOD-12417] Track maxprefixexpansions errors and warnings in info ([#7570](#7570))

track maxprefixexpanions

(cherry picked from commit dd37ef9)
(cherry picked from commit 6af7bf2)
@lerman25 lerman25 force-pushed the backport-7570-to-8.2 branch from 5dc74b8 to 79832e7 Compare December 4, 2025 07:04
@lerman25 lerman25 force-pushed the backport-7570-to-8.2 branch from 7ec1e21 to cf2c995 Compare December 4, 2025 08:10
@lerman25 lerman25 enabled auto-merge December 4, 2025 08:12
@lerman25 lerman25 force-pushed the backport-7570-to-8.2 branch from 2ebddc9 to b67bba8 Compare December 4, 2025 08:59
@codecov
Copy link

codecov bot commented Dec 4, 2025

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 89.52%. Comparing base (c922ddc) to head (1686d4c).
⚠️ Report is 3 commits behind head on 8.2.

Additional details and impacted files
@@            Coverage Diff             @@
##              8.2    #7646      +/-   ##
==========================================
- Coverage   89.54%   89.52%   -0.02%     
==========================================
  Files         253      253              
  Lines       41290    41300      +10     
  Branches     3725     3725              
==========================================
+ Hits        36972    36973       +1     
- Misses       4269     4278       +9     
  Partials       49       49              
Flag Coverage Δ
flow 82.58% <100.00%> (+0.22%) ⬆️
unit 47.42% <0.00%> (+<0.01%) ⬆️

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.

@lerman25 lerman25 added this pull request to the merge queue Dec 4, 2025
Merged via the queue into 8.2 with commit 15a9408 Dec 4, 2025
23 checks passed
@lerman25 lerman25 deleted the backport-7570-to-8.2 branch December 4, 2025 13:12
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