33 lines
1006 B
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
|
|
}
|