Skip to content

[8.4] Fix cursor logical leak - [MOD-12807]#7667

Merged
GuyAv46 merged 3 commits into8.4from
guyav-MOD-12807
Dec 9, 2025
Merged

[8.4] Fix cursor logical leak - [MOD-12807]#7667
GuyAv46 merged 3 commits into8.4from
guyav-MOD-12807

Conversation

@GuyAv46
Copy link
Collaborator

@GuyAv46 GuyAv46 commented Dec 7, 2025

Describe the changes in the pull request

Fix 2 cursor leaks, which will cause the cursor to never be freed (along with the original query allocated context)

This fix was split from #7571, as we are not going to backport it.

  1. Leak on FT.CURSOR PROFILE if the cursor is not for profiling - This command is internal, so this bug shouldn't affect anyone.
  2. Leak on FT.CURSOR READ if the cursor still exists, but the index was dropped - may affect users who use cursors + drop their indexes, if they attempt to read from a cursor right after the index was dropped (or around the same time when using multi-threading)

Mark if applicable

  • This PR introduces API changes
  • This PR introduces serialization changes

Note

Free/cleanup cursors when index is dropped during cursor READ and pause cursor on PROFILE mismatch, with a new test verifying idle cursor deletion.

  • Backend (cursor management):
    • In src/aggregate/aggregate_exec.c cursorRead(): on invalid spec (index dropped), now Cursor_Free(cursor) before replying with error.
    • In RSCursorCommand PROFILE path: if request is not profile, now Cursor_Pause(cursor) before returning error.
  • Tests:
    • Add tests/pytests/test_issues.py::test_mod_12807 to assert cursor READ after index drop errors and removes the idle cursor.

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

@GuyAv46 GuyAv46 requested a review from alonre24 December 7, 2025 13:05
@github-actions github-actions bot added the size:S label Dec 7, 2025
@GuyAv46 GuyAv46 changed the title Fix cursor logical leak - [MOD-12807] [8.4] Fix cursor logical leak - [MOD-12807] Dec 7, 2025
@codecov
Copy link

codecov bot commented Dec 7, 2025

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 85.94%. Comparing base (3249c75) to head (11978c4).
⚠️ Report is 3 commits behind head on 8.4.

Additional details and impacted files
@@            Coverage Diff             @@
##              8.4    #7667      +/-   ##
==========================================
- Coverage   85.96%   85.94%   -0.03%     
==========================================
  Files         331      331              
  Lines       52875    52877       +2     
  Branches    11998    11998              
==========================================
- Hits        45454    45443      -11     
- Misses       7254     7267      +13     
  Partials      167      167              
Flag Coverage Δ
flow 84.50% <100.00%> (-0.14%) ⬇️
unit 52.57% <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.

@GuyAv46 GuyAv46 enabled auto-merge December 8, 2025 15:38
@GuyAv46 GuyAv46 added this pull request to the merge queue Dec 8, 2025
@github-merge-queue github-merge-queue bot removed this pull request from the merge queue due to failed status checks Dec 8, 2025
@GuyAv46 GuyAv46 added this pull request to the merge queue Dec 9, 2025
Merged via the queue into 8.4 with commit 461908e Dec 9, 2025
26 checks passed
@GuyAv46 GuyAv46 deleted the guyav-MOD-12807 branch December 9, 2025 07:51
@redisearch-backport-pull-request
Copy link
Contributor

Backport failed for 2.8, because it was unable to cherry-pick the commit(s).

Please cherry-pick the changes locally and resolve any conflicts.

git fetch origin 2.8
git worktree add -d .worktree/backport-7667-to-2.8 origin/2.8
cd .worktree/backport-7667-to-2.8
git switch --create backport-7667-to-2.8
git cherry-pick -x 461908e65b02018109956c3149294e48145c59bb

@redisearch-backport-pull-request
Copy link
Contributor

Backport failed for 2.10, because it was unable to cherry-pick the commit(s).

Please cherry-pick the changes locally and resolve any conflicts.

git fetch origin 2.10
git worktree add -d .worktree/backport-7667-to-2.10 origin/2.10
cd .worktree/backport-7667-to-2.10
git switch --create backport-7667-to-2.10
git cherry-pick -x 461908e65b02018109956c3149294e48145c59bb

