72 lines
1.5 KiB
Go
72 lines
1.5 KiB
Go
|
// Copyright (C) 2022 Storj Labs, Inc.
|
||
|
// See LICENSE for copying information.
|
||
|
|
||
|
package rangedloop
|
||
|
|
||
|
import (
|
||
|
"context"
|
||
|
|
||
|
"github.com/spacemonkeygo/monkit/v3"
|
||
|
"github.com/zeebo/errs"
|
||
|
"go.uber.org/zap"
|
||
|
|
||
|
"storj.io/common/errs2"
|
||
|
"storj.io/storj/satellite/metabase/segmentloop"
|
||
|
)
|
||
|
|
||
|
var (
|
||
|
mon = monkit.Package()
|
||
|
)
|
||
|
|
||
|
// Config contains configurable values for the shared loop.
|
||
|
type Config struct{}
|
||
|
|
||
|
// Service iterates through all segments and calls the attached observers for every segment
|
||
|
//
|
||
|
// architecture: Service
|
||
|
type Service struct {
|
||
|
log *zap.Logger
|
||
|
config Config
|
||
|
metabaseDB segmentloop.MetabaseDB
|
||
|
observers []Observer
|
||
|
}
|
||
|
|
||
|
// NewService creates a new instance of the ranged loop service.
|
||
|
func NewService(log *zap.Logger, config Config, metabaseDB segmentloop.MetabaseDB, observers []Observer) *Service {
|
||
|
return &Service{
|
||
|
log: log,
|
||
|
config: config,
|
||
|
metabaseDB: metabaseDB,
|
||
|
observers: observers,
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// Run starts the looping service.
|
||
|
func (service *Service) Run(ctx context.Context) (err error) {
|
||
|
defer mon.Task()(&ctx)(&err)
|
||
|
|
||
|
for {
|
||
|
if err := service.RunOnce(ctx); err != nil {
|
||
|
service.log.Error("ranged loop failure", zap.Error(err))
|
||
|
|
||
|
if errs2.IsCanceled(err) {
|
||
|
return err
|
||
|
}
|
||
|
if ctx.Err() != nil {
|
||
|
return errs.Combine(err, ctx.Err())
|
||
|
}
|
||
|
|
||
|
mon.Event("rangedloop_error") //mon:locked
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// RunOnce goes through one time and sends information to observers.
|
||
|
func (service *Service) RunOnce(ctx context.Context) (err error) {
|
||
|
defer mon.Task()(&ctx)(&err)
|
||
|
|
||
|
// TODO
|
||
|
|
||
|
return nil
|
||
|
}
|