fix: 隔离 Pod 与 VM 并发容量
test / python (pull_request) Successful in 20s
test / shell (pull_request) Successful in 23s
test / go (pull_request) Successful in 3m46s

This commit is contained in:
2026-09-21 06:44:34 +00:00
parent 2a23f0c62e
commit d06845bc3c
5 changed files with 4 additions and 79 deletions
-31
View File
@@ -1,31 +0,0 @@
package taskscheduler
import "context"
// SingleFlightGate keeps at most one fetched task in flight. Release is
// idempotent so repeated terminal updates cannot increase capacity.
type SingleFlightGate struct {
token chan struct{}
}
func NewSingleFlightGate() *SingleFlightGate {
gate := &SingleFlightGate{token: make(chan struct{}, 1)}
gate.token <- struct{}{}
return gate
}
func (g *SingleFlightGate) Acquire(ctx context.Context) error {
select {
case <-g.token:
return nil
case <-ctx.Done():
return ctx.Err()
}
}
func (g *SingleFlightGate) Release() {
select {
case g.token <- struct{}{}:
default:
}
}
-29
View File
@@ -1,29 +0,0 @@
package taskscheduler
import (
"context"
"testing"
"time"
)
func TestSingleFlightGateBlocksUntilTerminalRelease(t *testing.T) {
gate := NewSingleFlightGate()
if err := gate.Acquire(context.Background()); err != nil {
t.Fatal(err)
}
blocked, cancel := context.WithTimeout(context.Background(), 20*time.Millisecond)
defer cancel()
if err := gate.Acquire(blocked); err == nil {
t.Fatal("second task acquired capacity before release")
}
gate.Release()
gate.Release()
if err := gate.Acquire(context.Background()); err != nil {
t.Fatal(err)
}
blockedAgain, cancelAgain := context.WithTimeout(context.Background(), 20*time.Millisecond)
defer cancelAgain()
if err := gate.Acquire(blockedAgain); err == nil {
t.Fatal("duplicate terminal release increased capacity")
}
}
-13
View File
@@ -26,7 +26,6 @@ type PollerConfig struct {
type Poller struct {
Client PollClient
Scheduler *Scheduler
Gate *SingleFlightGate
Config PollerConfig
OnError func(error)
}
@@ -51,14 +50,7 @@ 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 {
@@ -80,10 +72,6 @@ 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
}
@@ -91,7 +79,6 @@ 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 {