Files
orbit/weave/model/poll_policy.go

33 lines
1006 B
Go

package model
import (
"errors"
"time"
)
var (
ErrPollExhausted = errors.New("poll budget exhausted; reconciliation required")
ErrPollInFlight = errors.New("a poll round is still in flight")
ErrPollResolved = errors.New("poll already resolved")
ErrPollNotDue = errors.New("poll interval has not elapsed")
)
// NextRound 用数据库时间检查已锁定的查询快照。调用方还必须核验执行门控,
// 并在同一事务中写入计数、唯一轮次及对应的 Pulse 任务。
// 下一查询时间为空表示持久化暂挂,不能视为允许立即发起查询。
func (p PollState) NextRound(now time.Time) (uint32, error) {
if p.ResolvedAt != nil {
return 0, ErrPollResolved
}
if p.MaxRounds == 0 || p.UsedRounds >= p.MaxRounds || !now.Before(p.DeadlineAt) {
return 0, ErrPollExhausted
}
if p.CurrentTaskID != nil {
return 0, ErrPollInFlight
}
if p.NextPollAt == nil || now.Before(*p.NextPollAt) {
return 0, ErrPollNotDue
}
return p.UsedRounds + 1, nil
}