[#255] services/audit: Implement task manager
Signed-off-by: Leonard Lyubich <leonard@nspcc.ru>
This commit is contained in:
parent
0f0be2377b
commit
580c9c974a
3 changed files with 138 additions and 0 deletions
52
pkg/services/audit/taskmanager/listen.go
Normal file
52
pkg/services/audit/taskmanager/listen.go
Normal file
|
@ -0,0 +1,52 @@
|
|||
package audittask
|
||||
|
||||
import (
|
||||
"context"
|
||||
|
||||
"github.com/nspcc-dev/neofs-node/pkg/services/audit"
|
||||
"github.com/nspcc-dev/neofs-node/pkg/services/audit/auditor"
|
||||
"go.uber.org/zap"
|
||||
)
|
||||
|
||||
// Listen starts the process of processing tasks from the queue.
|
||||
//
|
||||
// The listener is terminated by context.
|
||||
func (m *Manager) Listen(ctx context.Context) {
|
||||
m.log.Info("process routine",
|
||||
zap.Uint32("queue capacity", m.queueCap),
|
||||
)
|
||||
|
||||
m.ch = make(chan *audit.Task, m.queueCap)
|
||||
|
||||
for {
|
||||
select {
|
||||
case <-ctx.Done():
|
||||
m.log.Warn("stop listener by context",
|
||||
zap.String("error", ctx.Err().Error()),
|
||||
)
|
||||
|
||||
return
|
||||
case task, ok := <-m.ch:
|
||||
if !ok {
|
||||
m.log.Warn("queue channel is closed")
|
||||
return
|
||||
}
|
||||
|
||||
m.handleTask(task)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func (m *Manager) handleTask(task *audit.Task) {
|
||||
if err := m.workerPool.Submit(func() {
|
||||
m.generateContext(task).Execute()
|
||||
}); err != nil {
|
||||
// may be we should report it
|
||||
m.log.Warn("could not submit audit task")
|
||||
}
|
||||
}
|
||||
|
||||
func (m *Manager) generateContext(task *audit.Task) *auditor.Context {
|
||||
return auditor.NewContext(m.ctxPrm).
|
||||
WithTask(task)
|
||||
}
|
73
pkg/services/audit/taskmanager/manager.go
Normal file
73
pkg/services/audit/taskmanager/manager.go
Normal file
|
@ -0,0 +1,73 @@
|
|||
package audittask
|
||||
|
||||
import (
|
||||
"github.com/nspcc-dev/neofs-node/pkg/services/audit"
|
||||
"github.com/nspcc-dev/neofs-node/pkg/services/audit/auditor"
|
||||
"github.com/nspcc-dev/neofs-node/pkg/util"
|
||||
"github.com/nspcc-dev/neofs-node/pkg/util/logger"
|
||||
"go.uber.org/zap"
|
||||
)
|
||||
|
||||
// Manager represents an entity performing data audit tasks.
|
||||
type Manager struct {
|
||||
*cfg
|
||||
|
||||
ch chan *audit.Task
|
||||
}
|
||||
|
||||
// Option is a Manager's constructor option.
|
||||
type Option func(*cfg)
|
||||
|
||||
type cfg struct {
|
||||
queueCap uint32
|
||||
|
||||
log *logger.Logger
|
||||
|
||||
ctxPrm auditor.ContextPrm
|
||||
|
||||
reporter audit.Reporter
|
||||
|
||||
workerPool util.WorkerPool
|
||||
}
|
||||
|
||||
func defaultCfg() *cfg {
|
||||
return &cfg{
|
||||
log: zap.L(),
|
||||
}
|
||||
}
|
||||
|
||||
// New creates, initializes and returns new Manager instance.
|
||||
func New(opts ...Option) *Manager {
|
||||
c := defaultCfg()
|
||||
|
||||
for i := range opts {
|
||||
opts[i](c)
|
||||
}
|
||||
|
||||
return &Manager{
|
||||
cfg: c,
|
||||
}
|
||||
}
|
||||
|
||||
// WithLogger returns option to specify Manager's logger.
|
||||
func WithLogger(l *logger.Logger) Option {
|
||||
return func(c *cfg) {
|
||||
c.log = l.With(zap.String("component", "Audit task manager"))
|
||||
c.ctxPrm.SetLogger(l)
|
||||
}
|
||||
}
|
||||
|
||||
// WithWorkerPool returns option to set worker pool
|
||||
// for task execution.
|
||||
func WithWorkerPool(p util.WorkerPool) Option {
|
||||
return func(c *cfg) {
|
||||
c.workerPool = p
|
||||
}
|
||||
}
|
||||
|
||||
// WithQueueCapacity returns option to set task queue capacity.
|
||||
func WithQueueCapacity(cap uint32) Option {
|
||||
return func(c *cfg) {
|
||||
c.queueCap = cap
|
||||
}
|
||||
}
|
13
pkg/services/audit/taskmanager/push.go
Normal file
13
pkg/services/audit/taskmanager/push.go
Normal file
|
@ -0,0 +1,13 @@
|
|||
package audittask
|
||||
|
||||
import (
|
||||
"github.com/nspcc-dev/neofs-node/pkg/services/audit"
|
||||
)
|
||||
|
||||
// PushTask adds a task to the queue for processing.
|
||||
//
|
||||
// Returns error if task was not added to the queue.
|
||||
func (m *Manager) PushTask(t *audit.Task) error {
|
||||
m.ch <- t
|
||||
return nil
|
||||
}
|
Loading…
Reference in a new issue