@@ -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,33 @@ 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+
44+ if r .coordinator .IsLeader () {
45+ v , err := r .store .Get (ctx , req .Key )
46+ if err != nil {
47+ switch {
48+ case errors .Is (err , store .ErrKeyNotFound ):
49+ return & pb.RawGetResponse {
50+ Value : nil ,
51+ }, nil
52+ default :
53+ return nil , errors .WithStack (err )
54+ }
5055 }
56+ r .log .InfoContext (ctx , "Get" ,
57+ slog .String ("key" , string (req .Key )),
58+ slog .String ("value" , string (v )))
59+
60+ return & pb.RawGetResponse {
61+ Value : v ,
62+ }, nil
63+ }
64+
65+ v , err := r .tryLeaderGet (req .Key )
66+ if err != nil {
67+ return & pb.RawGetResponse {
68+ Value : nil ,
69+ }, err
5170 }
5271
5372 r .log .InfoContext (ctx , "Get" ,
@@ -59,6 +78,30 @@ func (r GRPCServer) RawGet(ctx context.Context, req *pb.RawGetRequest) (*pb.RawG
5978 }, nil
6079}
6180
81+ func (r GRPCServer ) tryLeaderGet (key []byte ) ([]byte , error ) {
82+ addr := r .coordinator .RaftLeader ()
83+ if addr == "" {
84+ return nil , ErrLeaderNotFound
85+ }
86+
87+ conn , err := grpc .NewClient (string (addr ),
88+ grpc .WithTransportCredentials (insecure .NewCredentials ()),
89+ grpc .WithDefaultCallOptions (grpc .WaitForReady (true )),
90+ )
91+ if err != nil {
92+ return nil , errors .WithStack (err )
93+ }
94+ defer conn .Close ()
95+
96+ cli := pb .NewRawKVClient (conn )
97+ resp , err := cli .RawGet (context .Background (), & pb.RawGetRequest {Key : key })
98+ if err != nil {
99+ return nil , errors .WithStack (err )
100+ }
101+
102+ return resp .Value , nil
103+ }
104+
62105func (r GRPCServer ) RawPut (_ context.Context , req * pb.RawPutRequest ) (* pb.RawPutResponse , error ) {
63106 m , err := r .grpcTranscoder .RawPutToRequest (req )
64107 if err != nil {
0 commit comments