frostfs-node/pkg/services/audit/taskmanager/listen.go
Evgenii Stratonikov 0e31c12e63 [#240] logs: Move log messages to constants
Drop duplicate entities.
Format entities.

Signed-off-by: Dmitrii Stepanov <d.stepanov@yadro.com>
Signed-off-by: Evgenii Stratonikov <e.stratonikov@yadro.com>
2023-04-14 05:06:09 +00:00

85 lines
2 KiB
Go

package audittask
import (
"context"
"git.frostfs.info/TrueCloudLab/frostfs-node/internal/logs"
"git.frostfs.info/TrueCloudLab/frostfs-node/pkg/services/audit"
"git.frostfs.info/TrueCloudLab/frostfs-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(logs.TaskmanagerProcessRoutine,
zap.Uint32("queue_capacity", m.queueCap),
)
m.ch = make(chan *audit.Task, m.queueCap)
for {
select {
case <-ctx.Done():
m.log.Warn(logs.TaskmanagerStopListenerByContext,
zap.String("error", ctx.Err().Error()),
)
m.workerPool.Release()
return
case task, ok := <-m.ch:
if !ok {
m.log.Warn(logs.TaskmanagerQueueChannelIsClosed)
return
}
tCtx, tCancel := context.WithCancel(ctx) // cancel task in case of listen cancel
go func() {
select {
case <-tCtx.Done(): // listen cancelled or task completed
return
case <-task.CancelChannel(): // new epoch
tCancel()
}
}()
m.handleTask(tCtx, task, tCancel)
}
}
}
func (m *Manager) handleTask(ctx context.Context, task *audit.Task, onCompleted func()) {
pdpPool, err := m.pdpPoolGenerator()
if err != nil {
m.log.Error(logs.TaskmanagerCouldNotGeneratePDPWorkerPool,
zap.String("error", err.Error()),
)
onCompleted()
return
}
porPool, err := m.pdpPoolGenerator()
if err != nil {
m.log.Error(logs.TaskmanagerCouldNotGeneratePoRWorkerPool,
zap.String("error", err.Error()),
)
onCompleted()
return
}
auditContext := m.generateContext(task).
WithPDPWorkerPool(pdpPool).
WithPoRWorkerPool(porPool)
if err := m.workerPool.Submit(func() { auditContext.Execute(ctx, onCompleted) }); err != nil {
// may be we should report it
m.log.Warn(logs.TaskmanagerCouldNotSubmitAuditTask)
onCompleted()
}
}
func (m *Manager) generateContext(task *audit.Task) *auditor.Context {
return auditor.NewContext(m.ctxPrm).
WithTask(task)
}