storj/satellite/accounting/projectbwcleanup/chore.go
Michal Niewrzal 0b519fbd05 satellite/satellitedb: create index for interval_day for project_bandwidth_daily_rollup
To improve deletion of old entries in project_bandwidth_daily_rollup
we need index on `interval_day` column which is used to find those old
entries.

As an addition we are changing interval how often deletion is executed
from 7 to 1 day. We would like to have smaller portion of data to
delete.

Fixes https://github.com/storj/storj/issues/5465

Change-Id: Ie18ebe859887b93d6e4e6065a61fb9214c7ad27a
2023-02-03 10:02:58 +00:00

80 lines
2.0 KiB
Go

// Copyright (C) 2020 Storj Labs, Inc.
// See LICENSE for copying information.
package projectbwcleanup
import (
"context"
"time"
"github.com/spacemonkeygo/monkit/v3"
"github.com/zeebo/errs"
"go.uber.org/zap"
"storj.io/common/sync2"
"storj.io/storj/satellite/accounting"
)
var mon = monkit.Package()
// Config is a configuration struct for the Chore.
type Config struct {
Interval time.Duration `help:"how often to remove unused project bandwidth rollups" default:"24h" testDefault:"$TESTINTERVAL"`
RetainMonths int `help:"number of months of project bandwidth rollups to retain, not including the current month" default:"2"`
}
// Chore to remove unused project bandwidth rollups.
//
// architecture: Chore
type Chore struct {
log *zap.Logger
db accounting.ProjectAccounting
config Config
Loop *sync2.Cycle
}
// NewChore creates new chore for removing unused project bandwidth rollups.
func NewChore(log *zap.Logger, db accounting.ProjectAccounting, config Config) *Chore {
return &Chore{
log: log,
db: db,
config: config,
Loop: sync2.NewCycle(config.Interval),
}
}
// Run starts the chore.
func (chore *Chore) Run(ctx context.Context) (err error) {
defer mon.Task()(&ctx)(&err)
return chore.Loop.Run(ctx, func(ctx context.Context) error {
err := chore.RunOnce(ctx)
if err != nil {
chore.log.Error("error removing project bandwidth rollups", zap.Error(err))
}
return nil
})
}
// RunOnce removes unused project bandwidth rollups.
func (chore *Chore) RunOnce(ctx context.Context) (err error) {
defer mon.Task()(&ctx)(&err)
if chore.config.RetainMonths < 0 {
return errs.New("retain months cannot be less than 0")
}
now := time.Now().UTC()
beforeMonth := time.Date(now.Year(), now.Month()-time.Month(chore.config.RetainMonths), 1, 0, 0, 0, 0, time.UTC)
return chore.db.DeleteProjectBandwidthBefore(ctx, beforeMonth)
}
// Close stops the chore.
func (chore *Chore) Close() error {
chore.Loop.Close()
return nil
}