server need .Stop() and .Destroy()

This commit is contained in:
Dan Ballard 2021-11-01 14:46:34 -07:00
parent c148e120f3
commit b15fcb2242
4 changed files with 47 additions and 28 deletions

View File

@ -90,12 +90,12 @@ func main() {
ioutil.WriteFile(path.Join(serverConfig.ConfigDir, "serverbundle"), []byte(server.TofuBundle()), 0600) ioutil.WriteFile(path.Join(serverConfig.ConfigDir, "serverbundle"), []byte(server.TofuBundle()), 0600)
} }
// Graceful Shutdown // Graceful Stop
c := make(chan os.Signal, 1) c := make(chan os.Signal, 1)
signal.Notify(c, os.Interrupt, syscall.SIGTERM) signal.Notify(c, os.Interrupt, syscall.SIGTERM)
go func() { go func() {
<-c <-c
server.Shutdown() server.Destroy()
acn.Close() acn.Close()
os.Exit(1) os.Exit(1)
}() }()

View File

@ -33,7 +33,8 @@ type Server interface {
Run(acn connectivity.ACN) error Run(acn connectivity.ACN) error
KeyBundle() *model.KeyBundle KeyBundle() *model.KeyBundle
CheckStatus() (bool, error) CheckStatus() (bool, error)
Shutdown() Stop()
Destroy()
GetStatistics() Statistics GetStatistics() Statistics
Delete(password string) error Delete(password string) error
Onion() string Onion() string
@ -65,6 +66,10 @@ func NewServer(serverConfig *Config) Server {
server.config = serverConfig server.config = serverConfig
server.tokenService = server.config.TokenServiceIdentity() server.tokenService = server.config.TokenServiceIdentity()
server.tokenServicePrivKey = server.config.TokenServerPrivateKey server.tokenServicePrivKey = server.config.TokenServerPrivateKey
bs := new(persistence.BoltPersistence)
bs.Open(path.Join(serverConfig.ConfigDir, "tokens.db"))
server.tokenServer = privacypass.NewTokenServerFromStore(&serverConfig.TokenServiceK, bs)
log.Infof("Y: %v", server.tokenServer.Y)
return server return server
} }
@ -81,11 +86,6 @@ func (s *server) Run(acn connectivity.ACN) error {
return nil return nil
} }
bs := new(persistence.BoltPersistence)
bs.Open(path.Join(s.config.ConfigDir, "tokens.db"))
s.tokenServer = privacypass.NewTokenServerFromStore(&s.config.TokenServiceK, bs)
log.Infof("Y: %v", s.tokenServer.Y)
identity := primitives.InitializeIdentity("", &s.config.PrivateKey, &s.config.PublicKey) identity := primitives.InitializeIdentity("", &s.config.PrivateKey, &s.config.PublicKey)
var service tapir.Service var service tapir.Service
service = new(tor2.BaseOnionService) service = new(tor2.BaseOnionService)
@ -145,8 +145,9 @@ func (s *server) CheckStatus() (bool, error) {
return s.running, nil return s.running, nil
} }
// Shutdown kills the app closing all connections and freeing all goroutines // Stop turns off the server so it cannot receive connections and frees most resourses.
func (s *server) Shutdown() { // The server is still in a reRunable state and tokenServer still has an active persistance
func (s *server) Stop() {
log.Infof("Shutting down server") log.Infof("Shutting down server")
s.lock.Lock() s.lock.Lock()
defer s.lock.Unlock() defer s.lock.Unlock()
@ -154,13 +155,21 @@ func (s *server) Shutdown() {
s.service.Shutdown() s.service.Shutdown()
s.tokenTapirService.Shutdown() s.tokenTapirService.Shutdown()
log.Infof("Closing Token server Database...") log.Infof("Closing Token server Database...")
s.tokenServer.Close()
s.metricsPack.Stop() s.metricsPack.Stop()
s.running = false s.running = false
s.SetAttribute(AttrEnabled, "false") s.SetAttribute(AttrEnabled, "false")
} }
} }
// Destroy frees the last of the resources the server has active (toklenServer persistance) leaving it un-re-runable and completely shutdown
func (s *server) Destroy() {
s.Stop()
s.lock.Lock()
defer s.lock.Unlock()
s.tokenServer.Close()
}
// Statistics is an encapsulation of information about the server that an operator might want to know at a glance. // Statistics is an encapsulation of information about the server that an operator might want to know at a glance.
type Statistics struct { type Statistics struct {
TotalMessages int TotalMessages int

View File

@ -24,8 +24,9 @@ type Servers interface {
DeleteServer(onion string, currentPassword string) error DeleteServer(onion string, currentPassword string) error
LaunchServer(string) LaunchServer(string)
ShutdownServer(string) StopServer(string)
Shutdown() Stop()
Destroy()
} }
type servers struct { type servers struct {
@ -105,7 +106,7 @@ func (s *servers) DeleteServer(onion string, password string) error {
defer s.lock.Unlock() defer s.lock.Unlock()
server := s.servers[onion] server := s.servers[onion]
if server != nil { if server != nil {
server.Shutdown() server.Destroy()
err := server.Delete(password) err := server.Delete(password)
delete(s.servers, onion) delete(s.servers, onion)
return err return err
@ -122,18 +123,27 @@ func (s *servers) LaunchServer(onion string) {
} }
} }
// ShutdownServer Shutsdown the specified server // StopServer stops the specified server
func (s *servers) ShutdownServer(onion string) { func (s *servers) StopServer(onion string) {
s.lock.Lock() s.lock.Lock()
defer s.lock.Unlock() defer s.lock.Unlock()
s.servers[onion].Shutdown() s.servers[onion].Stop()
} }
// Shutdown shutsdown all the servers // Stop stops all the servers
func (s *servers) Shutdown() { func (s *servers) Stop() {
s.lock.Lock() s.lock.Lock()
defer s.lock.Unlock() defer s.lock.Unlock()
for _, server := range s.servers { for _, server := range s.servers {
server.Shutdown() server.Stop()
}
}
// Destroy destroys all the servers
func (s *servers) Destroy() {
s.lock.Lock()
defer s.lock.Unlock()
for _, server := range s.servers {
server.Destroy()
} }
} }

View File

@ -14,12 +14,12 @@ const TestServerDesc = "a test Server"
func TestServers(t *testing.T) { func TestServers(t *testing.T) {
log.SetLevel(log.LevelDebug) log.SetLevel(log.LevelDebug)
log.Infof("clean up / setup...\n") log.Infof("clean up / setup...")
os.RemoveAll(TestDir) os.RemoveAll(TestDir)
os.Mkdir(TestDir, 0700) os.Mkdir(TestDir, 0700)
acn := connectivity.NewLocalACN() acn := connectivity.NewLocalACN()
log.Infof("NewServers()...\n") log.Infof("NewServers()...")
servers := NewServers(acn, TestDir) servers := NewServers(acn, TestDir)
s, err := servers.CreateServer(DefaultPassword) s, err := servers.CreateServer(DefaultPassword)
if err != nil { if err != nil {
@ -29,13 +29,13 @@ func TestServers(t *testing.T) {
s.SetAttribute(AttrDescription, TestServerDesc) s.SetAttribute(AttrDescription, TestServerDesc)
serverOnion := s.Onion() serverOnion := s.Onion()
s.Shutdown() s.Destroy()
log.Infof("NewServers()...\n" ) log.Infof("NewServers()...")
servers2 := NewServers(acn, TestDir) servers2 := NewServers(acn, TestDir)
log.Infof("LoadServers()...\n") log.Infof("LoadServers()...")
list, err := servers2.LoadServers(DefaultPassword) list, err := servers2.LoadServers(DefaultPassword)
log.Infof("Loaded!\n") log.Infof("Loaded!")
if err != nil { if err != nil {
t.Errorf("clould not load server: %s", err) t.Errorf("clould not load server: %s", err)
return return
@ -54,6 +54,6 @@ func TestServers(t *testing.T) {
t.Errorf("expected server description of '%s' but got '%s'", TestServerDesc, s1.GetAttribute(AttrDescription)) t.Errorf("expected server description of '%s' but got '%s'", TestServerDesc, s1.GetAttribute(AttrDescription))
} }
servers2.Shutdown() servers2.Destroy()
os.RemoveAll(TestDir) os.RemoveAll(TestDir)
} }