Skip to content

fix(push): fix peeking when push name is truncated#3842

Merged
ndyakov merged 3 commits into
masterfrom
ndyakov/fix-3839-resp3-pubsub-message-loss
Jun 11, 2026
Merged

fix(push): fix peeking when push name is truncated#3842
ndyakov merged 3 commits into
masterfrom
ndyakov/fix-3839-resp3-pubsub-message-loss

Conversation

@ndyakov

@ndyakov ndyakov commented Jun 3, 2026

Copy link
Copy Markdown
Member

fixes #3839


Note

Medium Risk
Changes low-level RESP3 read/peek behavior on live connections (may block briefly) on a path used by pub/sub and push draining; well-covered by regression tests but affects core protocol parsing.

Overview
Fixes #3839, where RESP3 pub/sub could lose messages because PeekPushNotificationName only inspected already-buffered bytes and could return a truncated notification name (e.g. "messa"). The push processor then mis-routed the frame and ReadReply dropped it.

PeekPushNotificationName now grows the peek window (36 → up to 4096) and reads more from the connection until the header is complete or the read fails, instead of capping at Buffered(). Parsing is refactored into parsePushNotificationName and skipDigitsThenCRLF, which separate incomplete prefixes from corrupt frames and avoid returning partial names; malformed cases include empty array length, EOF mid-header, and overflow-safe bulk length handling.

Tests add chunked-read boundaries, malformed/overflow cases, and a ProcessPendingNotifications regression that delivers 1000 RESP3 message frames through the same drain-then-ReadReply path as PubSub.ReceiveTimeout.

Reviewed by Cursor Bugbot for commit 1329d10. Bugbot is set up for automated code reviews on this repo. Configure here.

@jit-ci

jit-ci Bot commented Jun 3, 2026

Copy link
Copy Markdown

🛡️ Jit Security Scan Results

CRITICAL HIGH MEDIUM

✅ No security findings were detected in this PR


Security scan by Jit

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

