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. По две локальные очереди на воркер. 2. По две локальные очереди на воркер.
При запросе нового джоба воркер выбирает случайную джобу из трех очередей - глобальной, и двух локальных относящихся При запросе нового джоба воркер выбирает случайную джобу из трех очередей - глобальной, и двух локальных относящихся
@ -45,5 +51,5 @@
Вместо реального времени, юниттесты шедулера используют библиотеку `clockwork`. Это накладывает ограничения Вместо реального времени, юниттесты шедулера используют библиотеку `clockwork`. Это накладывает ограничения
на детали вашей реализации. Ожидание `CacheTimeout` и `DepTimeout` должно быть реализовано как `select {}` на на детали вашей реализации. Ожидание `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" "gitlab.com/slon/shad-go/distbuild/pkg/build"
) )
var timeAfter = time.After var TimeAfter = time.After
type PendingJob struct { type PendingJob struct {
Job *api.JobSpec Job *api.JobSpec

View file

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