From 62b62184f47e63b87de287e2cc4861e012b632c8 Mon Sep 17 00:00:00 2001 From: bang <3656828039@qq.com> Date: Fri, 10 Jul 2026 22:10:44 +0800 Subject: [PATCH] =?UTF-8?q?fix(grpc):=20Put/Delete=20=E8=B5=B0=20kv.Write?= =?UTF-8?q?=20=E4=BF=AE=E5=A4=8D=20standalone=20=E4=B8=8B=20nil=20raft=20p?= =?UTF-8?q?anic?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- test_grpc/grpc_server.go | 12 ++-------- test_grpc/grpc_server_test.go | 43 +++++++++++++++++++++++++++++++++++ 2 files changed, 45 insertions(+), 10 deletions(-) create mode 100644 test_grpc/grpc_server_test.go diff --git a/test_grpc/grpc_server.go b/test_grpc/grpc_server.go index 00e52d9..73b529e 100644 --- a/test_grpc/grpc_server.go +++ b/test_grpc/grpc_server.go @@ -22,11 +22,7 @@ func NewGRPCServer(kv *service.KVServer) *GRPCServer { func (s *GRPCServer) Put(ctx context.Context, req *PutRequest) (*PutResponse, error) { cmd := service.Command{Type: "Put", Key: req.Key, Value: req.Value} - index, err := s.kv.AppendEntry(cmd) - if err != nil { - return &PutResponse{Success: false}, nil - } - if err := s.kv.WaitForCommit(index); err != nil { + if err := s.kv.Write(cmd); err != nil { return &PutResponse{Success: false}, nil } return &PutResponse{Success: true}, nil @@ -42,11 +38,7 @@ func (s *GRPCServer) Get(ctx context.Context, req *GetRequest) (*GetResponse, er func (s *GRPCServer) Delete(ctx context.Context, req *DeleteRequest) (*DeleteResponse, error) { cmd := service.Command{Type: "Delete", Key: req.Key} - index, err := s.kv.AppendEntry(cmd) - if err != nil { - return &DeleteResponse{Success: false}, nil - } - if err := s.kv.WaitForCommit(index); err != nil { + if err := s.kv.Write(cmd); err != nil { return &DeleteResponse{Success: false}, nil } return &DeleteResponse{Success: true}, nil diff --git a/test_grpc/grpc_server_test.go b/test_grpc/grpc_server_test.go new file mode 100644 index 0000000..20a2a89 --- /dev/null +++ b/test_grpc/grpc_server_test.go @@ -0,0 +1,43 @@ +package test_grpc + +import ( + "context" + "os" + "testing" + "time" + + "github.com/NeverENG/BanDB/config" + "github.com/NeverENG/BanDB/service" +) + +// TestGRPCServer_PutGetStandalone 锁定回归:standalone 模式下 KVServer.raft 为 nil, +// gRPC 的 Put 走 kv.Write() 而非直接 AppendEntry,不再 nil 指针 panic。 +func TestGRPCServer_PutGetStandalone(t *testing.T) { + oldMode := config.G.Mode + oldWAL := config.G.WALPath + config.G.Mode = config.ModeStandalone + config.G.WALPath = "test_grpc_wal_" + time.Now().Format("20060102150405.000000") + ".log" + t.Cleanup(func() { + os.Remove(config.G.WALPath) + config.G.Mode = oldMode + config.G.WALPath = oldWAL + }) + + srv := NewGRPCServer(service.NewKVServer()) + + putResp, err := srv.Put(context.Background(), &PutRequest{Key: []byte("k1"), Value: []byte("v1")}) + if err != nil { + t.Fatalf("Put returned error: %v", err) + } + if !putResp.Success { + t.Fatalf("Put failed in standalone mode") + } + + getResp, err := srv.Get(context.Background(), &GetRequest{Key: []byte("k1")}) + if err != nil { + t.Fatalf("Get returned error: %v", err) + } + if !getResp.Success || string(getResp.Value) != "v1" { + t.Fatalf("Get returned success=%v value=%q, want true/v1", getResp.Success, getResp.Value) + } +}