This repository has been archived by the owner on Jul 4, 2022. It is now read-only.
/
start.go
108 lines (92 loc) · 2.24 KB
/
start.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
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
package cli
import (
"bytes"
"context"
"fmt"
"log"
"os"
"os/signal"
"syscall"
"text/tabwriter"
"time"
"github.com/pkg/errors"
"github.com/spf13/cobra"
"github.com/taku-k/polymerase/pkg/server"
"github.com/taku-k/polymerase/pkg/utils"
)
var startCmd = &cobra.Command{
Use: "start",
Short: "Runs server",
RunE: startServer,
}
// startServer creates, configures and runs server
func startServer(cmd *cobra.Command, args []string) error {
if len(args) > 0 {
return usageAndError(cmd)
}
// Signal
signalCh := make(chan os.Signal, 1)
signal.Notify(signalCh, syscall.SIGINT, syscall.SIGTERM, syscall.SIGQUIT)
ctx := context.Background()
if err := setupAndInitializing(); err != nil {
return errors.Wrap(err, "Failed to create backup directory")
}
// Server
s, err := server.NewServer(serverCfg)
if err != nil {
return errors.Wrap(err, "Server cannot be created")
}
errCh := make(chan error, 1)
go func() {
if err := func() error {
var buf bytes.Buffer
tw := tabwriter.NewWriter(&buf, 2, 1, 2, ' ', 0)
fmt.Fprintf(tw, "Polymerase server starting at %s\n", time.Now())
fmt.Fprintf(tw, "port:\t%s\n", serverCfg.Port)
fmt.Fprintf(tw, "store_dir:\t%s\n", serverCfg.StoreDir.Path)
if err := tw.Flush(); err != nil {
return err
}
msg := buf.String()
fmt.Fprint(os.Stderr, msg)
// Start server
if err := s.Start(ctx); err != nil {
return err
}
return nil
}(); err != nil {
errCh <- err
}
}()
select {
case err := <-errCh:
log.Printf("polymerase server is failed: %v\n", err)
os.Exit(1)
case sig := <-signalCh:
log.Printf("received signal '%s'\n", sig)
}
shutdownCtx, cancel := context.WithTimeout(
context.Background(),
3*time.Second,
)
defer cancel()
stopped := make(chan struct{}, 1)
go s.Shutdown(shutdownCtx, stopped)
select {
case <-shutdownCtx.Done():
fmt.Fprintln(os.Stdout, "time limit reached, initiating hard shutdown")
s.CleanupEtcdDir()
return errors.New("Server is failed")
case <-stopped:
log.Println("server shutdown completed")
fmt.Fprintln(os.Stdout, "server shutdown completed")
break
}
return nil
}
func setupAndInitializing() error {
if err := utils.MkdirAllWithLog(serverCfg.StoreDir.Path); err != nil {
return err
}
return nil
}