task-processor/internal/appState/state.go

100 lines
2.3 KiB
Go
Raw Normal View History

2025-10-02 20:35:53 +03:00
package appState
import (
pb "parsing-service/proto/taskProcessor"
"sync/atomic"
"time"
)
type State struct {
appStart int64
lastCheck atomic.Int64
tasksReceived atomic.Int32
tasksInProgress atomic.Int32
tasksFirstTry atomic.Int32
tasksDoneAfterRetry atomic.Int32
tasksFailed atomic.Int32
workStatus atomic.Int32
numCPUs int32
checkPeriod int32
RetriesCount int
retriesMinutes int32
}
func NewState(numCPUs, checkPeriod, retriesCount, retriesMinutes int) *State {
now := time.Now().Unix()
state := &State{
appStart: now,
numCPUs: int32(numCPUs),
checkPeriod: int32(checkPeriod),
RetriesCount: retriesCount,
retriesMinutes: int32(retriesMinutes),
}
state.lastCheck.Store(now)
return state
}
func (s *State) ResetCounters() {
s.tasksReceived.Store(0)
s.tasksInProgress.Store(0)
s.tasksFirstTry.Store(0)
s.tasksDoneAfterRetry.Store(0)
s.tasksFailed.Store(0)
}
func (s *State) SetStatus(status Status) {
s.workStatus.Store(int32(status))
}
func (s *State) SetLastCheck() {
s.lastCheck.Store(time.Now().Unix())
}
func (s *State) SetTasksReceived(num int) {
s.tasksReceived.Swap(int32(num))
s.tasksInProgress.Swap(int32(num))
}
func (s *State) TaskDone() {
s.tasksInProgress.Add(-1)
}
func (s *State) FirstTry() {
s.tasksFirstTry.Add(1)
}
func (s *State) DoneAfterRetry() {
s.tasksDoneAfterRetry.Add(1)
}
func (s *State) Failed() {
s.tasksFailed.Add(1)
}
func (s *State) InProgress() bool {
return s.tasksInProgress.Load() > 0
}
func (s *State) SetIdleStatus() {
s.workStatus.Store(int32(StatusIdle))
}
func (s *State) StateResponse() *pb.ProcessorStatusResponse {
return &pb.ProcessorStatusResponse{
AppStart: s.appStart,
LastCheck: s.lastCheck.Load(),
TasksReceived: s.tasksReceived.Load(),
TasksInProgress: s.tasksInProgress.Load(),
TasksFirstTry: s.tasksFirstTry.Load(),
TasksDoneAfterRetry: s.tasksDoneAfterRetry.Load(),
TasksFailed: s.tasksFailed.Load(),
WorkStatus: Status(s.workStatus.Load()).String(),
NumCPUs: s.numCPUs,
CheckPeriod: s.checkPeriod,
RetriesCount: int32(s.RetriesCount),
RetriesMinutes: s.retriesMinutes,
}
}