Skip to content

Commit 77b6072

Browse files
authored
Merge branch 'main' into codex/fix-issue-with-elastickv-feature-rrq5bv
2 parents 67e1e50 + 70e2161 commit 77b6072

File tree

14 files changed

+323
-145
lines changed

14 files changed

+323
-145
lines changed

.github/workflows/docker-image.yml

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
11
name: Docker Image CI
2+
permissions:
3+
contents: read
4+
packages: write
25

36
on:
47
push:
@@ -14,7 +17,7 @@ jobs:
1417
runs-on: ubuntu-latest
1518

1619
steps:
17-
- uses: actions/checkout@v5
20+
- uses: actions/checkout@v6
1821
with:
1922
submodules: true
2023
# - name: Set up QEMU

.github/workflows/go-mod-fix.yaml

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,12 @@ on:
66

77
jobs:
88
go-mod-fix:
9+
permissions:
10+
contents: write
911
runs-on: ubuntu-latest
1012
steps:
1113
- name: checkout
12-
uses: actions/checkout@v5
14+
uses: actions/checkout@v6
1315
with:
1416
fetch-depth: 2
1517
- name: fix

.github/workflows/go-test.yml

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,14 +8,16 @@ concurrency:
88
# cancel-in-progress: true
99

1010
name: Test
11+
permissions:
12+
contents: read
1113
jobs:
1214
test:
1315
strategy:
1416
matrix:
1517
os: [ [ubuntu-latest] ]
1618
runs-on: ${{ matrix.os }}
1719
steps:
18-
- uses: actions/checkout@v5
20+
- uses: actions/checkout@v6
1921
- uses: actions/setup-go@v6
2022
with:
2123
go-version-file: 'go.mod'

.github/workflows/golangci-lint.yml

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,13 @@ concurrency:
1111
jobs:
1212
golangci-lint:
1313
name: golangci-lint
14+
permissions:
15+
contents: read
16+
pull-requests: write
1417
runs-on: ubuntu-latest
1518
steps:
1619
- name: Check out code into the Go module directory
17-
uses: actions/checkout@v5
20+
uses: actions/checkout@v6
1821
- name: golangci-lint
1922
uses: reviewdog/action-golangci-lint@v2
2023
with:

.github/workflows/jepsen-test.yml

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,15 @@ concurrency:
44
group: ${{ github.workflow }}-${{ github.ref }}-jepsen-test
55

66
name: Jepsen Test
7+
permissions:
8+
contents: read
79
jobs:
810
test:
911
runs-on: ubuntu-latest
1012
env:
1113
RUN_JEPSEN: 'true'
1214
steps:
13-
- uses: actions/checkout@v5
15+
- uses: actions/checkout@v6
1416
- uses: actions/setup-java@v5
1517
with:
1618
distribution: temurin

adapter/test_util.go