@redisearch-backport-pull-request
Copy link
Contributor

Backport failed for 8.2, because it was unable to cherry-pick the commit(s).

Please cherry-pick the changes locally and resolve any conflicts.

git fetch origin 8.2
git worktree add -d .worktree/backport-7667-to-8.2 origin/8.2
cd .worktree/backport-7667-to-8.2
git switch --create backport-7667-to-8.2
git cherry-pick -x 461908e65b02018109956c3149294e48145c59bb

GuyAv46 added a commit that referenced this pull request Dec 9, 2025
* add a failing test

* fix

(cherry picked from commit 461908e)
GuyAv46 added a commit that referenced this pull request Dec 9, 2025
* add a failing test

* fix

(cherry picked from commit 461908e)
GuyAv46 added a commit that referenced this pull request Dec 9, 2025
* add a failing test

* fix

(cherry picked from commit 461908e)
github-merge-queue bot pushed a commit that referenced this pull request Dec 9, 2025
[8.4] Fix cursor logical leak - [MOD-12807] (#7667)

* add a failing test

* fix

(cherry picked from commit 461908e)
github-merge-queue bot pushed a commit that referenced this pull request Dec 9, 2025
* [8.4] Fix cursor logical leak - [MOD-12807] (#7667)

* add a failing test

* fix

(cherry picked from commit 461908e)

* fix test for 2.x
github-merge-queue bot pushed a commit that referenced this pull request Dec 9, 2025
* [8.4] Fix cursor logical leak - [MOD-12807] (#7667)

* add a failing test

* fix

(cherry picked from commit 461908e)

* remove impossible test for 2.x

* fix test for 2.x
alonre24 added a commit to alonre24/redis that referenced this pull request Jan 26, 2026
**Bug Fixes:**

* [redis#7385](RediSearch/RediSearch#7385) Fix high temporary memory consumption when loading multiple search indexes from RDB
* [redis#7430](RediSearch/RediSearch#7430) Fix a potential deadlock in `FT.HYBRID` in cluster mode during updates.
* [redis#7454](RediSearch/RediSearch#7454) Fix a garbage collection performence regression
* [redis#7460](RediSearch/RediSearch#7460) Fix potential double-free in Fork GC error paths
* [redis#7455](RediSearch/RediSearch#7455) Fix internal cursors not being deleted promptly in cluster mode
* [redis#7667](RediSearch/RediSearch#7667) Fix a cursor logical leak upon dropping the index
* [redis#7796](RediSearch/RediSearch#7796) Fix a potential use-after-free when removing connections
* [redis#7792](RediSearch/RediSearch#7792) Fix string comparison for binary data with embedded NULLs in TOLIST reducer in FT.AGGREGATE
* [redis#7823](RediSearch/RediSearch#7823) Update `FT.HYBRID` to accept vector blobs only via parameters
* [redis#7903](RediSearch/RediSearch#7903) Fix a memory leak in Hybrid ASM
* [redis#8052](RediSearch/RediSearch#8052) Fix `FT.HYBRID` behavior when used with `LOAD *`
* [redis#8082](RediSearch/RediSearch#8082) Fix incorrect FULLTEXT field metric counts
* [redis#8089](RediSearch/RediSearch#8089) Fix an edge case in `CLUSTERSET` handling
* [redis#8152](RediSearch/RediSearch#8152) Fix configuration registration issues

**Improvements:**

* [redis#7427](RediSearch/RediSearch#7427) Enhance `FT.PROFILE` with vector search execution details
* [redis#7431](RediSearch/RediSearch#7431) Ensure full `FT.PROFILE` output is returned on timeout with RETURN policy
* [redis#7507](RediSearch/RediSearch#7507) Track timeout warnings and errors in INFO
* [redis#7576](RediSearch/RediSearch#7576) Track OOM warnings and errors in INFO
* [redis#7612](RediSearch/RediSearch#7612) Track `maxprefixexpansions` warnings and errors in INFO
* [redis#7960](RediSearch/RediSearch#7960) Persist query warnings across cursor reads
* [redis#7551](RediSearch/RediSearch#7551), [redis#7616](RediSearch/RediSearch#7616), [redis#7622](RediSearch/RediSearch#7622), [redis#7625](RediSearch/RediSearch#7625) Add runtime thread and pending-jobs metrics
* [redis#7589](RediSearch/RediSearch#7589) Support multiple slot ranges in `search.CLUSTERSET`
* [redis#7707](RediSearch/RediSearch#7707) Add `WITHCOUNT` support to `FT.AGGREGATE`
* [redis#7862](RediSearch/RediSearch#7862) Add support for subquery `COUNT` in `FT.HYBRID`
* [redis#8087](RediSearch/RediSearch#8087) Add warnings when cursor results may be affected by ASM and expose ASM warnings in `FT.PROFILE`
* [redis#8049](RediSearch/RediSearch#8049) Add logging for index-related commands
* [redis#8150](RediSearch/RediSearch#8150) Fix shard total profile time reporting in `FT.PROFILE`
YaacovHazan pushed a commit to redis/redis that referenced this pull request Jan 26, 2026
**Bug Fixes:**

* [#7385](RediSearch/RediSearch#7385) Fix high
temporary memory consumption when loading multiple search indexes from
RDB
* [#7430](RediSearch/RediSearch#7430) Fix a
potential deadlock in `FT.HYBRID` in cluster mode during updates.
* [#7454](RediSearch/RediSearch#7454) Fix a
garbage collection performence regression
* [#7460](RediSearch/RediSearch#7460) Fix
potential double-free in Fork GC error paths
* [#7455](RediSearch/RediSearch#7455) Fix
internal cursors not being deleted promptly in cluster mode
* [#7667](RediSearch/RediSearch#7667) Fix a
cursor logical leak upon dropping the index
* [#7796](RediSearch/RediSearch#7796) Fix a
potential use-after-free when removing connections
* [#7792](RediSearch/RediSearch#7792) Fix string
comparison for binary data with embedded NULLs in TOLIST reducer in
FT.AGGREGATE
* [#7704](RediSearch/RediSearch#7704) Use
asynchronous jobs for GC in SVS to accelerate execution
* [#7823](RediSearch/RediSearch#7823) Update
`FT.HYBRID` to accept vector blobs only via parameters
* [#7903](RediSearch/RediSearch#7903) Fix a
memory leak in Hybrid ASM
* [#8052](RediSearch/RediSearch#8052) Fix
`FT.HYBRID` behavior when used with `LOAD *`
* [#8082](RediSearch/RediSearch#8082) Fix
incorrect FULLTEXT field metric counts
* [#8089](RediSearch/RediSearch#8089) Fix an
edge case in `CLUSTERSET` handling
* [#8152](RediSearch/RediSearch#8152) Fix
configuration registration issues

**Improvements:**

* [#7427](RediSearch/RediSearch#7427) Enhance
`FT.PROFILE` with vector search execution details
* [#7431](RediSearch/RediSearch#7431) Ensure
full `FT.PROFILE` output is returned on timeout with RETURN policy
* [#7507](RediSearch/RediSearch#7507) Track
timeout warnings and errors in INFO
* [#7576](RediSearch/RediSearch#7576) Track OOM
warnings and errors in INFO
* [#7612](RediSearch/RediSearch#7612) Track
`maxprefixexpansions` warnings and errors in INFO
* [#7960](RediSearch/RediSearch#7960) Persist
query warnings across cursor reads
* [#7551](RediSearch/RediSearch#7551),
[#7616](RediSearch/RediSearch#7616),
[#7622](RediSearch/RediSearch#7622),
[#7625](RediSearch/RediSearch#7625) Add runtime
thread and pending-jobs metrics
* [#7589](RediSearch/RediSearch#7589) Support
multiple slot ranges in `search.CLUSTERSET`
* [#7707](RediSearch/RediSearch#7707) Add
`WITHCOUNT` support to `FT.AGGREGATE`
* [#7862](RediSearch/RediSearch#7862) Add
support for subquery `COUNT` in `FT.HYBRID`
* [#8087](RediSearch/RediSearch#8087) Add
warnings when cursor results may be affected by ASM and expose ASM
warnings in `FT.PROFILE`
* [#8049](RediSearch/RediSearch#8049) Add
logging for index-related commands
* [#8150](RediSearch/RediSearch#8150) Fix shard
total profile time reporting in `FT.PROFILE`
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants