blob: d197666a0439a04e77974eccb413138256c1911e [file] [log] [blame]
iomododb170e12021-02-21 23:06:20 +04001package server
2
3import (
4 "os"
5
6 "github.com/giolekva/pcloud/core/kg/log"
7 "github.com/vardius/shutdown"
8)
9
10// Server interface
11type Server interface {
12 Start() error
13 Shutdown() error
14}
15
16// Servers represents different server services
17type Servers struct {
18 servers []Server
19 logger *log.Logger
20}
21
22// New provides new service application
23func New(logger *log.Logger) *Servers {
24 return &Servers{
25 logger: logger,
26 }
27}
28
29// AddServers adds servers to service
30func (ss *Servers) AddServers(servers ...Server) {
31 ss.servers = append(ss.servers, servers...)
32}
33
34// Run runs the service application
35func (ss *Servers) Run() {
36 for _, server := range ss.servers {
37 go func(server Server) {
38 if err := server.Start(); err != nil {
39 ss.logger.Error("can't start server", log.Err(err))
40 os.Exit(1)
41 }
42 }(server)
43 }
44 shutdown.GracefulStop(func() { ss.shutdown() })
45}
46
47func (ss *Servers) shutdown() {
48 ss.logger.Info("shutting down...")
49
50 errCh := make(chan error, len(ss.servers))
51
52 for _, server := range ss.servers {
53 go func(server Server) {
54 errCh <- server.Shutdown()
55 }(server)
56 }
57
58 for i := 0; i < len(ss.servers); i++ {
59 if err := <-errCh; err != nil {
60 go func(err error) {
61 ss.logger.Error("shutdown error", log.Err(err))
62 os.Exit(1)
63 }(err)
64 return
65 }
66 }
67
68 ss.logger.Info("gracefully stopped")
69}