storj/satellite/metainfo/expireddeletion/chore.go

78 lines
1.9 KiB
Go
Raw Normal View History

// 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:"10m"`
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
Loop *sync2.Cycle
metainfo *metainfo.Service
metainfoLoop *metainfo.Loop
}
// NewChore creates a new instance of the expireddeletion chore
func NewChore(log *zap.Logger, config Config, meta *metainfo.Service, loop *metainfo.Loop) *Chore {
return &Chore{
log: log,
config: config,
Loop: sync2.NewCycle(config.Interval),
metainfo: meta,
metainfoLoop: loop,
}
}
// 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, func(ctx context.Context) (err error) {
defer mon.Task()(&ctx)(&err)
deleter := &expiredDeleter{
log: chore.log.Named("expired deleter observer"),
metainfo: chore.metainfo,
}
// delete expired segments
err = chore.metainfoLoop.Join(ctx, deleter)
if err != nil {
chore.log.Error("error joining metainfoloop", zap.Error(err))
return nil
}
return nil
})
}