diff options
author | 2024-05-29 11:21:04 +0000 | |
---|---|---|
committer | 2024-05-29 13:21:04 +0200 | |
commit | 32e570abfd72ff8fdb44088f136b956a37f569b2 (patch) | |
tree | 44a361c9528d7538ad5de613db9ff7d97909c613 /internal | |
parent | [feature] Implement profile API (#2926) (diff) | |
download | gotosocial-32e570abfd72ff8fdb44088f136b956a37f569b2.tar.xz |
[chore] improved startup / shutdown (#2925)
* improved server shutdown with more precise shutdown of modules + deferring of ALL of it
* make the same changes to the testrig server
* use testrig specific func
* update variable name to fix nilptr
* fix removal of setting db on state
Diffstat (limited to 'internal')
-rw-r--r-- | internal/gotosocial/gotosocial.go | 66 | ||||
-rw-r--r-- | internal/router/router.go | 20 |
2 files changed, 12 insertions, 74 deletions
diff --git a/internal/gotosocial/gotosocial.go b/internal/gotosocial/gotosocial.go deleted file mode 100644 index e6a3934be..000000000 --- a/internal/gotosocial/gotosocial.go +++ /dev/null @@ -1,66 +0,0 @@ -// GoToSocial -// Copyright (C) GoToSocial Authors admin@gotosocial.org -// SPDX-License-Identifier: AGPL-3.0-or-later -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU Affero General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Affero General Public License for more details. -// -// You should have received a copy of the GNU Affero General Public License -// along with this program. If not, see <http://www.gnu.org/licenses/>. - -package gotosocial - -import ( - "context" - - "github.com/superseriousbusiness/gotosocial/internal/cleaner" - "github.com/superseriousbusiness/gotosocial/internal/db" - "github.com/superseriousbusiness/gotosocial/internal/router" -) - -// Server represents a long-running -// GoToSocial server instance. -type Server struct { - db db.DB - apiRouter *router.Router - cleaner *cleaner.Cleaner -} - -// NewServer returns a new -// GoToSocial server instance. -func NewServer( - db db.DB, - apiRouter *router.Router, - cleaner *cleaner.Cleaner, -) *Server { - return &Server{ - db: db, - apiRouter: apiRouter, - cleaner: cleaner, - } -} - -// Start starts up the GoToSocial server by starting the router, -// then the cleaner. If something goes wrong while starting the -// server, then an error will be returned. -func (s *Server) Start(ctx context.Context) error { - s.apiRouter.Start() - return s.cleaner.ScheduleJobs() -} - -// Stop closes down the GoToSocial server, first closing the cleaner, -// then the router, then the database. If something goes wrong while -// stopping, an error will be returned. -func (s *Server) Stop(ctx context.Context) error { - if err := s.apiRouter.Stop(ctx); err != nil { - return err - } - return s.db.Close() -} diff --git a/internal/router/router.go b/internal/router/router.go index b2fb7418e..3a790dec9 100644 --- a/internal/router/router.go +++ b/internal/router/router.go @@ -122,7 +122,7 @@ func New(ctx context.Context) (*Router, error) { // // It will serve two handlers if letsencrypt is enabled, // and only the web/API handler if letsencrypt is not enabled. -func (r *Router) Start() { +func (r *Router) Start() error { var ( // listen is the server start function. // By default this points to a regular @@ -143,10 +143,16 @@ func (r *Router) Start() { // that either both or neither of Chain and Key // are set, so we can forego checking again here. listen, err = r.customTLS(certFile, keyFile) + if err != nil { + return err + } // TLS with letsencrypt. case leEnabled: listen, err = r.letsEncryptTLS() + if err != nil { + return err + } // Default listen. TLS must // be handled by reverse proxy. @@ -154,10 +160,6 @@ func (r *Router) Start() { listen = r.srv.ListenAndServe } - if err != nil { - log.Fatal(nil, err) - } - // Pass the server handler through a debug pprof middleware handler. // For standard production builds this will be a no-op, but when the // "debug" or "debugenv" build-tag is set pprof stats will be served @@ -177,12 +179,14 @@ func (r *Router) Start() { log.Fatalf(nil, "listen: %s", err) } }() + + return nil } -// Stop shuts down the router nicely -func (r *Router) Stop(ctx context.Context) error { +// Stop shuts down the router nicely. +func (r *Router) Stop() error { log.Infof(nil, "shutting down http router with %s grace period", shutdownTimeout) - timeout, cancel := context.WithTimeout(ctx, shutdownTimeout) + timeout, cancel := context.WithTimeout(context.Background(), shutdownTimeout) defer cancel() if err := r.srv.Shutdown(timeout); err != nil { |