Lines changed: 83 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -122,43 +122,105 @@ func newNode(grpcAddress, raftAddress, redisAddress, dynamoAddress string, r *ra
122122

123123
//nolint:unparam
124124
func createNode(t *testing.T, n int) ([]Node, []string, []string) {
125-
var grpcAdders []string
126-
var redisAdders []string
127-
var nodes []Node
128-
129125
const (
130126
waitTimeout = 5 * time.Second
131127
waitInterval = 100 * time.Millisecond
132128
)
133129

134-
cfg := raft.Configuration{}
135-
ports := make([]portsAdress, n)
130+
t.Helper()
136131

137132
ctx := context.Background()
138-
var lc net.ListenConfig
139133

140-
// port assign
134+
ports := assignPorts(n)
135+
cfg := buildRaftConfig(n, ports)
136+
nodes, grpcAdders, redisAdders := setupNodes(t, ctx, n, ports, cfg)
137+
138+
waitForNodeListeners(t, ctx, nodes, waitTimeout, waitInterval)
139+
waitForRaftReadiness(t, nodes, waitTimeout, waitInterval)
140+
141+
return nodes, grpcAdders, redisAdders
142+
}
143+
144+
func waitForNodeListeners(t *testing.T, ctx context.Context, nodes []Node, waitTimeout, waitInterval time.Duration) {
145+
t.Helper()
146+
d := &net.Dialer{Timeout: time.Second}
147+
for _, n := range nodes {
148+
assert.Eventually(t, func() bool {
149+
conn, err := d.DialContext(ctx, "tcp", n.grpcAddress)
150+
if err != nil {
151+
return false
152+
}
153+
_ = conn.Close()
154+
conn, err = d.DialContext(ctx, "tcp", n.redisAddress)
155+
if err != nil {
156+
return false
157+
}
158+
_ = conn.Close()
159+
return true
160+
}, waitTimeout, waitInterval)
161+
}
162+
}
163+
164+
func waitForRaftReadiness(t *testing.T, nodes []Node, waitTimeout, waitInterval time.Duration) {
165+
t.Helper()
166+
assert.Eventually(t, func() bool {
167+
return nodes[0].raft.State() == raft.Leader
168+
}, waitTimeout, waitInterval)
169+
170+
expectedLeader := raft.ServerAddress(nodes[0].raftAddress)
171+
assert.Eventually(t, func() bool {
172+
for i, n := range nodes {
173+
state := n.raft.State()
174+
if i == 0 {
175+
if state != raft.Leader {
176+
return false
177+
}
178+
} else if state != raft.Follower {
179+
return false
180+
}
181+
182+
addr, _ := n.raft.LeaderWithID()
183+
if addr != expectedLeader {
184+
return false
185+
}
186+
}
187+
return true
188+
}, waitTimeout, waitInterval)
189+
}
190+
191+
func assignPorts(n int) []portsAdress {
192+
ports := make([]portsAdress, n)
141193
for i := 0; i < n; i++ {
142194
ports[i] = portAssigner()
143195
}
196+
return ports
197+
}
144198

145-
// build raft node config
199+
func buildRaftConfig(n int, ports []portsAdress) raft.Configuration {
200+
cfg := raft.Configuration{}
146201
for i := 0; i < n; i++ {
147-
var suffrage raft.ServerSuffrage
202+
suffrage := raft.Nonvoter
148203
if i == 0 {
149204
suffrage = raft.Voter
150-
} else {
151-
suffrage = raft.Nonvoter
152205
}
153206

154-
server := raft.Server{
207+
cfg.Servers = append(cfg.Servers, raft.Server{
155208
Suffrage: suffrage,
156209
ID: raft.ServerID(strconv.Itoa(i)),
157210
Address: raft.ServerAddress(ports[i].raftAddress),
158-
}
159-
cfg.Servers = append(cfg.Servers, server)
211+
})
160212
}
161213

214+
return cfg
215+
}
216+
217+
func setupNodes(t *testing.T, ctx context.Context, n int, ports []portsAdress, cfg raft.Configuration) ([]Node, []string, []string) {
218+
t.Helper()
219+
var grpcAdders []string
220+
var redisAdders []string
221+
var nodes []Node
222+
var lc net.ListenConfig
223+
162224
for i := 0; i < n; i++ {
163225
st := store.NewRbMemoryStore()
164226
trxSt := store.NewMemoryStoreDefaultTTL()
@@ -186,16 +248,16 @@ func createNode(t *testing.T, n int) ([]Node, []string, []string) {
186248

187249
grpcAdders = append(grpcAdders, port.grpcAddress)
188250
redisAdders = append(redisAdders, port.redisAddress)
189-
go func() {
190-
assert.NoError(t, s.Serve(grpcSock))
191-
}()
251+
go func(srv *grpc.Server, lis net.Listener) {
252+
assert.NoError(t, srv.Serve(lis))
253+
}(s, grpcSock)
192254

193255
l, err := lc.Listen(ctx, "tcp", port.redisAddress)
194256
assert.NoError(t, err)
195257
rd := NewRedisServer(l, st, coordinator)
196-
go func() {
197-
assert.NoError(t, rd.Run())
198-
}()
258+
go func(server *RedisServer) {
259+
assert.NoError(t, server.Run())
260+
}(rd)
199261

200262
dl, err := lc.Listen(ctx, "tcp", port.dynamoAddress)
201263
assert.NoError(t, err)
@@ -217,32 +279,6 @@ func createNode(t *testing.T, n int) ([]Node, []string, []string) {
217279
))
218280
}
219281

220-
d := &net.Dialer{Timeout: time.Second}
221-
for _, n := range nodes {
222-
assert.Eventually(t, func() bool {
223-
conn, err := d.DialContext(ctx, "tcp", n.grpcAddress)
224-
if err != nil {
225-
return false
226-
}
227-
_ = conn.Close()
228-
conn, err = d.DialContext(ctx, "tcp", n.redisAddress)
229-
if err != nil {
230-
return false
231-
}
232-
_ = conn.Close()
233-
conn, err = d.DialContext(ctx, "tcp", n.dynamoAddress)
234-
if err != nil {
235-
return false
236-
}
237-
_ = conn.Close()
238-
return true
239-
}, waitTimeout, waitInterval)
240-
}
241-
242-
assert.Eventually(t, func() bool {
243-
return nodes[0].raft.State() == raft.Leader
244-
}, waitTimeout, waitInterval)
245-
246282
return nodes, grpcAdders, redisAdders
247283
}
248284

go.mod

Lines changed: 25 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -2,46 +2,47 @@ module github.com/bootjp/elastickv
22

33
go 1.24.0
44

5-
toolchain go1.25.1
5+
toolchain go1.25.5
66

77
require (
88
github.com/Jille/grpc-multi-resolver v1.3.0
99
github.com/Jille/raft-grpc-leader-rpc v1.1.0
1010
github.com/Jille/raft-grpc-transport v1.6.1
1111
github.com/Jille/raftadmin v1.2.1
12-
github.com/aws/aws-sdk-go-v2 v1.38.3
13-
github.com/aws/aws-sdk-go-v2/config v1.31.6
14-
github.com/aws/aws-sdk-go-v2/credentials v1.18.10
15-
github.com/aws/aws-sdk-go-v2/service/dynamodb v1.50.1
12+
github.com/aws/aws-sdk-go-v2 v1.40.1
13+
github.com/aws/aws-sdk-go-v2/config v1.32.3
14+
github.com/aws/aws-sdk-go-v2/credentials v1.19.3
15+
github.com/aws/aws-sdk-go-v2/service/dynamodb v1.53.3
1616
github.com/cockroachdb/errors v1.12.0
1717
github.com/emirpasic/gods v1.18.1
1818
github.com/hashicorp/go-hclog v1.6.3
1919
github.com/hashicorp/raft v1.7.3
2020
github.com/hashicorp/raft-boltdb/v2 v2.3.1
2121
github.com/pkg/errors v0.9.1
22-
github.com/redis/go-redis/v9 v9.13.0
22+
github.com/redis/go-redis/v9 v9.17.2
2323
github.com/spaolacci/murmur3 v1.1.0
2424
github.com/stretchr/testify v1.11.1
2525
github.com/tidwall/redcon v1.6.2
2626
go.etcd.io/bbolt v1.4.3
27-
golang.org/x/sync v0.17.0
28-
google.golang.org/grpc v1.75.0
29-
google.golang.org/protobuf v1.36.9
27+
golang.org/x/sync v0.18.0
28+
google.golang.org/grpc v1.77.0
29+
google.golang.org/protobuf v1.36.11
3030
)
3131

3232
require (
3333
github.com/armon/go-metrics v0.4.1 // indirect
34-
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.6 // indirect
35-
github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.6 // indirect
36-
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.6 // indirect
37-
github.com/aws/aws-sdk-go-v2/internal/ini v1.8.3 // indirect
38-
github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.1 // indirect
39-
github.com/aws/aws-sdk-go-v2/service/internal/endpoint-discovery v1.11.6 // indirect
40-
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.6 // indirect
41-
github.com/aws/aws-sdk-go-v2/service/sso v1.29.1 // indirect
42-
github.com/aws/aws-sdk-go-v2/service/ssooidc v1.34.2 // indirect
43-
github.com/aws/aws-sdk-go-v2/service/sts v1.38.2 // indirect
44-
github.com/aws/smithy-go v1.23.0 // indirect
34+
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.15 // indirect
35+
github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.15 // indirect
36+
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.15 // indirect
37+
github.com/aws/aws-sdk-go-v2/internal/ini v1.8.4 // indirect
38+
github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.4 // indirect
39+
github.com/aws/aws-sdk-go-v2/service/internal/endpoint-discovery v1.11.15 // indirect
40+
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.15 // indirect
41+
github.com/aws/aws-sdk-go-v2/service/signin v1.0.3 // indirect
42+
github.com/aws/aws-sdk-go-v2/service/sso v1.30.6 // indirect
43+
github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.11 // indirect
44+
github.com/aws/aws-sdk-go-v2/service/sts v1.41.3 // indirect
45+
github.com/aws/smithy-go v1.24.0 // indirect
4546
github.com/boltdb/bolt v1.3.1 // indirect
4647
github.com/cespare/xxhash/v2 v2.3.0 // indirect
4748
github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b // indirect
@@ -66,9 +67,9 @@ require (
6667
github.com/rogpeppe/go-internal v1.13.1 // indirect
6768
github.com/tidwall/btree v1.1.0 // indirect
6869
github.com/tidwall/match v1.1.1 // indirect
69-
golang.org/x/net v0.41.0 // indirect
70-
golang.org/x/sys v0.33.0 // indirect
71-
golang.org/x/text v0.26.0 // indirect
72-
google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7 // indirect
70+
golang.org/x/net v0.46.1-0.20251013234738-63d1a5100f82 // indirect
71+
golang.org/x/sys v0.37.0 // indirect
72+
golang.org/x/text v0.30.0 // indirect
73+
google.golang.org/genproto/googleapis/rpc v0.0.0-20251022142026-3a174f9686a8 // indirect
7374
gopkg.in/yaml.v3 v3.0.1 // indirect
7475
)

0 commit comments

Comments
 (0)