Merge dumb scheduler into solution

This commit is contained in:
Fedor Korotkiy 2021-04-25 16:10:08 +03:00
parent 8097fdf1a4
commit 65dc7dc29d
4 changed files with 15 additions and 12 deletions

View file

@ -14,14 +14,20 @@
Эта функция не нужна в этой задаче, но он потребуется вам для реализации передачи артефактов между
воркерами.
Вы можете отложить реализацию полной версии шедулера на последний шаг, и реализовать упрощённую версию
на одном глобальном канале. Такой реализации будет достаточно, чтобы работали все интеграционные тесты с одним
воркером.
Для того, чтобы зачесть домашнее задание, достаточно реализовать упрошённый алгоритм планирования с
одной глобальной очередью. Функция `ScheduleJob` должна помещать `job` в очередь, или возвращать ссылку на существующий
`pendingJob`. Функция `PickJob` должна извлекать первый элемент из очереди. Обратите внимание, что функция `PickJob`
принимает контекст. Поскольку это блокирующая операция, она должна поддерживать отмены. Если вы забудете
реазиловать отмену в этом месте, интеграционные тесты будут зависать.
## Алгоритм планирования
*Далее описывается продвинутый алгоритм планирования. Алгоритм проверяется в отдельной задаче `smartsched`.
Для зачёта по домашнему заданию, реализовывать этот алгоритм не обязательно.*
Планировщик поддерживает множество очередей:
1. Одна глобальная очередь
1. Одна глобальная очередь.
2. По две локальные очереди на воркер.
При запросе нового джоба воркер выбирает случайную джобу из трех очередей - глобальной, и двух локальных относящихся
@ -45,5 +51,5 @@
Вместо реального времени, юниттесты шедулера используют библиотеку `clockwork`. Это накладывает ограничения
на детали вашей реализации. Ожидание `CacheTimeout` и `DepTimeout` должно быть реализовано как `select {}` на
канале, который вернула функция `timeAfter`. Мы считаем что `CacheTimeout < DepTimeout`, и ожидание этих
канале, который вернула функция `TimeAfter`. Мы считаем что `CacheTimeout < DepTimeout`, и ожидание этих
таймаутов происходит последовательно в одной горутине.

View file

@ -1,3 +0,0 @@
package scheduler
var TimeAfter = &timeAfter

View file

@ -12,7 +12,7 @@ import (
"gitlab.com/slon/shad-go/distbuild/pkg/build"
)
var timeAfter = time.After
var TimeAfter = time.After
type PendingJob struct {
Job *api.JobSpec

View file

@ -40,12 +40,12 @@ func newTestScheduler(t *testing.T) *testScheduler {
Scheduler: scheduler.NewScheduler(log, config),
}
*scheduler.TimeAfter = s.FakeClock.After
scheduler.TimeAfter = s.FakeClock.After
return s
}
func (s *testScheduler) stop(t *testing.T) {
*scheduler.TimeAfter = time.After
scheduler.TimeAfter = time.After
goleak.VerifyNone(t)
}