/
server.go
93 lines (81 loc) 路 2.31 KB
/
server.go
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
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
package server
import (
"context"
"fmt"
"log"
"github.com/amitt001/moodb/config"
"net"
"os"
"os/signal"
"syscall"
"google.golang.org/grpc"
pb "github.com/amitt001/moodb/mdbserver/mdbserverpb"
)
const serverStartMsg = "MooDB server"
// server is used to implement MdbServer.
type server struct {
db *database
config *config.ServerConfig
pb.UnimplementedMdbServer
}
// Get implements server side Mdb Get method
func (s *server) Get(ctx context.Context, in *pb.GetRequest) (*pb.GetResponse, error) {
log.Printf("[Client: %s] GET: %s", in.ClientId, in.Key)
var respMsg string
value, err := s.db.Get(in.Key)
if err != nil {
respMsg = err.Error()
}
return &pb.GetResponse{Value: value, RespMsg: respMsg, StatusCode: 200}, nil
}
// Set implements server side Mdb Set method
func (s *server) Set(ctx context.Context, in *pb.SetRequest) (*pb.SetResponse, error) {
log.Printf("[Client: %s] SET: %s", in.ClientId, in.Key)
var respMsg string
value, err := s.db.Set(in.Key, in.Value)
if err != nil {
respMsg = err.Error()
}
return &pb.SetResponse{Message: value, RespMsg: respMsg, StatusCode: 201}, nil
}
// Del implements server side Mdb del method
func (s *server) Del(ctx context.Context, in *pb.DelRequest) (*pb.DelResponse, error) {
log.Printf("[Client: %s] DEL: %s", in.ClientId, in.Key)
var respMsg string
value, err := s.db.Del(in.Key)
if err != nil {
respMsg = err.Error()
}
return &pb.DelResponse{Message: value, RespMsg: respMsg, StatusCode: 204}, nil
}
func cleanup(db *database) {
db.walObj.Close()
}
// Run setups and starts the MooDB server
func Run() {
// Setup config
cfg := config.Config("server").(*config.ServerConfig)
// Create a fresh new DB instance.
db := NewDb(cfg.Server.DB, cfg.Wal.Datadir)
// Setup cleanup workflow
c := make(chan os.Signal, 1)
signal.Notify(c, os.Interrupt, syscall.SIGTERM)
go func() {
<-c
cleanup(db)
os.Exit(1)
}()
serverObj := &server{db: db, config: cfg}
serverAddr := fmt.Sprintf("%s:%d", cfg.Server.Host, cfg.Server.Port)
lis, err := net.Listen("tcp", serverAddr)
if err != nil {
log.Fatalf("Failed to listen: %v", err)
}
// Setup gRPC server
s := grpc.NewServer()
pb.RegisterMdbServer(s, serverObj)
fmt.Println("*************\n", serverStartMsg, "\n*************")
if err := s.Serve(lis); err != nil {
log.Fatalf("Failed to serve: %v", err)
}
}