-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmain.go
85 lines (64 loc) · 1.5 KB
/
main.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
package main
import (
"os"
"os/signal"
"runtime/pprof"
"syscall"
"time"
"github.com/rack-app/server/clusters"
"github.com/rack-app/server/debug"
"github.com/rack-app/server/workers"
)
func main() {
sigs := make(chan os.Signal)
defer func() { close(sigs) }()
signal.Notify(sigs)
c := BuildCluster()
server := NewServer(c)
OkOrPanic(c.Start)
go StartServer(server)
defer PPROF()()
HandleSignals(sigs, c, server)
}
func BuildCluster() *clusters.Cluster {
workerClusterSize := WorkerClusterSize()
workerThreadCount := WorkerThreadCount()
debug.Printf("W: %v; T: %v\n", workerClusterSize, workerThreadCount)
ws := make([]*workers.Worker, 0, workerClusterSize)
for i := 0; i < workerClusterSize; i++ {
ws = append(ws, workers.New(GetPort(), os.Stdout, os.Stderr))
}
return clusters.New(ws, workerThreadCount)
}
func HandleSignals(sigs chan os.Signal, c *clusters.Cluster, server Server) {
receiveSignals:
for sig := range sigs {
errs := c.Signal(sig)
if len(errs) > 0 {
panic(errs)
}
switch sig.String() {
case syscall.SIGINT.String():
ShutdownServer(server, 30*time.Second)
OkOrPanic(c.Close)
break receiveSignals
case syscall.SIGTERM.String():
ShutdownServer(server, 5*time.Second)
OkOrPanic(c.Close)
break receiveSignals
}
}
}
func PPROF() func() {
if _, do := os.LookupEnv("PPROF"); !do {
return func() {}
}
f, err := os.Create("./cpu.prof")
if err != nil {
panic(err)
}
pprof.StartCPUProfile(f)
return func() {
pprof.StopCPUProfile()
}
}