From 42d0c67cb3d7dde750217ab1bb61609900211217 Mon Sep 17 00:00:00 2001 From: Dmitry Verkhoturov Date: Sun, 14 Jun 2020 01:57:43 +0200 Subject: [PATCH] add context to server errors, properly close datastore in case of errors --- backend/app/cmd/avatar.go | 4 ++-- backend/app/cmd/server.go | 15 ++++++++++----- backend/app/cmd/server_test.go | 2 +- 3 files changed, 13 insertions(+), 8 deletions(-) diff --git a/backend/app/cmd/avatar.go b/backend/app/cmd/avatar.go index f4bf0660..f6f14b1c 100644 --- a/backend/app/cmd/avatar.go +++ b/backend/app/cmd/avatar.go @@ -72,12 +72,12 @@ func (ac *AvatarCommand) makeAvatarStore(gr AvatarGroup) (avatar.Store, error) { switch gr.Type { case "fs": if err := makeDirs(gr.FS.Path); err != nil { - return nil, err + return nil, errors.Wrap(err, "failed to create avatar store") } return avatar.NewLocalFS(gr.FS.Path), nil case "bolt": if err := makeDirs(path.Dir(gr.Bolt.File)); err != nil { - return nil, err + return nil, errors.Wrap(err, "failed to create avatar store") } return avatar.NewBoltDB(gr.Bolt.File, bolt.Options{}) } diff --git a/backend/app/cmd/server.go b/backend/app/cmd/server.go index 961f2fe9..b03b7612 100644 --- a/backend/app/cmd/server.go +++ b/backend/app/cmd/server.go @@ -322,7 +322,7 @@ func (s *ServerCommand) HandleDeprecatedFlags() (result []DeprecatedFlag) { func (s *ServerCommand) newServerApp() (*serverApp, error) { if err := makeDirs(s.BackupLocation); err != nil { - return nil, err + return nil, errors.Wrap(err, "failed to create backup store") } if !strings.HasPrefix(s.RemarkURL, "http://") && !strings.HasPrefix(s.RemarkURL, "https://") { @@ -362,16 +362,19 @@ func (s *ServerCommand) newServerApp() (*serverApp, error) { loadingCache, err := s.makeCache() if err != nil { + _ = dataService.Close() return nil, errors.Wrap(err, "failed to make cache") } avatarStore, err := s.makeAvatarStore() if err != nil { + _ = dataService.Close() return nil, errors.Wrap(err, "failed to make avatar store") } authRefreshCache := newAuthRefreshCache() authenticator, err := s.makeAuthenticator(dataService, avatarStore, adminStore, authRefreshCache) if err != nil { + _ = dataService.Close() return nil, errors.Wrap(err, "failed to make authenticator") } @@ -418,6 +421,7 @@ func (s *ServerCommand) newServerApp() (*serverApp, error) { sslConfig, err := s.makeSSLConfig() if err != nil { + _ = dataService.Close() return nil, errors.Wrap(err, "failed to make config of ssl server params") } @@ -459,13 +463,14 @@ func (s *ServerCommand) newServerApp() (*serverApp, error) { if s.Auth.Dev { da, errDevAuth := authenticator.DevAuth() if errDevAuth != nil { + _ = dataService.Close() return nil, errors.Wrap(errDevAuth, "can't make dev oauth2 server") } devAuth = da } return &serverApp{ - ServerCommand: s, + ServerCommand: s, restSrv: srv, migratorSrv: migr, exporter: exporter, @@ -586,12 +591,12 @@ func (s *ServerCommand) makeAvatarStore() (avatar.Store, error) { switch s.Avatar.Type { case "fs": if err := makeDirs(s.Avatar.FS.Path); err != nil { - return nil, err + return nil, errors.Wrap(err, "failed to create avatar store") } return avatar.NewLocalFS(s.Avatar.FS.Path), nil case "bolt": if err := makeDirs(path.Dir(s.Avatar.Bolt.File)); err != nil { - return nil, err + return nil, errors.Wrap(err, "failed to create avatar store") } return avatar.NewBoltDB(s.Avatar.Bolt.File, bolt.Options{}) case "uri": @@ -618,7 +623,7 @@ func (s *ServerCommand) makePicturesStore() (*image.Service, error) { return image.NewService(boltImageStore, imageServiceParams), nil case "fs": if err := makeDirs(s.Image.FS.Path); err != nil { - return nil, err + return nil, errors.Wrap(err, "failed to create pictures store") } return image.NewService(&image.FileSystem{ Location: s.Image.FS.Path, diff --git a/backend/app/cmd/server_test.go b/backend/app/cmd/server_test.go index 47be4e96..c2efd275 100644 --- a/backend/app/cmd/server_test.go +++ b/backend/app/cmd/server_test.go @@ -306,7 +306,7 @@ func TestServerApp_Failed(t *testing.T) { _, err = p.ParseArgs([]string{"--store.bolt.path=/tmp", "--backup=/dev/null/not-writable"}) assert.NoError(t, err) _, err = opts.newServerApp() - assert.EqualError(t, err, "can't make directory /dev/null/not-writable: mkdir /dev/null: not a directory") + assert.EqualError(t, err, "failed to create backup store: can't make directory /dev/null/not-writable: mkdir /dev/null: not a directory") t.Log(err) // invalid url