Skip to content

Commit c826bba

Browse files
authored
Merge branch 'master' into vset-vrange
2 parents 2996762 + 5fdc947 commit c826bba

File tree

98 files changed

+9409
-826
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

98 files changed

+9409
-826
lines changed

.github/actions/run-tests/action.yml

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -18,22 +18,20 @@ runs:
1818
- name: Setup Test environment
1919
env:
2020
REDIS_VERSION: ${{ inputs.redis-version }}
21-
CLIENT_LIBS_TEST_IMAGE: "redislabs/client-libs-test:${{ inputs.redis-version }}"
2221
run: |
2322
set -e
2423
redis_version_np=$(echo "$REDIS_VERSION" | grep -oP '^\d+.\d+')
25-
24+
2625
# Mapping of redis version to redis testing containers
2726
declare -A redis_version_mapping=(
27+
["8.4.x"]="8.4-RC1-pre.2"
2828
["8.2.x"]="8.2.1-pre"
2929
["8.0.x"]="8.0.2"
30-
["7.4.x"]="rs-7.4.0-v5"
31-
["7.2.x"]="rs-7.2.0-v17"
3230
)
33-
31+
3432
if [[ -v redis_version_mapping[$REDIS_VERSION] ]]; then
3533
echo "REDIS_VERSION=${redis_version_np}" >> $GITHUB_ENV
36-
echo "REDIS_IMAGE=redis:${{ inputs.redis-version }}" >> $GITHUB_ENV
34+
echo "REDIS_IMAGE=redis:${REDIS_VERSION}" >> $GITHUB_ENV
3735
echo "CLIENT_LIBS_TEST_IMAGE=redislabs/client-libs-test:${redis_version_mapping[$REDIS_VERSION]}" >> $GITHUB_ENV
3836
else
3937
echo "Version not found in the mapping."

.github/workflows/build.yml

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ name: Go
22

33
on:
44
push:
5-
branches: [master, v9, v9.7, v9.8, 'ndyakov/*', 'ofekshenawa/*', 'htemelski-redis/*', 'ce/*']
5+
branches: [master, v9, 'v9.*']
66
pull_request:
77
branches: [master, v9, v9.7, v9.8, 'ndyakov/*', 'ofekshenawa/*', 'htemelski-redis/*', 'ce/*']
88

@@ -18,9 +18,9 @@ jobs:
1818
fail-fast: false
1919
matrix:
2020
redis-version:
21+
- "8.4.x" # Redis CE 8.4
2122
- "8.2.x" # Redis CE 8.2
2223
- "8.0.x" # Redis CE 8.0
23-
- "7.4.x" # Redis stack 7.4
2424
go-version:
2525
- "1.23.x"
2626
- "1.24.x"
@@ -44,9 +44,9 @@ jobs:
4444
4545
# Mapping of redis version to redis testing containers
4646
declare -A redis_version_mapping=(
47+
["8.4.x"]="8.4-RC1-pre.2"
4748
["8.2.x"]="8.2.1-pre"
4849
["8.0.x"]="8.0.2"
49-
["7.4.x"]="rs-7.4.0-v5"
5050
)
5151
if [[ -v redis_version_mapping[$REDIS_VERSION] ]]; then
5252
echo "REDIS_VERSION=${redis_version_np}" >> $GITHUB_ENV
@@ -74,10 +74,9 @@ jobs:
7474
fail-fast: false
7575
matrix:
7676
redis-version:
77+
- "8.4.x" # Redis CE 8.4
7778
- "8.2.x" # Redis CE 8.2
7879
- "8.0.x" # Redis CE 8.0
79-
- "7.4.x" # Redis stack 7.4
80-
- "7.2.x" # Redis stack 7.2
8180
go-version:
8281
- "1.23.x"
8382
- "1.24.x"

.github/workflows/doctests.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ jobs:
1616

1717
services:
1818
redis-stack:
19-
image: redislabs/client-libs-test:8.0.2
19+
image: redislabs/client-libs-test:8.4-RC1-pre.2
2020
env:
2121
TLS_ENABLED: no
2222
REDIS_CLUSTER: no

.github/workflows/golangci-lint.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ jobs:
2222
steps:
2323
- uses: actions/checkout@v5
2424
- name: golangci-lint
25-
uses: golangci/golangci-lint-action@v8.0.0
25+
uses: golangci/golangci-lint-action@v9.0.0
2626
with:
2727
verify: true
2828

