simplify: 移除 leader lock,单实例无需分布式锁

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
guoyongchang
2026-03-05 16:31:27 +08:00
parent 9a8dacc514
commit 817a491087
6 changed files with 4 additions and 119 deletions

View File

@@ -59,10 +59,3 @@ type ScheduledTestResultRepository interface {
ListByPlanID(ctx context.Context, planID int64, limit int) ([]*ScheduledTestResult, error)
PruneOldResults(ctx context.Context, planID int64, keepCount int) error
}
// LeaderLocker provides distributed leader election for background runners.
// TryAcquire attempts to acquire a named lock and returns a release function
// and true if successful, or nil and false if the lock is held by another instance.
type LeaderLocker interface {
TryAcquire(ctx context.Context, key string, ttl time.Duration) (release func(), ok bool)
}

View File

@@ -10,18 +10,13 @@ import (
"github.com/robfig/cron/v3"
)
const (
scheduledTestLeaderLockKey = "scheduled_test:runner:leader"
scheduledTestLeaderLockTTL = 2 * time.Minute
scheduledTestDefaultMaxWorkers = 10
)
const scheduledTestDefaultMaxWorkers = 10
// ScheduledTestRunnerService periodically scans due test plans and executes them.
type ScheduledTestRunnerService struct {
planRepo ScheduledTestPlanRepository
scheduledSvc *ScheduledTestService
accountTestSvc *AccountTestService
locker LeaderLocker
cfg *config.Config
cron *cron.Cron
@@ -34,14 +29,12 @@ func NewScheduledTestRunnerService(
planRepo ScheduledTestPlanRepository,
scheduledSvc *ScheduledTestService,
accountTestSvc *AccountTestService,
locker LeaderLocker,
cfg *config.Config,
) *ScheduledTestRunnerService {
return &ScheduledTestRunnerService{
planRepo: planRepo,
scheduledSvc: scheduledSvc,
accountTestSvc: accountTestSvc,
locker: locker,
cfg: cfg,
}
}
@@ -95,17 +88,6 @@ func (s *ScheduledTestRunnerService) runScheduled() {
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Minute)
defer cancel()
// Skip leader election in simple mode.
if s.cfg == nil || s.cfg.RunMode != config.RunModeSimple {
release, ok := s.locker.TryAcquire(ctx, scheduledTestLeaderLockKey, scheduledTestLeaderLockTTL)
if !ok {
return
}
if release != nil {
defer release()
}
}
now := time.Now()
plans, err := s.planRepo.ListDue(ctx, now)
if err != nil {
@@ -118,8 +100,7 @@ func (s *ScheduledTestRunnerService) runScheduled() {
logger.LegacyPrintf("service.scheduled_test_runner", "[ScheduledTestRunner] found %d due plans", len(plans))
maxWorkers := scheduledTestDefaultMaxWorkers
sem := make(chan struct{}, maxWorkers)
sem := make(chan struct{}, scheduledTestDefaultMaxWorkers)
var wg sync.WaitGroup
for _, plan := range plans {
@@ -146,7 +127,6 @@ func (s *ScheduledTestRunnerService) runOnePlan(ctx context.Context, plan *Sched
logger.LegacyPrintf("service.scheduled_test_runner", "[ScheduledTestRunner] plan=%d SaveResult error: %v", plan.ID, err)
}
// Compute next run
nextRun, err := computeNextRun(plan.CronExpression, time.Now())
if err != nil {
logger.LegacyPrintf("service.scheduled_test_runner", "[ScheduledTestRunner] plan=%d computeNextRun error: %v", plan.ID, err)

View File

@@ -287,10 +287,9 @@ func ProvideScheduledTestRunnerService(
planRepo ScheduledTestPlanRepository,
scheduledSvc *ScheduledTestService,
accountTestSvc *AccountTestService,
locker LeaderLocker,
cfg *config.Config,
) *ScheduledTestRunnerService {
svc := NewScheduledTestRunnerService(planRepo, scheduledSvc, accountTestSvc, locker, cfg)
svc := NewScheduledTestRunnerService(planRepo, scheduledSvc, accountTestSvc, cfg)
svc.Start()
return svc
}