Skip to content

Commit 4ca4c35

Browse files
authored
Merge pull request #54 from RealFax/dev
[Client::bugfix fixed client nil pointer]
2 parents c26630c + cd4ccf9 commit 4ca4c35

File tree

12 files changed

+311
-39
lines changed

12 files changed

+311
-39
lines changed

client/example/basic-key-value/case.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@ package main
22

33
import (
44
"context"
5+
"google.golang.org/grpc"
6+
"google.golang.org/grpc/credentials/insecure"
57
"log"
68
"sync"
79
"sync/atomic"
@@ -15,7 +17,7 @@ func main() {
1517
//"127.0.0.1:3230",
1618
//"127.0.0.1:4230",
1719
"127.0.0.1:5230",
18-
}, false)
20+
}, grpc.WithTransportCredentials(insecure.NewCredentials()))
1921
if err != nil {
2022
log.Fatal(err)
2123
}

client/example/distributed-lock/case.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@ package main
33
import (
44
"context"
55
"github.com/RealFax/RedQueen/client"
6+
"google.golang.org/grpc"
7+
"google.golang.org/grpc/credentials/insecure"
68
"log"
79
"time"
810
)
@@ -15,7 +17,7 @@ func main() {
1517
"127.0.0.1:3230",
1618
"127.0.0.1:4230",
1719
"127.0.0.1:5230",
18-
}, false)
20+
}, grpc.WithTransportCredentials(insecure.NewCredentials()))
1921
if err != nil {
2022
log.Fatal(err)
2123
}