.github/workflows/spellcheck.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ jobs:
88
- name: Checkout
99
uses: actions/checkout@v5
1010
- name: Check Spelling
11-
uses: rojopolis/spellcheck-github-actions@0.52.0
11+
uses: rojopolis/spellcheck-github-actions@0.54.0
1212
with:
1313
config_path: .github/spellcheck-settings.yml
1414
task_name: Markdown

Makefile

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
GO_MOD_DIRS := $(shell find . -type f -name 'go.mod' -exec dirname {} \; | sort)
2-
REDIS_VERSION ?= 8.2
2+
REDIS_VERSION ?= 8.4
33
RE_CLUSTER ?= false
44
RCE_DOCKER ?= true
5-
CLIENT_LIBS_TEST_IMAGE ?= redislabs/client-libs-test:8.2.1-pre
5+
CLIENT_LIBS_TEST_IMAGE ?= redislabs/client-libs-test:8.4-RC1-pre.2
66

77
docker.start:
88
export RE_CLUSTER=$(RE_CLUSTER) && \

RELEASE-NOTES.md

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,64 @@
11
# Release Notes
22

3+
# 9.16.0 (2025-10-23)
4+
5+
## 🚀 Highlights
6+
7+
### Maintenance Notifications Support
8+
9+
This release introduces comprehensive support for Redis maintenance notifications, enabling applications to handle server maintenance events gracefully. The new `maintnotifications` package provides:
10+
11+
- **RESP3 Push Notifications**: Full support for Redis RESP3 protocol push notifications
12+
- **Connection Handoff**: Automatic connection migration during server maintenance with configurable retry policies and circuit breakers
13+
- **Graceful Degradation**: Configurable timeout relaxation during maintenance windows to prevent false failures
14+
- **Event-Driven Architecture**: Background workers with on-demand scaling for efficient handoff processing
15+
- **Production-Ready**: Comprehensive E2E testing framework and monitoring capabilities
16+
17+
For detailed usage examples and configuration options, see the [maintenance notifications documentation](maintnotifications/README.md).
18+
19+
## ✨ New Features
20+
21+
- **Trace Filtering**: Add support for filtering traces for specific commands, including pipeline operations and dial operations ([#3519](https://github.com/redis/go-redis/pull/3519), [#3550](https://github.com/redis/go-redis/pull/3550))
22+
- New `TraceCmdFilter` option to selectively trace commands
23+
- Reduces overhead by excluding high-frequency or low-value commands from traces
24+
25+
## 🐛 Bug Fixes
26+
27+
- **Pipeline Error Handling**: Fix issue where pipeline repeatedly sets the same error ([#3525](https://github.com/redis/go-redis/pull/3525))
28+
- **Connection Pool**: Ensure re-authentication does not interfere with connection handoff operations ([#3547](https://github.com/redis/go-redis/pull/3547))
29+
30+
## 🔧 Improvements
31+
32+
- **Hash Commands**: Update hash command implementations ([#3523](https://github.com/redis/go-redis/pull/3523))
33+
- **OpenTelemetry**: Use `metric.WithAttributeSet` to avoid unnecessary attribute copying in redisotel ([#3552](https://github.com/redis/go-redis/pull/3552))
34+
35+
## 📚 Documentation
36+
37+
- **Cluster Client**: Add explanation for why `MaxRetries` is disabled for `ClusterClient` ([#3551](https://github.com/redis/go-redis/pull/3551))
38+
39+
## 🧪 Testing & Infrastructure
40+
41+
- **E2E Testing**: Upgrade E2E testing framework with improved reliability and coverage ([#3541](https://github.com/redis/go-redis/pull/3541))
42+
- **Release Process**: Improved resiliency of the release process ([#3530](https://github.com/redis/go-redis/pull/3530))
43+
44+
## 📦 Dependencies
45+
46+
- Bump `rojopolis/spellcheck-github-actions` from 0.51.0 to 0.52.0 ([#3520](https://github.com/redis/go-redis/pull/3520))
47+
- Bump `github/codeql-action` from 3 to 4 ([#3544](https://github.com/redis/go-redis/pull/3544))
48+
49+
## 👥 Contributors
50+
51+
We'd like to thank all the contributors who worked on this release!
52+
53+
[@ndyakov](https://github.com/ndyakov), [@htemelski-redis](https://github.com/htemelski-redis), [@Sovietaced](https://github.com/Sovietaced), [@Udhayarajan](https://github.com/Udhayarajan), [@boekkooi-impossiblecloud](https://github.com/boekkooi-impossiblecloud), [@Pika-Gopher](https://github.com/Pika-Gopher), [@cxljs](https://github.com/cxljs), [@huiyifyj](https://github.com/huiyifyj), [@omid-h70](https://github.com/omid-h70)
54+
55+
---
56+
57+
**Full Changelog**: https://github.com/redis/go-redis/compare/v9.14.0...v9.16.0
58+
59+
60+
# 9.15.0 was accidentally released. Please use version 9.16.0 instead.
61+
362
# 9.15.0-beta.3 (2025-09-26)
463

564
## Highlights

acl_commands.go

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,12 @@ type ACLCmdable interface {
88
ACLLog(ctx context.Context, count int64) *ACLLogCmd
99
ACLLogReset(ctx context.Context) *StatusCmd
1010

11+
ACLGenPass(ctx context.Context, bit int) *StringCmd
12+
1113
ACLSetUser(ctx context.Context, username string, rules ...string) *StatusCmd
1214
ACLDelUser(ctx context.Context, username string) *IntCmd
15+
ACLUsers(ctx context.Context) *StringSliceCmd
16+
ACLWhoAmI(ctx context.Context) *StringCmd
1317
ACLList(ctx context.Context) *StringSliceCmd
1418

1519
ACLCat(ctx context.Context) *StringSliceCmd
@@ -65,6 +69,29 @@ func (c cmdable) ACLSetUser(ctx context.Context, username string, rules ...strin
6569
return cmd
6670
}
6771

72+
func (c cmdable) ACLGenPass(ctx context.Context, bit int) *StringCmd {
73+
args := make([]interface{}, 0, 3)
74+
args = append(args, "acl", "genpass")
75+
if bit > 0 {
76+
args = append(args, bit)
77+
}
78+
cmd := NewStringCmd(ctx, args...)
79+
_ = c(ctx, cmd)
80+
return cmd
81+
}
82+
83+
func (c cmdable) ACLUsers(ctx context.Context) *StringSliceCmd {
84+
cmd := NewStringSliceCmd(ctx, "acl", "users")
85+
_ = c(ctx, cmd)
86+
return cmd
87+
}
88+
89+
func (c cmdable) ACLWhoAmI(ctx context.Context) *StringCmd {
90+
cmd := NewStringCmd(ctx, "acl", "whoami")
91+
_ = c(ctx, cmd)
92+
return cmd
93+
}
94+
6895
func (c cmdable) ACLList(ctx context.Context) *StringSliceCmd {
6996
cmd := NewStringSliceCmd(ctx, "acl", "list")
7097
_ = c(ctx, cmd)

acl_commands_test.go

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,29 @@ var _ = Describe("ACL user commands", Label("NonRedisEnterprise"), func() {
9292
Expect(err).NotTo(HaveOccurred())
9393
Expect(res).To(HaveLen(1))
9494
Expect(res[0]).To(ContainSubstring("default"))
95+
96+
res, err = client.ACLUsers(ctx).Result()
97+
Expect(err).NotTo(HaveOccurred())
98+
Expect(res).To(HaveLen(1))
99+
Expect(res[0]).To(Equal("default"))
100+
101+
res1, err := client.ACLWhoAmI(ctx).Result()
102+
Expect(err).NotTo(HaveOccurred())
103+
Expect(res1).To(Equal("default"))
104+
})
105+
106+
It("gen password", func() {
107+
password, err := client.ACLGenPass(ctx, 0).Result()
108+
Expect(err).NotTo(HaveOccurred())
109+
Expect(password).NotTo(BeEmpty())
110+
})
111+
112+
It("gen password with length", func() {
113+
bit := 128
114+
password, err := client.ACLGenPass(ctx, bit).Result()
115+
Expect(err).NotTo(HaveOccurred())
116+
Expect(password).NotTo(BeEmpty())
117+
Expect(len(password)).To(Equal(bit / 4))
95118
})
96119

97120
It("setuser and deluser", func() {

0 commit comments

Comments
 (0)