fix: gate scheduler task concurrency

This commit is contained in:
2026-09-20 20:53:58 +00:00
parent bca8096491
commit cbbe14d6b5
7 changed files with 111 additions and 3 deletions
+13
View File
@@ -26,6 +26,7 @@ type PollerConfig struct {
type Poller struct {
Client PollClient
Scheduler *Scheduler
Gate *SingleFlightGate
Config PollerConfig
OnError func(error)
}
@@ -50,7 +51,14 @@ func (p Poller) Run(ctx context.Context) error {
errorBackoff = 5 * time.Second
}
var tasksVersion int64
haveLease := false
for {
if p.Gate != nil && !haveLease {
if err := p.Gate.Acquire(ctx); err != nil {
return nil
}
haveLease = true
}
response, err := p.Client.FetchTask(ctx, tasksVersion)
if err != nil {
if ctx.Err() != nil {
@@ -72,6 +80,10 @@ func (p Poller) Run(ctx context.Context) error {
tasksVersion = response.GetTasksVersion()
task := response.GetTask()
if task == nil {
if p.Gate != nil {
p.Gate.Release()
haveLease = false
}
if !wait(ctx, emptyBackoff) {
return nil
}
@@ -79,6 +91,7 @@ func (p Poller) Run(ctx context.Context) error {
}
for {
if err := p.Scheduler.Run(ctx, task); err == nil {
haveLease = false
break
} else {
if ctx.Err() != nil {