blob: 7363a0e30efaf61b7e270aef42012b0cf9fe08ed [file] [log] [blame]
iomododb170e12021-02-21 23:06:20 +04001package server
2
3import (
4 "os"
iomodoc0479a62021-02-22 20:08:36 +04005 "os/signal"
6 "syscall"
iomododb170e12021-02-21 23:06:20 +04007
8 "github.com/giolekva/pcloud/core/kg/log"
iomododb170e12021-02-21 23:06:20 +04009)
10
11// Server interface
12type Server interface {
13 Start() error
14 Shutdown() error
15}
16
17// Servers represents different server services
18type Servers struct {
19 servers []Server
20 logger *log.Logger
21}
22
23// New provides new service application
24func New(logger *log.Logger) *Servers {
25 return &Servers{
26 logger: logger,
27 }
28}
29
30// AddServers adds servers to service
31func (ss *Servers) AddServers(servers ...Server) {
32 ss.servers = append(ss.servers, servers...)
33}
34
35// Run runs the service application
36func (ss *Servers) Run() {
37 for _, server := range ss.servers {
38 go func(server Server) {
39 if err := server.Start(); err != nil {
40 ss.logger.Error("can't start server", log.Err(err))
41 os.Exit(1)
42 }
43 }(server)
44 }
iomodoc0479a62021-02-22 20:08:36 +040045 // wait for kill signal before attempting to gracefully shutdown
46 // the running service
47 interruptChan := make(chan os.Signal, 1)
48 signal.Notify(interruptChan, os.Interrupt, syscall.SIGINT, syscall.SIGTERM)
49 <-interruptChan
50 ss.logger.Info("os.Interrupt...")
51 ss.shutdown()
iomododb170e12021-02-21 23:06:20 +040052}
53
54func (ss *Servers) shutdown() {
iomodoc0479a62021-02-22 20:08:36 +040055 ss.logger.Info("Shutting down...")
iomododb170e12021-02-21 23:06:20 +040056
57 errCh := make(chan error, len(ss.servers))
58
59 for _, server := range ss.servers {
60 go func(server Server) {
61 errCh <- server.Shutdown()
62 }(server)
63 }
64
65 for i := 0; i < len(ss.servers); i++ {
66 if err := <-errCh; err != nil {
67 go func(err error) {
iomodoc0479a62021-02-22 20:08:36 +040068 ss.logger.Error("Shutdown error", log.Err(err))
iomododb170e12021-02-21 23:06:20 +040069 os.Exit(1)
70 }(err)
71 return
72 }
73 }
74
iomodoc0479a62021-02-22 20:08:36 +040075 ss.logger.Info("Gracefully stopped")
iomododb170e12021-02-21 23:06:20 +040076}