1
0
mirror of https://github.com/redis/go-redis.git synced 2025-12-03 18:31:14 +03:00
Commit Graph

2788 Commits

Author SHA1 Message Date
Nedyalko Dyakov
b862bf53de Merge remote-tracking branch 'origin/master' into ndyakov/state-machine-conn 2025-10-28 12:24:30 +02:00
dependabot[bot]
f7a8a1c1d7 chore(deps): bump rojopolis/spellcheck-github-actions (#3569)
Bumps [rojopolis/spellcheck-github-actions](https://github.com/rojopolis/spellcheck-github-actions) from 0.52.0 to 0.53.0.
- [Release notes](https://github.com/rojopolis/spellcheck-github-actions/releases)
- [Changelog](https://github.com/rojopolis/spellcheck-github-actions/blob/master/CHANGELOG.md)
- [Commits](https://github.com/rojopolis/spellcheck-github-actions/compare/0.52.0...0.53.0)

---
updated-dependencies:
- dependency-name: rojopolis/spellcheck-github-actions
  dependency-version: 0.53.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-10-28 11:44:06 +02:00
iliya
9c77386b08 chore(tests): internal/proto/peek_push_notification_test : Refactor test helpers to… (#3563)
* internal/proto/peek_push_notification_test : Refactor test helpers to use fmt.Fprintf for buffers

Replaced buf.WriteString(fmt.Sprintf(...)) with fmt.Fprintf or fmt.Fprint in test helper functions for improved clarity and efficiency. This change affects push notification and RESP3 test utilities.

* peek_push_notification_test: revert prev formatting

* all: replace buf.WriteString with fmt.FprintF for consistency

---------

Co-authored-by: Nedyalko Dyakov <1547186+ndyakov@users.noreply.github.com>
2025-10-28 11:41:45 +02:00
Sourabh
7be00c8725 fix(panic): Return error instead of panic from commands (#3568)
Instead of panic in few commands, we can return an error to avoid unexpected panics in application code.
2025-10-28 11:32:34 +02:00
Nedyalko Dyakov
9448059c01 initConn sets IDLE state
- Handle unexpected conn state changes
2025-10-28 00:49:39 +02:00
Nedyalko Dyakov
080a33c3a8 fix(pool): pool performance (#3565)
* perf(pool): replace hookManager RWMutex with atomic.Pointer and add predefined state slices

- Replace hookManager RWMutex with atomic.Pointer for lock-free reads in hot paths
- Add predefined state slices to avoid allocations (validFromInUse, validFromCreatedOrIdle, etc.)
- Add Clone() method to PoolHookManager for atomic updates
- Update AddPoolHook/RemovePoolHook to use copy-on-write pattern
- Update all hookManager access points to use atomic Load()

Performance improvements:
- Eliminates RWMutex contention in Get/Put/Remove hot paths
- Reduces allocations by reusing predefined state slices
- Lock-free reads allow better CPU cache utilization

* perf(pool): eliminate mutex overhead in state machine hot path

The state machine was calling notifyWaiters() on EVERY Get/Put operation,
which acquired a mutex even when no waiters were present (the common case).

Fix: Use atomic waiterCount to check for waiters BEFORE acquiring mutex.
This eliminates mutex contention in the hot path (Get/Put operations).

Implementation:
- Added atomic.Int32 waiterCount field to ConnStateMachine
- Increment when adding waiter, decrement when removing
- Check waiterCount atomically before acquiring mutex in notifyWaiters()

Performance impact:
- Before: mutex lock/unlock on every Get/Put (even with no waiters)
- After: lock-free atomic check, only acquire mutex if waiters exist
- Expected improvement: ~30-50% for Get/Put operations

* perf(pool): use predefined state slices to eliminate allocations in hot path

The pool was creating new slice literals on EVERY Get/Put operation:
- popIdle(): []ConnState{StateCreated, StateIdle}
- putConn(): []ConnState{StateInUse}
- CompareAndSwapUsed(): []ConnState{StateIdle} and []ConnState{StateInUse}
- MarkUnusableForHandoff(): []ConnState{StateInUse, StateIdle, StateCreated}

These allocations were happening millions of times per second in the hot path.

Fix: Use predefined global slices defined in conn_state.go:
- validFromInUse
- validFromCreatedOrIdle
- validFromCreatedInUseOrIdle

Performance impact:
- Before: 4 slice allocations per Get/Put cycle
- After: 0 allocations (use predefined slices)
- Expected improvement: ~30-40% reduction in allocations and GC pressure

* perf(pool): optimize TryTransition to reduce atomic operations

Further optimize the hot path by:
1. Remove redundant GetState() call in the loop
2. Only check waiterCount after successful CAS (not before loop)
3. Inline the waiterCount check to avoid notifyWaiters() call overhead

This reduces atomic operations from 4-5 per Get/Put to 2-3:
- Before: GetState() + CAS + waiterCount.Load() + notifyWaiters mutex check
- After: CAS + waiterCount.Load() (only if CAS succeeds)

Performance impact:
- Eliminates 1-2 atomic operations per Get/Put
- Expected improvement: ~10-15% for Get/Put operations

* perf(pool): add fast path for Get/Put to match master performance

Introduced TryTransitionFast() for the hot path (Get/Put operations):
- Single CAS operation (same as master's atomic bool)
- No waiter notification overhead
- No loop through valid states
- No error allocation

Hot path flow:
1. popIdle(): Try IDLE → IN_USE (fast), fallback to CREATED → IN_USE
2. putConn(): Try IN_USE → IDLE (fast)

This matches master's performance while preserving state machine for:
- Background operations (handoff/reauth use UNUSABLE state)
- State validation (TryTransition still available)
- Waiter notification (AwaitAndTransition for blocking)

Performance comparison per Get/Put cycle:
- Master: 2 atomic CAS operations
- State machine (before): 5 atomic operations (2.5x slower)
- State machine (after): 2 atomic CAS operations (same as master!)

Expected improvement: Restore to baseline ~11,373 ops/sec

* combine cas

* fix linter

* try faster approach

* fast semaphore

* better inlining for hot path

* fix linter issues

* use new semaphore in auth as well

* linter should be happy now

* add comments

* Update internal/pool/conn_state.go

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* address comment

* slight reordering

* try to cache time if for non-critical calculation

* fix wrong benchmark

* add concurrent test

* fix benchmark report

* add additional expect to check output

* comment and variable rename

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-10-27 15:06:30 +02:00
Nedyalko Dyakov
07e665f7af address copilot comment 2025-10-25 21:54:06 +03:00
Nedyalko Dyakov
13a4b3f366 fix error from copilot 2025-10-25 21:53:13 +03:00
Nedyalko Dyakov
33696fb002 Update internal/pool/conn.go
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-10-25 21:49:41 +03:00
Nedyalko Dyakov
bc4230766a Update internal/pool/conn_state.go
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-10-25 21:49:12 +03:00
Nedyalko Dyakov
0964dccbf1 Update internal/pool/pool.go
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-10-25 21:49:01 +03:00
Nedyalko Dyakov
65a6ece947 Update internal/pool/conn_state_test.go
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-10-25 21:48:55 +03:00
Nedyalko Dyakov
ffbe1e59f7 Update internal/pool/conn_state_test.go
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-10-25 21:44:27 +03:00
Nedyalko Dyakov
23d0e0fbae Merge branch 'master' into ndyakov/state-machine-conn 2025-10-25 03:33:17 +03:00
iliya
a3a369b2f5 chore(tests): Use t.Fatal for pointer nil checks (#3562)
Replaces t.Error with t.Fatal in NewRegistry and NewProcessor tests to immediately stop test execution when a nil value is encountered.
2025-10-25 03:29:29 +03:00
iliya
4bc183618c chore(tests): Refactor tests for idiomatic Go and minor improvements (#3561)
* all: Refactor tests for idiomatic Go and minor improvements

Replaced redundant 'for key, _' with 'for key' in map iterations for clarity in doctests/cmds_hash_test.go. Updated time measurement from time.Now().Sub to time.Since in hset_benchmark_test.go for idiomatic Go usage. Simplified variadic argument types from interface{} to any and removed unused min function in maintnotifications/e2e/utils_test.go.

* maintnotifications/e2e/utils_test: Update variadic args type in printLog function

Changed the variadic argument type in printLog from 'any' to 'interface{}' for compatibility and consistency with standard Go practices.
2025-10-25 03:29:08 +03:00
Nedyalko Dyakov
a2c7a25196 fix mark on uninitialized connection 2025-10-25 00:48:35 +03:00
Nedyalko Dyakov
84e856e382 improve tests 2025-10-25 00:40:07 +03:00
Nedyalko Dyakov
03b00035da delete should be called 2025-10-25 00:32:26 +03:00
Nedyalko Dyakov
9ad62883ff try to detect the deadlock x2 2025-10-24 23:45:02 +03:00
Nedyalko Dyakov
c4ed467a59 try to detect the deadlock 2025-10-24 18:00:47 +03:00
Nedyalko Dyakov
3a53e1bdcc fix handoff state when queued for handoff 2025-10-24 17:30:36 +03:00
Nedyalko Dyakov
cfcf37de4e empty endpoint handoff case 2025-10-24 16:54:23 +03:00
Nedyalko Dyakov
94fa9204ce better timeouts 2025-10-24 15:28:28 +03:00
Nedyalko Dyakov
de2f8ba0a1 Update internal/pool/conn.go
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-10-24 15:20:25 +03:00
Nedyalko Dyakov
3f29463299 Update internal/pool/conn.go
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-10-24 15:20:16 +03:00
Nedyalko Dyakov
21bd243bf5 improve reauth state management. fix tests 2025-10-24 15:06:55 +03:00
Nedyalko Dyakov
92433e6f2a fix linter 2025-10-24 14:55:00 +03:00
Nedyalko Dyakov
7526e67f17 better errors for tests, hook should work now 2025-10-24 14:52:12 +03:00
Nedyalko Dyakov
663a60e47f correct handling OnPut 2025-10-24 14:13:13 +03:00
Nedyalko Dyakov
5721512a79 polish state machine 2025-10-24 13:09:30 +03:00
Nedyalko Dyakov
0a754660ef Merge remote-tracking branch 'origin/master' into ndyakov/state-machine-conn 2025-10-23 18:15:07 +03:00
Nedyalko Dyakov
f1956565ee chore(release): 9.16.0 (#3557)
* notes

* bump version
extra/redisprometheus/v9.16.0 extra/rediscensus/v9.16.0 extra/redisotel/v9.16.0 extra/rediscmd/v9.16.0 v9.16.0
2025-10-23 18:08:39 +03:00
Nedyalko Dyakov
606264ef7f wip, used and unusable states 2025-10-23 17:09:22 +03:00
Nedyalko Dyakov
27591cd045 wip 2025-10-23 14:05:31 +03:00
Udhayarajan
70dfa383fe feat(otel): add trace filter for process pipeline and dial operation (#3550)
* feat(tracing): add process pipeline and dial filtering options for tracing

* refactor(tracing): implement default command filter and process pipeline options

* refactor(tracing): rename defaultCommandFilter to DefaultCommandFilter

* refactor(tracing): add BasicCommandFilter as a deprecated alias for DefaultCommandFilter

---------

Co-authored-by: Nedyalko Dyakov <1547186+ndyakov@users.noreply.github.com>
2025-10-22 12:57:15 +03:00
Nedyalko Dyakov
a15e76394c fix(pool): Pool ReAuth should not interfere with handoff (#3547)
* fix(pool): wip, pool reauth should not interfere with handoff

* fix credListeners map

* fix race in tests

* better conn usable timeout

* add design decision comment

* few small improvements

* update marked as queued

* add Used to clarify the state of the conn

* rename test

* fix(test): fix flaky test

* lock inside the listeners collection

* address pr comments

* Update internal/auth/cred_listeners.go

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Update internal/pool/buffer_size_test.go

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* wip refactor entraid

* fix maintnotif pool hook

* fix mocks

* fix nil listener

* sync and async reauth based on conn lifecycle

* be able to reject connection OnGet

* pass hooks so the tests can observe reauth

* give some time for the background to execute commands

* fix tests

* only async reauth

* Update internal/pool/pool.go

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Update internal/auth/streaming/pool_hook.go

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Update internal/pool/conn.go

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* chore(redisotel): use metric.WithAttributeSet to avoid copy (#3552)

In order to improve performance replace `WithAttributes` with `WithAttributeSet`.
This avoids the slice allocation and copy that is done in `WithAttributes`.

For more information see https://github.com/open-telemetry/opentelemetry-go/blob/v1.38.0/metric/instrument.go#L357-L376

* chore(docs): explain why MaxRetries is disabled for ClusterClient (#3551)

Co-authored-by: Nedyalko Dyakov <1547186+ndyakov@users.noreply.github.com>

* exponential backoff

* address pr comments

* address pr comments

* remove rlock

* add some comments

* add comments

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Warnar Boekkooi <wboekkooi@impossiblecloud.com>
Co-authored-by: Justin <justindsouza80@gmail.com>
2025-10-22 12:45:30 +03:00
Justin
14a8814540 chore(docs): explain why MaxRetries is disabled for ClusterClient (#3551)
Co-authored-by: Nedyalko Dyakov <1547186+ndyakov@users.noreply.github.com>
2025-10-21 15:03:58 +03:00
Warnar Boekkooi
8ca21d2600 chore(redisotel): use metric.WithAttributeSet to avoid copy (#3552)
In order to improve performance replace `WithAttributes` with `WithAttributeSet`.
This avoids the slice allocation and copy that is done in `WithAttributes`.

For more information see https://github.com/open-telemetry/opentelemetry-go/blob/v1.38.0/metric/instrument.go#L357-L376
2025-10-21 14:56:06 +03:00
Hristo Temelski
7aa4a60667 update gomods to align them with the latest beta (#3539)
Co-authored-by: Nedyalko Dyakov <1547186+ndyakov@users.noreply.github.com>
2025-10-21 11:28:04 +03:00
Hristo Temelski
1e6ee06740 test(e2e): testing framework upgrade (#3541)
* update e2e test, change script

* update script and tests

* fixed bdbid parsing

* disabled majority of tests, swapped event order

* change the config tag

* revert test order

* fix typo

* reenable all e2e tests

* change the clonfig flag key for all e2e tests

* improve logging for debug purposes of tests

* longer deadline for FI in CI

* increase waiting for notifications

* extend tests

* dont fail on flaky third client

* fi new params

* fix test build

* more time for migrating

* first wait for FI action, then assert notification

* fix test build

* fix tests

* fix tests

* change output

* global print logs for tests

* better output

* fix error format

* maybe the notification is already received

* second and third client fix

* print output if failed

* better second and third client checks

* output action data if notification is not received

* stop command runner

* database create / delete actions

* database create / delete actions used in tests

* fix import

* remove example

* remove unused var

* use different port than the one in env

* wait for action to get the response

* fix output

* fix create db config

* fix create db config

* use new database for client

* fix create db config

* db per scenario

* less logs, correct check

* Add CTRF to the scenario tests (#3545)

* add some json ctrf improvements

* fix -v

* attempt to separate the output

---------

Co-authored-by: Nedyalko Dyakov <1547186+ndyakov@users.noreply.github.com>

---------

Co-authored-by: Nedyalko Dyakov <nedyalko.dyakov@gmail.com>
Co-authored-by: kiryazovi-redis <ivaylo.kiryazov@redis.com>
Co-authored-by: Nedyalko Dyakov <1547186+ndyakov@users.noreply.github.com>
2025-10-17 17:23:10 +03:00
Jason Parraga
f7eed76fbc Add support for filtering traces for certain commands (#3519)
* Add support for filtering commands when tracing

Signed-off-by: Jason Parraga <sovietaced@gmail.com>

* Filter sensitive data by default

Signed-off-by: Jason Parraga <sovietaced@gmail.com>

* Address comments

Signed-off-by: Jason Parraga <sovietaced@gmail.com>

---------

Signed-off-by: Jason Parraga <sovietaced@gmail.com>
Co-authored-by: Nedyalko Dyakov <1547186+ndyakov@users.noreply.github.com>
2025-10-14 18:15:58 +03:00
dependabot[bot]
3d68c7e42f chore(deps): bump github/codeql-action from 3 to 4 (#3544)
Bumps [github/codeql-action](https://github.com/github/codeql-action) from 3 to 4.
- [Release notes](https://github.com/github/codeql-action/releases)
- [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md)
- [Commits](https://github.com/github/codeql-action/compare/v3...v4)

---
updated-dependencies:
- dependency-name: github/codeql-action
  dependency-version: '4'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-10-14 16:18:39 +03:00
Feng.YJ
3ad9f9cb23 fix: add missing error variable for non-unix build constraints (#3538)
* fix: add missing error variable for non-unix build constraints

* chore: name "_" for unused parameters

---------

Co-authored-by: Elena Kolevska <elena-kolevska@users.noreply.github.com>
2025-09-29 09:35:04 +03:00
Hristo Temelski
a44df88257 version 9.15.1, used to retract itself and 9.15.0 (#3537)
* version 9.15.1, used to retract itself and 9.15.0

* added retract to the submodules

* revert submodules retracts as they are not needed
extra/redisotel/v9.15.1 extra/rediscensus/v9.15.1 extra/redisprometheus/v9.15.1 v9.15.1 extra/rediscmd/v9.15.1
2025-09-27 23:33:54 +03:00
Hristo Temelski
819f01b489 retract wrongly released version (#3533) extra/redisotel/v9.16.0-beta.1 extra/redisprometheus/v9.16.0-beta.1 extra/rediscensus/v9.16.0-beta.1 v9.16.0-beta.1 extra/rediscmd/v9.16.0-beta.1 2025-09-27 15:38:46 +01:00
Hristo Temelski
7405cff430 depreciate 9.15.0 (#3532) extra/rediscensus/v9.15.0-beta.3 extra/rediscmd/v9.15.0-beta.3 extra/redisotel/v9.15.0-beta.3 extra/redisprometheus/v9.15.0-beta.3 v9.15.0-beta.3 2025-09-27 02:17:21 +03:00
Hristo Temelski
8b38e27f97 release: 9.15.0-beta.2 (#3531) extra/redisprometheus/v9.15.0-beta.2 extra/redisotel/v9.15.0-beta.2 v9.15.0-beta.2 extra/rediscmd/v9.15.0-beta.2 extra/rediscensus/v9.15.0-beta.2 2025-09-26 19:40:07 +03:00
Nedyalko Dyakov
75ddeb3d5a feat(e2e-testing): maintnotifications e2e and refactor (#3526)
* e2e wip

* cleanup

* remove unused fault injector mock

* errChan in test

* remove log messages tests

* cleanup log messages

* s/hitless/maintnotifications/

* fix moving when none

* better logs

* test with second client after action has started

* Fixes

Signed-off-by: Elena Kolevska <elena@kolevska.com>

* Test fix

Signed-off-by: Elena Kolevska <elena@kolevska.com>

* feat(e2e-test): Extended e2e tests

* imroved e2e test resiliency

---------

Signed-off-by: Elena Kolevska <elena@kolevska.com>
Co-authored-by: Elena Kolevska <elena@kolevska.com>
Co-authored-by: Elena Kolevska <elena-kolevska@users.noreply.github.com>
Co-authored-by: Hristo Temelski <hristo.temelski@redis.com>
2025-09-26 19:17:09 +03:00
Hristo Temelski
e6e52bc735 feat(tag.sh): Improved resiliency of the release process (#3530) 2025-09-26 18:35:29 +03:00