From be85a5b64245dd8c492abe2015518c2003fb5da2 Mon Sep 17 00:00:00 2001 From: tobi Date: Wed, 5 Mar 2025 17:07:56 +0100 Subject: [PATCH] remove tryUntil --- .../action/admin/account/account.go | 4 ++- cmd/gotosocial/action/admin/media/list.go | 4 ++- .../action/admin/media/prune/common.go | 4 ++- cmd/gotosocial/action/server/server.go | 13 +++++----- internal/api/client/lists/lists_test.go | 4 ++- internal/cache/cache.go | 26 ++++++++----------- internal/cache/util.go | 18 ------------- 7 files changed, 30 insertions(+), 43 deletions(-) diff --git a/cmd/gotosocial/action/admin/account/account.go b/cmd/gotosocial/action/admin/account/account.go index 7dfb6b1d4..aa241177d 100644 --- a/cmd/gotosocial/action/admin/account/account.go +++ b/cmd/gotosocial/action/admin/account/account.go @@ -38,7 +38,9 @@ import ( func initState(ctx context.Context) (*state.State, error) { var state state.State state.Caches.Init() - state.Caches.Start() + if err := state.Caches.Start(); err != nil { + return nil, fmt.Errorf("error starting caches: %w", err) + } // Only set state DB connection. // Don't need Actions or Workers for this (yet). diff --git a/cmd/gotosocial/action/admin/media/list.go b/cmd/gotosocial/action/admin/media/list.go index a017539ed..e80c0da51 100644 --- a/cmd/gotosocial/action/admin/media/list.go +++ b/cmd/gotosocial/action/admin/media/list.go @@ -125,7 +125,9 @@ func setupList(ctx context.Context) (*list, error) { } state.Caches.Init() - state.Caches.Start() + if err := state.Caches.Start(); err != nil { + return nil, fmt.Errorf("error starting caches: %w", err) + } // Only set state DB connection. // Don't need Actions or Workers for this. diff --git a/cmd/gotosocial/action/admin/media/prune/common.go b/cmd/gotosocial/action/admin/media/prune/common.go index d73676f5b..fce445fb0 100644 --- a/cmd/gotosocial/action/admin/media/prune/common.go +++ b/cmd/gotosocial/action/admin/media/prune/common.go @@ -42,7 +42,9 @@ func setupPrune(ctx context.Context) (*prune, error) { var state state.State state.Caches.Init() - state.Caches.Start() + if err := state.Caches.Start(); err != nil { + return nil, fmt.Errorf("error starting caches: %w", err) + } // Scheduler is required for the // cleaner, but no other workers diff --git a/cmd/gotosocial/action/server/server.go b/cmd/gotosocial/action/server/server.go index ad6e89a8b..8c4fad247 100644 --- a/cmd/gotosocial/action/server/server.go +++ b/cmd/gotosocial/action/server/server.go @@ -118,11 +118,10 @@ var Start action.GTSAction = func(ctx context.Context) error { ) defer func() { - if state.Caches.Inited() { - // We reached a point where caches - // were initialized. Stop them. - state.Caches.Stop() - } + // Stop any started caches. + // + // Noop if never started. + state.Caches.Stop() if route != nil { // We reached a point where the API router @@ -207,7 +206,9 @@ var Start action.GTSAction = func(ctx context.Context) error { // Initialize caches state.Caches.Init() - state.Caches.Start() + if err := state.Caches.Start(); err != nil { + return fmt.Errorf("error starting caches: %w", err) + } // Open connection to the database now caches started. dbService, err := bundb.NewBunDBService(ctx, state) diff --git a/internal/api/client/lists/lists_test.go b/internal/api/client/lists/lists_test.go index 65242db25..a4afa24bb 100644 --- a/internal/api/client/lists/lists_test.go +++ b/internal/api/client/lists/lists_test.go @@ -76,7 +76,9 @@ func (suite *ListsStandardTestSuite) SetupSuite() { func (suite *ListsStandardTestSuite) SetupTest() { suite.state.Caches.Init() - suite.state.Caches.Start() + if err := suite.state.Caches.Start(); err != nil { + panic("error starting caches: " + err.Error()) + } testrig.StartNoopWorkers(&suite.state) testrig.InitTestConfig() diff --git a/internal/cache/cache.go b/internal/cache/cache.go index 736394ad0..88e4f870a 100644 --- a/internal/cache/cache.go +++ b/internal/cache/cache.go @@ -23,6 +23,7 @@ import ( "codeberg.org/gruf/go-cache/v3/ttl" "github.com/superseriousbusiness/gotosocial/internal/cache/headerfilter" "github.com/superseriousbusiness/gotosocial/internal/config" + "github.com/superseriousbusiness/gotosocial/internal/gtserror" "github.com/superseriousbusiness/gotosocial/internal/log" ) @@ -124,23 +125,18 @@ func (c *Caches) Init() { // Start will start any caches that require a background // routine, which usually means any kind of TTL caches. -func (c *Caches) Start() { +func (c *Caches) Start() error { log.Infof(nil, "start: %p", c) - tryUntil("starting webfinger cache", 5, func() bool { - return c.Webfinger.Start(5 * time.Minute) - }) + if !c.Webfinger.Start(5 * time.Minute) { + return gtserror.New("could not start webfinger cache") + } - tryUntil("starting statusesFilterableFields cache", 5, func() bool { - return c.StatusesFilterableFields.Start(5 * time.Minute) - }) -} + if !c.StatusesFilterableFields.Start(5 * time.Minute) { + return gtserror.New("could not start statusesFilterableFields cache") + } -// Inited returns true if the -// caches have been initialized. -func (c *Caches) Inited() bool { - // Use nilness of *ttl.Cache pointers as heuristic. - return c.Webfinger != nil && c.StatusesFilterableFields != nil + return nil } // Stop will stop any caches that require a background @@ -148,8 +144,8 @@ func (c *Caches) Inited() bool { func (c *Caches) Stop() { log.Infof(nil, "stop: %p", c) - tryUntil("stopping webfinger cache", 5, c.Webfinger.Stop) - tryUntil("stopping statusesFilterableFields cache", 5, c.StatusesFilterableFields.Stop) + _ = c.Webfinger.Stop() + _ = c.StatusesFilterableFields.Stop() } // Sweep will sweep all the available caches to ensure none diff --git a/internal/cache/util.go b/internal/cache/util.go index fde2f9ada..ceb053e34 100644 --- a/internal/cache/util.go +++ b/internal/cache/util.go @@ -19,11 +19,9 @@ package cache import ( "errors" - "time" errorsv2 "codeberg.org/gruf/go-errors/v2" "github.com/superseriousbusiness/gotosocial/internal/db" - "github.com/superseriousbusiness/gotosocial/internal/log" ) // SentinelError is an error that can be returned and checked against to indicate a non-permanent @@ -51,19 +49,3 @@ type nocopy struct{} func (*nocopy) Lock() {} func (*nocopy) Unlock() {} - -// tryUntil will attempt to call 'do' for 'count' attempts, before panicking with 'msg'. -func tryUntil(msg string, count int, do func() bool) { - for i := 0; i < count; i++ { - if do() { - // success. - return - } - - // Sleep for a little before retry (a bcakoff). - time.Sleep(time.Millisecond * 1 << (i + 1)) - } - - // panic on total failure as this shouldn't happen. - log.Panicf(nil, "failed %s after %d tries", msg, count) -}