diff options
Diffstat (limited to 'internal/cache/util.go')
-rw-r--r-- | internal/cache/util.go | 45 |
1 files changed, 44 insertions, 1 deletions
diff --git a/internal/cache/util.go b/internal/cache/util.go index 066e477e9..1ffd72876 100644 --- a/internal/cache/util.go +++ b/internal/cache/util.go @@ -17,7 +17,30 @@ package cache -import "github.com/superseriousbusiness/gotosocial/internal/log" +import ( + "context" + "errors" + "fmt" + "time" + + "codeberg.org/gruf/go-cache/v3/result" + errorsv2 "codeberg.org/gruf/go-errors/v2" + "github.com/superseriousbusiness/gotosocial/internal/log" +) + +// SentinelError is returned to indicate a non-permanent error return, +// i.e. a situation in which we do not want a cache a negative result. +var SentinelError = errors.New("BUG: error should not be returned") //nolint:revive + +// ignoreErrors is an error ignoring function capable of being passed to +// caches, which specifically catches and ignores our sentinel error type. +func ignoreErrors(err error) bool { + return errorsv2.Is( + SentinelError, + context.DeadlineExceeded, + context.Canceled, + ) +} // nocopy when embedded will signal linter to // error on pass-by-value of parent struct. @@ -27,6 +50,26 @@ func (*nocopy) Lock() {} func (*nocopy) Unlock() {} +// tryStart will attempt to start the given cache only if sweep duration > 0 (sweeping is enabled). +func tryStart[ValueType any](cache *result.Cache[ValueType], sweep time.Duration) { + if sweep > 0 { + var z ValueType + msg := fmt.Sprintf("starting %T cache", z) + tryUntil(msg, 5, func() bool { + return cache.Start(sweep) + }) + } +} + +// tryStop will attempt to stop the given cache only if sweep duration > 0 (sweeping is enabled). +func tryStop[ValueType any](cache *result.Cache[ValueType], sweep time.Duration) { + if sweep > 0 { + var z ValueType + msg := fmt.Sprintf("stopping %T cache", z) + tryUntil(msg, 5, cache.Stop) + } +} + // 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++ { |