client/r_internal.go

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,9 @@ func (c *internalClient) AppendCluster(ctx context.Context, serverID, peerAddr s
2323
if err != nil {
2424
return err
2525
}
26+
defer client.conn.Release()
2627

27-
_, err = client.AppendCluster(ctx, &serverpb.AppendClusterRequest{
28+
_, err = client.instance.AppendCluster(ctx, &serverpb.AppendClusterRequest{
2829
ServerId: serverID,
2930
PeerAddr: peerAddr,
3031
Voter: voter,
@@ -41,12 +42,13 @@ func (c *internalClient) LeaderMonitor(ctx context.Context, recv *chan bool) err
4142
if err != nil {
4243
return err
4344
}
45+
defer client.conn.Release()
4446

4547
var cancel context.CancelFunc
4648
ctx, cancel = context.WithCancel(ctx)
4749
defer cancel()
4850

49-
monitor, err := client.LeaderMonitor(ctx, &serverpb.LeaderMonitorRequest{})
51+
monitor, err := client.instance.LeaderMonitor(ctx, &serverpb.LeaderMonitorRequest{})
5052
if err != nil {
5153
return err
5254
}

client/r_kv.go

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -32,8 +32,9 @@ func (c *kvClient) Set(ctx context.Context, key, value []byte, ttl uint32, names
3232
if err != nil {
3333
return err
3434
}
35+
defer client.conn.Release()
3536

36-
_, err = client.Set(ctx, &serverpb.SetRequest{
37+
_, err = client.instance.Set(ctx, &serverpb.SetRequest{
3738
Key: key,
3839
Value: value,
3940
Ttl: ttl,
@@ -49,8 +50,9 @@ func (c *kvClient) Get(ctx context.Context, key []byte, namespace *string) (*Val
4950
if err != nil {
5051
return nil, err
5152
}
53+
defer client.conn.Release()
5254

53-
resp, err := client.Get(ctx, &serverpb.GetRequest{
55+
resp, err := client.instance.Get(ctx, &serverpb.GetRequest{
5456
Key: key,
5557
Namespace: namespace,
5658
})
@@ -68,8 +70,9 @@ func (c *kvClient) PrefixScan(ctx context.Context, prefix []byte, offset, limit
6870
if err != nil {
6971
return nil, err
7072
}
73+
defer client.conn.Release()
7174

72-
resp, err := client.PrefixScan(ctx, &serverpb.PrefixScanRequest{
75+
resp, err := client.instance.PrefixScan(ctx, &serverpb.PrefixScanRequest{
7376
Prefix: prefix,
7477
Offset: offset,
7578
Limit: limit,
@@ -97,8 +100,9 @@ func (c *kvClient) TrySet(ctx context.Context, key, value []byte, ttl uint32, na
97100
if err != nil {
98101
return err
99102
}
103+
defer client.conn.Release()
100104

101-
_, err = client.TrySet(ctx, &serverpb.SetRequest{
105+
_, err = client.instance.TrySet(ctx, &serverpb.SetRequest{
102106
Key: key,
103107
Value: value,
104108
Ttl: ttl,
@@ -114,8 +118,9 @@ func (c *kvClient) Delete(ctx context.Context, key []byte, namespace *string) er
114118
if err != nil {
115119
return err
116120
}
121+
defer client.conn.Release()
117122

118-
_, err = client.Delete(ctx, &serverpb.DeleteRequest{
123+
_, err = client.instance.Delete(ctx, &serverpb.DeleteRequest{
119124
Key: key,
120125
Namespace: namespace,
121126
})
@@ -131,8 +136,9 @@ func (c *kvClient) Watch(ctx context.Context, watcher *Watcher) error {
131136
if err != nil {
132137
return err
133138
}
139+
defer client.conn.Release()
134140

135-
watch, err := client.Watch(ctx, &serverpb.WatchRequest{
141+
watch, err := client.instance.Watch(ctx, &serverpb.WatchRequest{
136142
Key: watcher.key,
137143
IgnoreErrors: watcher.ignoreErrors,
138144
Namespace: watcher.namespace,
@@ -178,8 +184,9 @@ func (c *kvClient) WatchPrefix(ctx context.Context, watcher *Watcher) error {
178184
if err != nil {
179185
return err
180186
}
187+
defer client.conn.Release()
181188

182-
watch, err := client.WatchPrefix(ctx, &serverpb.WatchPrefixRequest{
189+
watch, err := client.instance.WatchPrefix(ctx, &serverpb.WatchPrefixRequest{
183190
Prefix: watcher.key,
184191
Namespace: watcher.namespace,
185192
BufSize: func() *uint32 {

client/r_locker.go

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,9 @@ func (c *lockerClient) Lock(ctx context.Context, lockID string, ttl int32) error
2222
if err != nil {
2323
return err
2424
}
25+
defer client.conn.Release()
2526

26-
_, err = client.Lock(ctx, &serverpb.LockRequest{
27+
_, err = client.instance.Lock(ctx, &serverpb.LockRequest{
2728
LockId: lockID,
2829
Ttl: ttl,
2930
})
@@ -35,8 +36,9 @@ func (c *lockerClient) Unlock(ctx context.Context, lockID string) error {
3536
if err != nil {
3637
return err
3738
}
39+
defer client.conn.Release()
3840

39-
_, err = client.Unlock(ctx, &serverpb.UnlockRequest{
41+
_, err = client.instance.Unlock(ctx, &serverpb.UnlockRequest{
4042
LockId: lockID,
4143
})
4244
return err
@@ -47,8 +49,9 @@ func (c *lockerClient) TryLock(ctx context.Context, lockID string, ttl int32, de
4749
if err != nil {
4850
return err
4951
}
52+
defer client.conn.Release()
5053

51-
_, err = client.TryLock(ctx, &serverpb.TryLockRequest{
54+
_, err = client.instance.TryLock(ctx, &serverpb.TryLockRequest{
5255
LockId: lockID,
5356
Ttl: ttl,
5457
Deadline: deadline,

client/t_conn.go

Lines changed: 35 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -12,17 +12,17 @@ import (
1212
)
1313

1414
type Conn interface {
15-
ReadOnly() (*grpc.ClientConn, error)
16-
WriteOnly() (*grpc.ClientConn, error)
15+
ReadOnly() (*GrpcPoolConn, error)
16+
WriteOnly() (*GrpcPoolConn, error)
1717
Close() error
1818
}
1919

2020
type clientConn struct {
2121
state atomic.Bool
2222
mu sync.Mutex
2323
ctx context.Context
24-
writeOnly *grpc.ClientConn
25-
readOnly map[string]*grpc.ClientConn
24+
writeOnly *GrpcPool
25+
readOnly map[string]*GrpcPool
2626

2727
endpoints []string
2828
}
@@ -49,7 +49,8 @@ func (c *clientConn) listenLeader() {
4949
wg := sync.WaitGroup{}
5050
wg.Add(len(c.readOnly))
5151

52-
finalTry := func(conn *grpc.ClientConn) {
52+
finalTry := func(conn *GrpcPoolConn) {
53+
defer conn.Release()
5354
var (
5455
err error
5556
monitor serverpb.RedQueen_LeaderMonitorClient
@@ -87,13 +88,17 @@ func (c *clientConn) listenLeader() {
8788
}
8889

8990
for _, conn := range c.readOnly {
90-
go finalTry(conn)
91+
cc, err := conn.Alloc()
92+
if err != nil {
93+
panic(err)
94+
}
95+
go finalTry(cc)
9196
}
9297

9398
wg.Wait()
9499
}
95100

96-
func (c *clientConn) ReadOnly() (*grpc.ClientConn, error) {
101+
func (c *clientConn) ReadOnly() (*GrpcPoolConn, error) {
97102
size := len(c.readOnly)
98103
if size == 0 {
99104
return nil, errors.New("read-only not maintained")
@@ -104,21 +109,31 @@ func (c *clientConn) ReadOnly() (*grpc.ClientConn, error) {
104109
round, _ = rand.Int(rand.Reader, big.NewInt(int64(size)))
105110
)
106111

107-
for _, conn := range c.readOnly {
112+
for _, pool := range c.readOnly {
108113
step++
109-
if step == round.Int64() {
110-
return conn, nil
114+
if step != round.Int64() {
115+
continue
116+
}
117+
118+
cc, err := pool.Alloc()
119+
if err != nil {
120+
return nil, err
111121
}
122+
return cc, nil
112123
}
113124

114125
return nil, errors.New("unexpected")
115126
}
116127

117-
func (c *clientConn) WriteOnly() (*grpc.ClientConn, error) {
128+
func (c *clientConn) WriteOnly() (*GrpcPoolConn, error) {
118129
if c.writeOnly == nil {
119130
return nil, errors.New("write-only not maintained")
120131
}
121-
return c.writeOnly, nil
132+
cc, err := c.writeOnly.Alloc()
133+
if err != nil {
134+
return nil, err
135+
}
136+
return cc, nil
122137
}
123138

124139
func (c *clientConn) Close() error {
@@ -127,8 +142,10 @@ func (c *clientConn) Close() error {
127142
}
128143
c.state.Store(false)
129144

130-
c.writeOnly.Close()
131-
c.writeOnly = nil
145+
if c.writeOnly != nil {
146+
c.writeOnly.Close()
147+
c.writeOnly = nil
148+
}
132149

133150
for key, conn := range c.readOnly {
134151
conn.Close()
@@ -143,22 +160,22 @@ func NewClientConn(ctx context.Context, endpoints []string, opts ...grpc.DialOpt
143160
state: atomic.Bool{},
144161
ctx: ctx,
145162
writeOnly: nil,
146-
readOnly: make(map[string]*grpc.ClientConn),
163+
readOnly: make(map[string]*GrpcPool),
147164
endpoints: endpoints,
148165
}
149166
cc.state.Store(true)
150167

151168
var (
152169
err error
153-
conn *grpc.ClientConn
170+
pool *GrpcPool
154171
)
155172

156173
// init
157174
for _, endpoint := range endpoints {
158-
if conn, err = grpc.DialContext(ctx, endpoint, opts...); err != nil {
175+
if pool, err = NewGrpcPool(ctx, endpoint, 16, opts...); err != nil {
159176
return nil, err
160177
}
161-
cc.readOnly[endpoint] = conn
178+
cc.readOnly[endpoint] = pool
162179
}
163180

164181
// start listen

0 commit comments

Comments
 (0)