-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathrpcserver.go
More file actions
62 lines (54 loc) · 1.11 KB
/
rpcserver.go
File metadata and controls
62 lines (54 loc) · 1.11 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
package main
import (
"encoding/json"
"fmt"
"golang.org/x/net/context"
"google.golang.org/grpc"
"net"
"time"
)
const (
RPC_OK = iota
RPC_ERR
RPC_STATUS_OK
RPC_STATUS_FAIL
)
func NewRPCServer(addr string) (*RaftRpcService, error) {
rpc := &RaftRpcService{}
listener, err := net.Listen("tcp", addr)
if err != nil {
return nil, err
}
grpcServer := grpc.NewServer()
RegisterRaftRpcServer(grpcServer, rpc)
return rpc, grpcServer.Serve(listener)
}
type RaftRpcService struct{}
//Handler rpc request
func (rrs *RaftRpcService) OpRPC(ctx context.Context, r *OpRequest) (*OpReply, error) {
var err error
var value []byte
switch r.Op {
case CmdGet:
value, err = localServer.FSM.Get([]byte(r.Bucket), []byte(r.Key))
//CmdSet
default:
raftState := localServer.Raft
reqCmd, _ := json.Marshal(r)
err = raftState.Apply(reqCmd, time.Second).Error()
}
if err != nil {
return &OpReply{
Status: RPC_STATUS_FAIL,
ErrCode: RPC_ERR,
Msg: fmt.Sprintf("%v", err),
Value: nil,
}, nil
}
return &OpReply{
Status: RPC_STATUS_OK,
ErrCode: RPC_OK,
Msg: "",
Value: value,
}, nil
}