storj/satellite/metainfo/expireddeletion/chore.go
Michał Niewrzał 65957c7525 satellite/metainfo/expireddeletion: temporarily log errors instead failing whole system
At the moment we are trying to optimize deletion queries but its hard to verify deletion performance. Until we are sure that the queries are good we will just log errors instead shutting down whole satellite core.

Change-Id: I5625251d4518c35f0d46d6bf37b2f3ea7950675e
2021-03-15 16:00:20 +01:00

89 lines
2.2 KiB
Go

// Copyright (C) 2020 Storj Labs, Inc.
// See LICENSE for copying information.
package expireddeletion
import (
"context"
"time"
"github.com/spacemonkeygo/monkit/v3"
"github.com/zeebo/errs"
"go.uber.org/zap"
"storj.io/common/sync2"
"storj.io/storj/satellite/metainfo"
)
var (
// Error defines the expireddeletion chore errors class.
Error = errs.Class("expireddeletion chore error")
mon = monkit.Package()
)
// Config contains configurable values for expired segment cleanup.
type Config struct {
Interval time.Duration `help:"the time between each attempt to go through the db and clean up expired segments" releaseDefault:"120h" devDefault:"10s"`
Enabled bool `help:"set if expired segment cleanup is enabled or not" releaseDefault:"true" devDefault:"true"`
}
// Chore implements the expired segment cleanup chore.
//
// architecture: Chore
type Chore struct {
log *zap.Logger
config Config
metabase metainfo.MetabaseDB
nowFn func() time.Time
Loop *sync2.Cycle
}
// NewChore creates a new instance of the expireddeletion chore.
func NewChore(log *zap.Logger, config Config, metabase metainfo.MetabaseDB) *Chore {
return &Chore{
log: log,
config: config,
metabase: metabase,
nowFn: time.Now,
Loop: sync2.NewCycle(config.Interval),
}
}
// Run starts the expireddeletion loop service.
func (chore *Chore) Run(ctx context.Context) (err error) {
defer mon.Task()(&ctx)(&err)
if !chore.config.Enabled {
return nil
}
return chore.Loop.Run(ctx, chore.deleteExpiredObjects)
}
// Close stops the expireddeletion chore.
func (chore *Chore) Close() error {
chore.Loop.Close()
return nil
}
// SetNow allows tests to have the server act as if the current time is whatever they want.
func (chore *Chore) SetNow(nowFn func() time.Time) {
chore.nowFn = nowFn
}
func (chore *Chore) deleteExpiredObjects(ctx context.Context) (err error) {
defer mon.Task()(&ctx)(&err)
chore.log.Debug("deleting expired objects")
// TODO log error instead of crashing core until we will be sure
// that queries for deleting expired objects are stable
err = chore.metabase.DeleteExpiredObjects(ctx, chore.nowFn())
if err != nil {
chore.log.Error("deleting expired objects failed", zap.Error(err))
}
return nil
}