Fixes RESP3 Pub/Sub message loss (issue #3839) by making push-notification name peeking robust when the push frame header is only partially buffered, preventing misclassification of truncated names (e.g. "messa") that previously caused frames to be consumed/dropped.

Changes:

  • Update Reader.PeekPushNotificationName to iteratively peek more bytes (with an upper bound) and parse the push header without returning truncated names.
  • Add a small RESP3 push-header parser (parsePushNotificationName + skipDigitsThenCRLF) to distinguish incomplete vs malformed headers.
  • Add regression tests reproducing the bufio boundary truncation scenario both at the proto layer and via ProcessPendingNotifications.

Reviewed changes

Copilot reviewed 3 out of 3 changed files in this pull request and generated 2 comments.

File Description
push/processor_unit_test.go Adds an end-to-end regression test reproducing #3839 through the push processor path.
internal/proto/reader.go Reworks push-notification name peeking to grow peek windows and parse headers safely.
internal/proto/peek_push_notification_test.go Adds chunk-boundary tests ensuring peeking never returns a truncated push name and surfaces EOF correctly.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment thread internal/proto/reader.go
Comment thread internal/proto/peek_push_notification_test.go Outdated
@ndyakov ndyakov changed the title fix(push): Fix peeking when push name is truncated fix(push): fix peeking when push name is truncated Jun 4, 2026
ofekshenawa
ofekshenawa previously approved these changes Jun 10, 2026

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

Copilot reviewed 3 out of 3 changed files in this pull request and generated 1 comment.

Comment thread internal/proto/reader.go Outdated

@cursor cursor Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Cursor Bugbot has reviewed your changes and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, have a team admin enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit 1329d10. Configure here.

Comment thread internal/proto/reader.go
@ndyakov
ndyakov merged commit 10dc44f into master Jun 11, 2026
40 checks passed
@ndyakov
ndyakov deleted the ndyakov/fix-3839-resp3-pubsub-message-loss branch June 11, 2026 07:09
rohitkumarankam pushed a commit to rohitkumarankam/forgejo that referenced this pull request Jun 11, 2026
This PR contains the following updates:

| Package | Change | [Age](https://docs.renovatebot.com/merge-confidence/) | [Confidence](https://docs.renovatebot.com/merge-confidence/) |
|---|---|---|---|
| [github.com/redis/go-redis/v9](https://github.com/redis/go-redis) | `v9.20.0` → `v9.20.1` | ![age](https://developer.mend.io/api/mc/badges/age/go/github.com%2fredis%2fgo-redis%2fv9/v9.20.1?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/go/github.com%2fredis%2fgo-redis%2fv9/v9.20.0/v9.20.1?slim=true) |

---

### Release Notes

<details>
<summary>redis/go-redis (github.com/redis/go-redis/v9)</summary>

### [`v9.20.1`](https://github.com/redis/go-redis/releases/tag/v9.20.1): 9.20.1

[Compare Source](redis/go-redis@v9.20.0...v9.20.1)

This is a patch release containing bug fixes only. There are no new features or breaking changes; upgrading from 9.20.0 is a drop-in replacement.

#### 🚀 Highlights

##### RESP3 pub/sub message loss fixed

`PeekPushNotificationName` previously inspected only the bytes already buffered by `bufio`, so when a push frame header straddled a buffer fill boundary it could return a **truncated** notification name (e.g. `"messa"` instead of `"message"`). The push processor then mis-routed the frame and `ReadReply` silently dropped it, causing intermittent RESP3 pub/sub message loss. The peek now grows its window (36 bytes → up to 4 KiB) and reads more from the connection until the header is complete, cleanly separating incomplete prefixes from corrupt frames (including overflow-safe bulk-length handling). Fixes [#&#8203;3839](redis/go-redis#3839).

([#&#8203;3842](redis/go-redis#3842)) by [@&#8203;ndyakov](https://github.com/ndyakov)

#### 🐛 Bug Fixes

- **RESP3 push peeking**: `PeekPushNotificationName` no longer returns a truncated notification name when a push frame header spans a buffer boundary, preventing silent RESP3 pub/sub message loss (fixes [#&#8203;3839](redis/go-redis#3839)) ([#&#8203;3842](redis/go-redis#3842)) by [@&#8203;ndyakov](https://github.com/ndyakov)
- **`FT.HYBRID` vector params**: Vector data is now always sent via `PARAMS` with auto-generated param names (`__vector_param_N`, with collision avoidance) when `VectorParamName` is omitted, since Redis no longer accepts inline vector blobs; the `FTHybridOptions.Params` map is no longer mutated, so the same options struct can be reused across calls ([#&#8203;3844](redis/go-redis#3844)) by [@&#8203;ndyakov](https://github.com/ndyakov)
- **`CLUSTER SHARDS` forward compatibility**: Unknown shard- and node-level attributes in the `CLUSTER SHARDS` reply are now skipped via `DiscardNext()` instead of erroring, so clients keep working when the server introduces new fields ([#&#8203;3843](redis/go-redis#3843)) by [@&#8203;madolson](https://github.com/madolson)
- **PubSub double reconnect**: `PubSub.releaseConn` no longer reconnects twice when a connection is both unusable (or pending handoff) and reports a bad-connection error, avoiding a wasted connection establish-then-close cycle ([#&#8203;3833](redis/go-redis#3833)) by [@&#8203;cxljs](https://github.com/cxljs)

#### 👥 Contributors

We'd like to thank all the contributors who worked on this release!

[@&#8203;cxljs](https://github.com/cxljs), [@&#8203;madolson](https://github.com/madolson), [@&#8203;ndyakov](https://github.com/ndyakov)

***

**Full Changelog**: <redis/go-redis@v9.20.0...v9.20.1>

</details>

---

### Configuration

📅 **Schedule**: (UTC)

- Branch creation
  - Between 12:00 AM and 03:59 AM (`* 0-3 * * *`)
- Automerge
  - Between 12:00 AM and 03:59 AM (`* 0-3 * * *`)

🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update again.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box

---

This PR has been generated by [Mend Renovate](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My4yMTQuNSIsInVwZGF0ZWRJblZlciI6IjQzLjIxNC41IiwidGFyZ2V0QnJhbmNoIjoiZm9yZ2VqbyIsImxhYmVscyI6WyJkZXBlbmRlbmN5LXVwZ3JhZGUiLCJ0ZXN0L25vdC1uZWVkZWQiXX0=-->

Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/13061
Reviewed-by: Mathieu Fenniak <[email protected]>
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.

Client sometimes drops pubsub messages

4 participants