package sched // Baux de travail. Un agent ne "prend" pas une tache, il obtient un bail // qui expire : si l'agent meurt, la tache revient d'elle meme. import "time" type Lease struct { TaskID string Agent string ExpiresAt time.Time Renewals int } // Le vol de tache prefere le bail le plus ancien, pas la tache la plus // courte : sinon un agent rapide draine la file courte et la longue traine // meurt de faim (voir issue #11). func (s *Scheduler) Steal(now time.Time) (*Lease, bool) { var oldest *Lease for _, l := range s.expired(now) { if oldest == nil || l.ExpiresAt.Before(oldest.ExpiresAt) { oldest = l } } if oldest == nil { return nil, false } return oldest, true } // Renew etend le bail. Le compteur de renouvellements sert au ledger de // retry : on veut savoir quel agent a echoue, et combien de fois. func (l *Lease) Renew(d time.Duration) { l.ExpiresAt = time.Now().Add(d) l.Renewals++ }