328004c0ef
We were seeing error on the last day of the month with TestProjectAllocatedBandwidthRetainTwo. This is due to AddDate normalizes its result in the same way that Date does, so, for example, adding one month to October 31 yields December 1, the normalized form for November 31." I also fixed a minor UTC issue with this test as well. Change-Id: I0157873e7befa57810e5f264a922b188890fa46a
80 lines
1.9 KiB
Go
80 lines
1.9 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:"168h"`
|
|
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.DeleteProjectAllocatedBandwidthBefore(ctx, beforeMonth)
|
|
}
|
|
|
|
// Close stops the chore.
|
|
func (chore *Chore) Close() error {
|
|
chore.Loop.Close()
|
|
return nil
|
|
}
|