@@ -11,6 +11,8 @@ import (
1111 "github.com/bootjp/elastickv/store"
1212 "github.com/cockroachdb/errors"
1313 "github.com/spaolacci/murmur3"
14+ "google.golang.org/grpc"
15+ "google.golang.org/grpc/credentials/insecure"
1416)
1517
1618var _ pb.RawKVServer = (* GRPCServer )(nil )
@@ -38,16 +40,32 @@ func NewGRPCServer(store store.ScanStore, coordinate *kv.Coordinate) *GRPCServer
3840}
3941
4042func (r GRPCServer ) RawGet (ctx context.Context , req * pb.RawGetRequest ) (* pb.RawGetResponse , error ) {
41- v , err := r .store .Get (ctx , req .Key )
42- if err != nil {
43- switch {
44- case errors .Is (err , store .ErrKeyNotFound ):
45- return & pb.RawGetResponse {
46- Value : nil ,
47- }, nil
48- default :
49- return nil , errors .WithStack (err )
43+ if r .coordinator .IsLeader () {
44+ v , err := r .store .Get (ctx , req .Key )
45+ if err != nil {
46+ switch {
47+ case errors .Is (err , store .ErrKeyNotFound ):
48+ return & pb.RawGetResponse {
49+ Value : nil ,
50+ }, nil
51+ default :
52+ return nil , errors .WithStack (err )
53+ }
5054 }
55+ r .log .InfoContext (ctx , "Get" ,
56+ slog .String ("key" , string (req .Key )),
57+ slog .String ("value" , string (v )))
58+
59+ return & pb.RawGetResponse {
60+ Value : v ,
61+ }, nil
62+ }
63+
64+ v , err := r .tryLeaderGet (req .Key )
65+ if err != nil {
66+ return & pb.RawGetResponse {
67+ Value : nil ,
68+ }, err
5169 }
5270
5371 r .log .InfoContext (ctx , "Get" ,
@@ -59,6 +77,30 @@ func (r GRPCServer) RawGet(ctx context.Context, req *pb.RawGetRequest) (*pb.RawG
5977 }, nil
6078}
6179
80+ func (r GRPCServer ) tryLeaderGet (key []byte ) ([]byte , error ) {
81+ addr := r .coordinator .RaftLeader ()
82+ if addr == "" {
83+ return nil , ErrLeaderNotFound
84+ }
85+
86+ conn , err := grpc .NewClient (string (addr ),
87+ grpc .WithTransportCredentials (insecure .NewCredentials ()),
88+ grpc .WithDefaultCallOptions (grpc .WaitForReady (true )),
89+ )
90+ if err != nil {
91+ return nil , errors .WithStack (err )
92+ }
93+ defer conn .Close ()
94+
95+ cli := pb .NewRawKVClient (conn )
96+ resp , err := cli .RawGet (context .Background (), & pb.RawGetRequest {Key : key })
97+ if err != nil {
98+ return nil , errors .WithStack (err )
99+ }
100+
101+ return resp .Value , nil
102+ }
103+
62104func (r GRPCServer ) RawPut (_ context.Context , req * pb.RawPutRequest ) (* pb.RawPutResponse , error ) {
63105 m , err := r .grpcTranscoder .RawPutToRequest (req )
64106 if err != nil {
0 commit comments