Commit Graph
2871 Commits
Author SHA1 Message Date
a6741de03e fix(vector): VectorScoreSliceCmd to handle RESP2 flat array responses (#3767)
* Initial plan

* Fix VectorScoreSliceCmd to handle RESP2 flat array responses

Agent-Logs-Url: https://github.com/redis/go-redis/sessions/98c71a51-26cc-46ab-b9a0-25bd9c1f3295

Co-authored-by: ndyakov <[email protected]>

* Add NewVectorScoreSliceCmd constructor; fix test to use proper constructor

Agent-Logs-Url: https://github.com/redis/go-redis/sessions/98c71a51-26cc-46ab-b9a0-25bd9c1f3295

Co-authored-by: ndyakov <[email protected]>

---------

Co-authored-by: copilot-swe-agent[bot] <[email protected]>
Co-authored-by: ndyakov <[email protected]>
2026-04-09 15:29:57 +03:00
c4770cde7c fix(error): detect READONLY errors from Lua scripts on read-only replicas (#3769)
When a Lua script containing a write command is executed against a
read-only replica in a Redis Cluster, the error may contain
"-READONLY You can't write against a read only replica" embedded
within a larger error message rather than starting with "READONLY ".

The existing code only checked for the "READONLY " prefix, missing
this format. This caused shouldRetry() and isReadOnlyError() to fail,
preventing automatic retry and connection pool cleanup.

The fix checks for the exact substring
"-READONLY You can't write against a read only replica" which is
specific enough to avoid false positives while catching the Lua
script error format.

Closes #2770

Co-authored-by: Claude Opus 4.6 (1M context) <[email protected]>
2026-04-09 15:08:05 +03:00
BigskandGitHub cd984fae99 chore(ring): inline rendezvous hashing and remove external dependency (#3762)
* ring: remove external rendezvous dependency by inlining implementation

Replace usage of github.com/dgryski/go-rendezvous with an internal
implementation to eliminate the external dependency and avoid licence
propagation concerns.

The implementation preserves the exact hashing algorithm and behaviour:
- same hash combination: khash ^ nhash
- same mixing function (xorshift* variant)
- same node ordering semantics

No functional changes intended.

* Refactor TestRendezvous to remove randomString function

Replaced function with inline string generation for test cases.

* test: refactor RendezvousHash tests to use Ginkgo and Gomega

* test: improve RendezvousHash test for per-instance determinism and distribution balance

* test: enhance distribution verification in RendezvousHash tests
2026-04-07 10:26:18 +03:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
68197a9cbe chore(deps): bump codecov/codecov-action from 5 to 6 (#3757)
Bumps [codecov/codecov-action](https://github.com/codecov/codecov-action) from 5 to 6.
- [Release notes](https://github.com/codecov/codecov-action/releases)
- [Changelog](https://github.com/codecov/codecov-action/blob/main/CHANGELOG.md)
- [Commits](https://github.com/codecov/codecov-action/compare/v5...v6)

---
updated-dependencies:
- dependency-name: codecov/codecov-action
  dependency-version: '6'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-03-30 18:50:04 +03:00
cxljsandGitHub 37324408eb chore(maps): Use maps.Keys, slices.Collect and slices.Contains instead of custom functions (#3758)
* Optimize: Use modern Go standard library (maps.Keys, slices.Collect, slices.Contains) instead of custom functions

* format
2026-03-30 18:49:47 +03:00
cxljsandGitHub 0a45121925 chore(go): use -compat=1.24 (#3754)
Signed-off-by: Xiaolong Chen <[email protected]>
2026-03-30 18:26:03 +03:00
b506c612a4 feat(script): Make Script helper work in strict FIPS mode by avoiding client-side SHA-1 (#3700)
* script: avoid client-side SHA1 in FIPS mode

* modifying the script.go to add new constructor to explicitly control SHA-1 Behaviour(strict FIPS Builds - FIPS140)

* fixing the lint errors

* Add unit and integration tests for NewScriptServerSHA

* fixing the mod format issue

* Update go.mod

Co-authored-by: Nedyalko Dyakov <[email protected]>

* Update go.sum

Co-authored-by: Nedyalko Dyakov <[email protected]>

* Update go.sum

Co-authored-by: Nedyalko Dyakov <[email protected]>

* Update script_server_sha_integration_test.go

Co-authored-by: Nedyalko Dyakov <[email protected]>

* Update go.mod

Moved the dependency under require block

---------

Co-authored-by: Nedyalko Dyakov <[email protected]>
2026-03-28 12:45:51 +02:00
f37dbd0bc1 Fix ZRangeArgs Rev+ByScore/ByLex incorrectly swapping Start/Stop (#3751)
* Initial plan

* Fix ZRangeArgs Rev+ByScore/ByLex incorrect Start/Stop swap

Co-authored-by: ndyakov <[email protected]>
Agent-Logs-Url: https://github.com/redis/go-redis/sessions/18989cb1-ea6a-4fb9-b701-03db3d3fc5ec

---------

Co-authored-by: copilot-swe-agent[bot] <[email protected]>
Co-authored-by: ndyakov <[email protected]>
2026-03-26 00:53:33 +02:00
dariaguyandGitHub 8f17c049d9 chore(ci): Release automation integration (#3749)
* Added repository, ref and client image tag logic

* Remove benchmark from build.yml for testing

* Trigger build.yml with push to current branch

* Restore checkout code in build.yml

* Use client iamge test tag input

* Change redis-version input to be not required

* Reset build workflow changes to master
2026-03-24 17:30:13 +02:00
cxljsandGitHub 0ae2f4c088 chore(client): optimize for Go 1.24: use slices/maps/clear built-ins (#3746)
- pubsub.go: use clear() to empty maps
- search_commands.go: use slices.Clone() and maps.Clone()
- command.go: use maps.Clone() in XMessageSliceCmd.Clone()
- options.go: use maps.Keys() + slices.Collect() + slices.Sort()
- osscluster.go: use slices.SortFunc() instead of custom sort type
- proxy_fault_injector_server.go: remove custom min() function
2026-03-23 22:38:24 +02:00
4427a3711a chore(client): invalid memory address or nil pointer dereference in baseClient.initConn (#3676)
* fix(client): Do not try to access pointer field without a nil check

* fix(client): always make copy of options to prevent access client internals

* Client: return options copy

* ClusterClient: add missing nil options check, copy passed options, return
  options copy

* Ring: copy passed options, return options copy

* SentinelClient: copy passed options

* fix(tests): some tests relied on client internal field access

timeout tests now use reflect and unsafe to access clients internal
options

* fix(redisotel): call options method only once for every client

* revert options cloning, but leave nil check in NewClusterClient

reverts e170a61, 9ffb47e, most of the changes in d986ff7

* chore(doc): add note about alteration of options returned from Options()

* revert leftover change, update doc for clients

---------

Co-authored-by: Nedyalko Dyakov <[email protected]>
2026-03-23 18:14:15 +02:00
Jesse BankandGitHub e79b6eb07f feat(otel): Fixing cluster metrics attributes slice corruption (#3699) 2026-03-23 18:13:48 +02:00
ofekshenawaandGitHub 5b69d1a3bc feat(command): Add DoRaw and DoRawWriteTo for raw RESP protocol access (#3713)
* Add DoRaw and DoRawWriteTo for raw RESP protocol access

* fix augment comments

* Pipeline retry fix

* Fix Missing NoRetry check in cluster and ring retry loops
2026-03-23 17:36:21 +02:00
ofekshenawaandGitHub 73418596a3 feat(client): Add DoRaw and DoRawWriteTo for raw RESP protocol access (#3713)
* Add DoRaw and DoRawWriteTo for raw RESP protocol access

* fix augment comments

* Pipeline retry fix

* Fix Missing NoRetry check in cluster and ring retry loops
2026-03-23 17:35:59 +02:00
dependabot[bot]andGitHub 427077933d chore(deps): bump go.opentelemetry.io/otel/sdk in /extra/redisotel (#3745) 2026-03-22 16:03:06 +02:00
dependabot[bot]andGitHub 535035aa32 chore(deps): bump google.golang.org/grpc in /example/otel-metrics (#3744) 2026-03-22 15:43:00 +02:00
7c6b09e297 feat(options): add dial retry backoff function. (#3706)
* add dial retry backoff function.

* add readme

* add backoff to wordlist

* add logical consistency check

* fix(cluster): propagate DialerRetryBackoff to per-node clients

ClusterOptions.clientOptions() was not propagating DialerRetryBackoff,
causing the backoff function to be silently ignored when set on a cluster
client.

Co-Authored-By: Claude Sonnet 4.6 <[email protected]>

---------

Co-authored-by: Nedyalko Dyakov <[email protected]>
Co-authored-by: Claude Sonnet 4.6 <[email protected]>
2026-03-19 20:45:20 +02:00
9aebc97b42 fix(config): data race in Options.clone() (#3739)
* test: add race test for Options.clone() vs initConn MaintNotificationsConfig write

Demonstrates a data race where Options.clone() reads MaintNotificationsConfig
without acquiring optLock while initConn writes to it concurrently.

Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>

* fix: data race in Options.clone() vs initConn MaintNotificationsConfig write

Add baseClient.cloneOpt() that acquires optLock.RLock before cloning options,
preventing a race with initConn which writes MaintNotificationsConfig.Mode
under the same lock. Update withTimeout and newTx to use cloneOpt().

Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>

---------

Co-authored-by: Ruben de Vries <[email protected]>
Co-authored-by: Claude Opus 4.6 (1M context) <[email protected]>
2026-03-19 20:39:48 +02:00
LINKIWIandGitHub 2ba8388eed feat(error): Add typed error for NOSCRIPT replies from Redis (#3738) 2026-03-18 17:02:09 +02:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
60b46d93fd chore(deps): bump rojopolis/spellcheck-github-actions (#3737)
Bumps [rojopolis/spellcheck-github-actions](https://github.com/rojopolis/spellcheck-github-actions) from 0.59.0 to 0.60.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.59.0...0.60.0)

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

Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-03-17 12:08:21 +02:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
8e17ea8efc chore(deps): bump release-drafter/release-drafter from 6 to 7 (#3736)
Bumps [release-drafter/release-drafter](https://github.com/release-drafter/release-drafter) from 6 to 7.
- [Release notes](https://github.com/release-drafter/release-drafter/releases)
- [Commits](https://github.com/release-drafter/release-drafter/compare/v6...v7)

---
updated-dependencies:
- dependency-name: release-drafter/release-drafter
  dependency-version: '7'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-03-17 12:07:32 +02:00
ofekshenawaandGitHub cd3949d1a0 fix: connection closure metrics and enable all metric groups by default (#3735)
* fix: connection closure metrics and enable all metric groups by default

This commit addresses three issues in the redisotel-native metrics implementation:

1. Fix connection closure metrics not appearing in dashboards
   - Root cause: CloseConn() in internal/pool/pool.go was not calling
     the metricConnectionClosedCallback when closing stale connections
   - Added callback invocation in CloseConn() to record 'stale' closures

2. Verify tracing and metrics compatibility
   - Added TestTracingAndMetricsCompatibility to document that
     redisotel (tracing via AddHook) and redisotel-native (metrics via
     SetOTelRecorder) can coexist without conflicts

3. Enable all metric groups by default
   - Changed default MetricGroups from connection-basic+resiliency
     to MetricGroupAll for comprehensive observability out of the box
2026-03-16 09:54:24 +02:00
903b0811b8 fix(redisotel-native): use metric definition from otel/semconv/v1.38.0 (#3731)
Uses the name, desc, unit of `db.client.operation.duration`, `db.client.connection.count`, `db.client.connection.create_time`, `db.client.connection.wait_time`, `db.client.connection.pending_requests` defined by otel/semconv/v1.38.0/dbconv.
The resolves the metric description part of #3730.

Co-authored-by: ofekshenawa <[email protected]>
2026-03-12 09:49:39 +02:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
1a771e71c7 chore(deps): bump rojopolis/spellcheck-github-actions (#3732)
Bumps [rojopolis/spellcheck-github-actions](https://github.com/rojopolis/spellcheck-github-actions) from 0.58.0 to 0.59.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.58.0...0.59.0)

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

Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-03-11 13:25:15 +02:00
Nedyalko DyakovandGitHub 8a4fed48a9 fix(setnx): use set with nx instead setnx (#3723) 2026-03-11 13:20:52 +02:00
Nedyalko DyakovandGitHub dcf53a6190 chore(example): remove throughput binary (#3733) 2026-03-11 13:20:27 +02:00
Puspendra ChawlaandGitHub 78ae5e5c0f feat(pubsub): Add ClientSetName method to PubSub (#3727)
Adds ClientSetName(ctx, name string) error to *PubSub, allowing
callers to label the underlying connection via CLIENT SETNAME.
The name appears in CLIENT LIST output, useful for identifying
PubSub connections when debugging.

Follows the same pattern as Ping() — acquires mutex, gets conn,
writes command, releases conn.

Note: if the connection drops and reconnects, the name will be
lost and must be set again.

Closes #3708
2026-03-09 13:37:56 +02:00
8eca179665 feat(command): Implement ReplicaOf method to replace deprecated SlaveOf (#3720)
* Initial plan

* Implement ReplicaOf method and update test usages

Co-authored-by: ndyakov <[email protected]>

* Run go fmt on modified files

Co-authored-by: ndyakov <[email protected]>

* Final review completed

Co-authored-by: ndyakov <[email protected]>

---------

Co-authored-by: copilot-swe-agent[bot] <[email protected]>
Co-authored-by: ndyakov <[email protected]>
Co-authored-by: ofekshenawa <[email protected]>
2026-03-09 13:35:16 +02:00
6193e530d6 chore(docs): fix irrelevant docs links (#3724)
Co-authored-by: Olzhas Sabiyev <[email protected]>
2026-02-28 10:04:30 +02:00
Artur KandGitHub 5c216583a7 fix(commands): mark time as keyless command (#3722) 2026-02-26 14:31:20 +02:00
475b50a948 fix(timeout): make dial timeout per-retry (#3705)
* Dial timeout is per-retry

Use dial timeout for each dial attempt, rather than
all attempts together.

* some tests

* additional tests

* use parent timeout so we can test our changes

---------

Co-authored-by: Nedyalko Dyakov <[email protected]>
2026-02-20 17:53:10 +02:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>Nedyalko Dyakov
23e7424c8c chore(deps): bump github.com/zeebo/xxh3 from 1.0.2 to 1.1.0 (#3691)
Bumps [github.com/zeebo/xxh3](https://github.com/zeebo/xxh3) from 1.0.2 to 1.1.0.
- [Commits](https://github.com/zeebo/xxh3/compare/v1.0.2...v1.1.0)

---
updated-dependencies:
- dependency-name: github.com/zeebo/xxh3
  dependency-version: 1.1.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Nedyalko Dyakov <[email protected]>
2026-02-20 10:09:41 +02:00
Nedyalko DyakovandGitHub 3b155e9443 chore(go): update go version to 1.24 (#3714)
* chore(go): update go version to 1.24

* update readmes and ci workflows

* update dockerfile for proxy-fi-server

* address changed test behaviour

* address changed test behaviour
2026-02-20 10:00:33 +02:00
Nedyalko DyakovandGitHub 90faf06923 chore(release): update versions in deps (#3712) 2026-02-16 16:41:48 +02:00
Nedyalko DyakovandGitHub bf8e8e3b16 chore(release): v9.18.0 (#3711)
* chore(release): add release notes

* chore(release): update version
2026-02-16 16:19:35 +02:00
a881cd4280 fix(clone): nil pointer dereference in PubSub after WithTimeout() (#3710)
* Initial plan

* Fix pubSubPool nil pointer in clone() method

Co-authored-by: ndyakov <[email protected]>

* Final: Fix complete and verified

Co-authored-by: ndyakov <[email protected]>

---------

Co-authored-by: copilot-swe-agent[bot] <[email protected]>
Co-authored-by: ndyakov <[email protected]>
2026-02-16 10:44:37 +02:00
ee6e9dbf09 feat(otel): Add OpenTelemetry Native Metrics Support (#3637)
* First draft. One metric - command duration.

Signed-off-by: Elena Kolevska <[email protected]>

* Adds connection state metrics

Signed-off-by: Elena Kolevska <[email protected]>

* wip

Signed-off-by: Elena Kolevska <[email protected]>

* Add phase 1 metrics

* Add client api configurations

* remove redundent code

* refactor: move otel-metrics example to separate module

* refactor: move otel-metrics example to separate module

* remove internal test

* Resolve merge conflicts with upstream/master

* Fix linting issues

* Fix pool idle connection counter bug

* Add OTel performance benchmarking suite

* Improve perf compatison script

* Add phase 2,3 metrics

* Remove local benchmark tests

* Add new fields to tests

* Change db.client.connection.count and db.client.connection.pending_request metric type from UpAndDownCounter to Async gauge.

* fix golangci lint

* Add piplined commands metrics support

* Redesign otel init method

* Address comments

* Fix golangci-lint errors

* Fix passing nil pointer

* Add metric prefix to callbacks and atomic batch registration

* Add unique name for pool.name attr

* Fix unique pool name for pubsub

* Refactor all hardcoded OTel attribute strings to use constants

* Refactor all hardcoded OTel attribute strings to use constants

* extract metric names and pool names as constants, improve error handling

---------

Signed-off-by: Elena Kolevska <[email protected]>
Co-authored-by: Elena Kolevska <[email protected]>
2026-02-13 18:08:10 +02:00
b53f2b0c9d feat(sch): MaintNotifications for ClusterClient (#3643)
* [maintnotif] Cluster specific handlers (#3613)

* maint notification handlers for cluster messages

* unrelax all conns

* trigger ci on feature branches

* feat(maintnotif): lazy cluster topology reload (#3614)

* lazy cluster topology reload

* fix discrepancies between options structs

* Update osscluster_lazy_reload_test.go

Co-authored-by: Copilot <[email protected]>

* Update osscluster.go

Co-authored-by: Copilot <[email protected]>

---------

Co-authored-by: Copilot <[email protected]>

* feat(e2e): mock maintnotif e2e tests (#3639)

* lazy cluster topology reload

* fix discrepancies between options structs

* Update osscluster_lazy_reload_test.go

Co-authored-by: Copilot <[email protected]>

* Update osscluster.go

Co-authored-by: Copilot <[email protected]>

* wip fault with mock proxy

* make lint happy

* fix linter issues

* faster tests with mocks

* linter once again

* add complex node test

* add ci e2e

* use correct redis container

* e2e fix

---------

Co-authored-by: Copilot <[email protected]>

* fix(retry): Add retry mechanism for NOREPLICAS error (#3647)

* fix(queuedNewConn): protect against nil context (#3649)

* fix(maintnotif): fix smigrated parser and add cluster state reload interval option (#3663)

* fix SMIGRATED parsing

* fix smigrated parser

* add ClusterStateReloadInterval to ClusterOptions

* fix tests

* set default cluster reload interval to 10s

* chore(lint): format

* feat(smigrated): new format & remember original host:port (#3697)

* lazy cluster topology reload

* fix discrepancies between options structs

* Update osscluster_lazy_reload_test.go

Co-authored-by: Copilot <[email protected]>

* Update osscluster.go

Co-authored-by: Copilot <[email protected]>

* wip fault with mock proxy

* make lint happy

* fix linter issues

* faster tests with mocks

* linter once again

* add complex node test

* add ci e2e

* use correct redis container

* e2e fix

* additional e2e tests

* fix data race

* fix random shard picker

* fix e2e tests

* fix for empty endpoint

* fix case when semaphore is full, but still need to check idle

* scenario tests

* create database from config

* wip

* feat(client): store original addrs for later use

* fix(notif): change smigrated notification

* fix(lint): fix linter

* fix(smigrated): use array

* fix(e2e): wip

* Update options.go

Co-authored-by: Copilot <[email protected]>

* Update redis.go

Co-authored-by: Copilot <[email protected]>

* fix(notif): if the conn has no original addr, trigger reload with first target

* chore(e2e): wip cluster e2e

* chore(e2e): fix nil pointer from e2e tests

* chore(e2e): fix tests and reports

* chore(e2e): proper logging in e2e

* chore(e2e): add pubsub in the tests as well

* chore(e2e): mockproxy fixes

* chore(e2e): mockproxy fixes

* chore(e2e): mockproxy fixes

* chore(e2e): mockproxy fixes v3

* stop background routines

* fix(e2e): tests

---------

Co-authored-by: Copilot <[email protected]>

* chore(docs): add example app (#3651)

* chore(lint): fmt

* chore(docs): improve docs

* chore(docs): update features.md

* chore(github): remove example

* chore(maintnotif): rename option and address pr comments

* fix(e2e): command runner should use client timeout

* chore(e2e): refactor tests

* fix(e2e): set default timeout to 90m

* fix(e2e): skip tests if proxy cannot be started

---------

Co-authored-by: Copilot <[email protected]>
Co-authored-by: ofekshenawa <[email protected]>
Co-authored-by: Elena Kolevska <[email protected]>
2026-02-13 13:25:07 +02:00
f25343d281 chore(tests): Add comprehensive TLS tests and example (#3681)
* chore(tests): add tls tests

* fix: Use ShardPicker for keyless commands instead of random slot

- cmdSlot now returns -1 for keyless commands instead of RandomSlot()
- This allows cmdNodeWithShardPicker to use the configured ShardPicker
  (default: RoundRobinPicker) for keyless command routing
- Updated mapCmdsByNode to handle slot == -1 by using ShardPicker
- Updated test to verify round robin distribution works correctly

* chore(image): update clients-test-lib image

* chore(tests): enable tls user auth test

* chore(docker): use proper envs for test image

* chore(image): use latest build

* chore(image): use latest build

* fix(tests): use the correct root cert

* feat(tls): add example app

* chore(docker): address pr comments

* chore(tests): address pr comments

* chore(doc): add README.md in the example app

* fix(tests): do not skip tests

* fix(tests): skip only because of redis version

* Extracts default image name in a var (including osscluster-tls)

Signed-off-by: Elena Kolevska <[email protected]>

* fix(tlstests): remove redundent test

---------

Signed-off-by: Elena Kolevska <[email protected]>
Co-authored-by: Elena Kolevska <[email protected]>
2026-02-12 15:26:00 +02:00
33ca5cb864 feat(commands): Add support for Redis HOTKEYS commands (#3695)
* Add support for Redis HOTKEYS commands

* Skip hotkeys tests for redis version lower than 8.6

* chore(image): use proper ci image for 8.6

* feat(command): hotkeys wip

* fix(tests): cluster hotkeys

* chore(lint): fmt

* Ensure HOTKEYS commands are only available on standalone Client and NOT on ClusterClient, Ring, or pooled clients

* fix(hotkeys): address pr comments

* chore(ci): use latest build

* fix(hotkeys): fix typo in response

---------

Co-authored-by: Nedyalko Dyakov <[email protected]>
Co-authored-by: Nedyalko Dyakov <[email protected]>
Co-authored-by: Elena Kolevska <[email protected]>
2026-02-11 18:08:28 +02:00
34f4568e4f fix(conn): guard against nil MaintNotificationsConfig in initConn (#3707)
* fix(conn): guard against nil MaintNotificationsConfig in initConn

In initConn, line 540 accessed MaintNotificationsConfig.EndpointType
unconditionally, even though line 538 correctly nil-checked
MaintNotificationsConfig. When MaintNotificationsConfig is nil, this
caused a nil pointer dereference panic and left optLock.RLock held,
leading to a deadlock on the next call.

Move the EndpointType access inside a nil guard to match the existing
nil check for the Mode field.

Fixes #3675

Co-Authored-By: Claude Opus 4.6 <[email protected]>

* refactor: use maintNotifEnabled for readability

---------

Co-authored-by: Claude Opus 4.6 <[email protected]>
2026-02-11 17:06:11 +02:00
feigandGitHub 2fc030f0d1 perf(options): perf Fuzz Test Go File (#3692)
Changes:
- Eliminated repeated string conversions - Convert byte slice to string once
- Functional approach - Used function slice for cleaner operation selection
- Better iteration logic - More efficient bounds checking and indexing
- Configurable constants - All magic numbers moved to constants
- Improved iteration calculation - Uses percentage-based approach for better fuzzing


Change-Id: Ie6929037106bd7e648aeb20f422593eb700ecb60
2026-02-03 14:14:04 +02:00
ofekshenawaandGitHub 63ed1fd9cd Add support for Redis Streams Idempotent Production (#3693) 2026-01-28 18:57:14 +02:00
feelshuandGitHub 3e119d7492 pre-allocate capacity to prevent multiple capacity expansions (#3689) 2026-01-26 17:05:54 +02:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
0d6fb0e085 chore(deps): bump rojopolis/spellcheck-github-actions (#3690)
Bumps [rojopolis/spellcheck-github-actions](https://github.com/rojopolis/spellcheck-github-actions) from 0.57.0 to 0.58.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.57.0...0.58.0)

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

Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-01-26 17:05:15 +02:00
ofekshenawaandGitHub 6ed6bed511 Support NaN values for timeseries (#3687)
* Support NaN values for timeseries

* Skip NaN tests for redis version below 8.6
2026-01-26 16:55:57 +02:00
b0cb6c4330 chore(ci): use 8.6-pre (#3685)
* chore(ci): use 8.6-pre

* chore(ci): add 8.6 in ci matrix

* fix(xinfostream): added new fields in the response

* fix(doctests): fix expected output for XInfoStream

* fix(xinfostreamfull): same as xinfostream

* fix(doctests): fix expected output for XInfoStream

* Support hybrid search params vectors

* Support xinfo stream change in tests

* Revert "Support xinfo stream change in tests"

This reverts commit fde9315b50dd495f96bdaac5300c9828ecdee90b.

* Support xinfo stream change in tests

* Fix stream doctest to support the changes in 8.6

---------

Co-authored-by: ofekshenawa <[email protected]>
Co-authored-by: ofekshenawa <[email protected]>
2026-01-26 15:09:52 +02:00
cff9459f91 feat(options): add DialerRetries and DialerRetryTimeout to ClusterOptions, RingOptions, and FailoverOptions (#3686)
Add DialerRetries and DialerRetryTimeout fields to ClusterOptions, RingOptions,
and FailoverOptions to allow users to configure connection retry behavior for
cluster, ring, and sentinel clients.

These options were previously only available for the standard Client and were
added to connection pools in #3518. This change ensures feature parity across
all client types.

Changes:
- Add DialerRetries and DialerRetryTimeout fields to ClusterOptions
- Add DialerRetries and DialerRetryTimeout fields to RingOptions
- Add DialerRetries and DialerRetryTimeout fields to FailoverOptions
- Update clientOptions() methods to pass through these values
- Update sentinelOptions() method to pass through these values
- Add tests to verify correct pass-through behavior

Fixes issue where ClusterClient, Ring, and FailoverClient users could not
customize connection retry behavior and were stuck with defaults (5 retries,
100ms backoff).

Co-authored-by: Nedyalko Dyakov <[email protected]>
2026-01-24 18:15:06 +02:00
a44932b17b fix(pool): fix wantConnQueue zombie elements and add comprehensive test coverage (#3680)
* discard zombie elements in wantConnQueue

* fix lint

---------

Co-authored-by: Nedyalko Dyakov <[email protected]>
2026-01-24 15:58:58 +02:00
Nedyalko DyakovandGitHub 06c7fe36cf fix(xadd,xtrim): when approx is false, should have = (#3684) 2026-01-21 16:39:08 +02:00