Skip to content

Commit 8b88615

Browse files
authored
refactor: refactor the picker (#19)
* refactor: refactor the picker * refactor: refactor the picker * refactor: refactor the picker
1 parent 1e2c0dd commit 8b88615

File tree

4 files changed

+8
-72
lines changed

4 files changed

+8
-72
lines changed

go.mod

+1-1
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ require (
4646
golang.org/x/sys v0.8.0 // indirect
4747
golang.org/x/text v0.9.0 // indirect
4848
google.golang.org/genproto v0.0.0-20230306155012-7f2fa6fef1f4 // indirect
49-
google.golang.org/grpc v1.55.0 // indirect
49+
google.golang.org/grpc v1.55.1 // indirect
5050
google.golang.org/protobuf v1.30.0 // indirect
5151
gopkg.in/yaml.v2 v2.4.0 // indirect
5252
gopkg.in/yaml.v3 v3.0.1 // indirect

go.sum

+2-2
Original file line numberDiff line numberDiff line change
@@ -466,8 +466,8 @@ google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTp
466466
google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=
467467
google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34=
468468
google.golang.org/grpc v1.42.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU=
469-
google.golang.org/grpc v1.55.0 h1:3Oj82/tFSCeUrRTg/5E/7d/W5A1tj6Ky1ABAuZuv5ag=
470-
google.golang.org/grpc v1.55.0/go.mod h1:iYEXKGkEBhg1PjZQvoYEVPTDkHo1/bjTnfwTeGONTY8=
469+
google.golang.org/grpc v1.55.1 h1:36vzoa06ohIaveIgzr0qWDCImkKeVjvnNSV6uOmwnOw=
470+
google.golang.org/grpc v1.55.1/go.mod h1:iYEXKGkEBhg1PjZQvoYEVPTDkHo1/bjTnfwTeGONTY8=
471471
google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
472472
google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
473473
google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=

multiple.go

+3-65
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,7 @@ import (
44
"context"
55
"database/sql"
66
"strings"
7-
"sync/atomic"
8-
"time"
97

10-
"github.com/zeromicro/go-zero/core/logx"
11-
"github.com/zeromicro/go-zero/core/proc"
128
"github.com/zeromicro/go-zero/core/stores/sqlx"
139
"github.com/zeromicro/go-zero/core/trace"
1410
"go.opentelemetry.io/otel/attribute"
@@ -31,17 +27,14 @@ type (
3127
DBConf struct {
3228
Leader string
3329
Followers []string `json:",optional"`
34-
// BackLeader back to Leader when all Followers are not available.
35-
BackLeader bool `json:",optional"`
36-
FollowerHeartbeat time.Duration `json:",default=60s"`
3730
}
3831

3932
SqlOption func(*multipleSqlConn)
4033

4134
multipleSqlConn struct {
4235
leader sqlx.SqlConn
4336
enableFollower bool
44-
p2cPicker atomic.Value // picker
37+
p2cPicker picker // picker
4538
followers []sqlx.SqlConn
4639
conf DBConf
4740
accept func(error) bool
@@ -69,15 +62,7 @@ func NewMultipleSqlConn(driverName string, conf DBConf, opts ...SqlOption) sqlx.
6962
opt(conn)
7063
}
7164

72-
conn.p2cPicker.Store(newP2cPicker(followers, conn.accept))
73-
74-
if conn.enableFollower {
75-
ctx, cancelFunc := context.WithCancel(context.Background())
76-
proc.AddShutdownListener(func() {
77-
cancelFunc()
78-
})
79-
go conn.startFollowerHeartbeat(ctx)
80-
}
65+
conn.p2cPicker = newP2cPicker(followers, conn.accept)
8166

8267
return conn
8368
}
@@ -180,7 +165,7 @@ func (m *multipleSqlConn) getQueryDB(ctx context.Context, query string) queryDB
180165
return queryDB{conn: m.leader}
181166
}
182167

183-
result, err := m.p2cPicker.Load().(picker).pick()
168+
result, err := m.p2cPicker.pick()
184169
if err == nil {
185170
return queryDB{
186171
conn: result.conn,
@@ -190,41 +175,9 @@ func (m *multipleSqlConn) getQueryDB(ctx context.Context, query string) queryDB
190175
}
191176
}
192177

193-
if !m.conf.BackLeader {
194-
return queryDB{error: err}
195-
}
196-
197178
return queryDB{conn: m.leader}
198179
}
199180

200-
func (m *multipleSqlConn) heartbeat() {
201-
conns := make([]sqlx.SqlConn, 0, len(m.followers))
202-
for i, follower := range m.followers {
203-
err := pingDB(follower)
204-
if err != nil {
205-
logx.Errorw("follower db heartbeat failure, it will be automatically removed", logx.Field("err", err), logx.Field("db", i))
206-
207-
continue
208-
}
209-
210-
conns = append(conns, follower)
211-
}
212-
213-
m.p2cPicker.Store(newP2cPicker(conns, m.accept))
214-
}
215-
216-
func (m *multipleSqlConn) startFollowerHeartbeat(ctx context.Context) {
217-
ticker := time.NewTicker(m.conf.FollowerHeartbeat)
218-
for {
219-
select {
220-
case <-ctx.Done():
221-
return
222-
case <-ticker.C:
223-
m.heartbeat()
224-
}
225-
}
226-
}
227-
228181
func (m *multipleSqlConn) startSpan(ctx context.Context) (context.Context, oteltrace.Span) {
229182
tracer := trace.TracerFromContext(ctx)
230183
ctx, span := tracer.Start(ctx, spanName, oteltrace.WithSpanKind(oteltrace.SpanKindClient))
@@ -281,21 +234,6 @@ func (q *queryDB) query(ctx context.Context, query func(ctx context.Context, con
281234
return query(ctx, q.conn)
282235
}
283236

284-
func pingDB(conn sqlx.SqlConn) error {
285-
return pingCtxDB(context.Background(), conn)
286-
}
287-
288-
func pingCtxDB(ctx context.Context, conn sqlx.SqlConn) error {
289-
db, err := conn.RawDB()
290-
if err != nil {
291-
return err
292-
}
293-
294-
return db.PingContext(ctx)
295-
}
296-
297-
// -------------
298-
299237
func WithAccept(accept func(err error) bool) SqlOption {
300238
return func(conn *multipleSqlConn) {
301239
conn.accept = accept

multiple_test.go

+2-4
Original file line numberDiff line numberDiff line change
@@ -25,10 +25,8 @@ func TestNewMultipleSqlConn(t *testing.T) {
2525
leaderMock.ExpectPing().WillDelayFor(time.Millisecond)
2626

2727
mysql := NewMultipleSqlConn(mockedDatasource, DBConf{
28-
Leader: leader,
29-
Followers: []string{follower1},
30-
BackLeader: false,
31-
FollowerHeartbeat: time.Minute,
28+
Leader: leader,
29+
Followers: []string{follower1},
3230
})
3331

3432
follower1Mock.ExpectExec("any")

0 commit comments

Comments
 (0)