From 65dc7dc29dc6fc7a26c4b6ccfbb1ad5df1bb5f5b Mon Sep 17 00:00:00 2001 From: Fedor Korotkiy Date: Sun, 25 Apr 2021 16:10:08 +0300 Subject: [PATCH] Merge dumb scheduler into solution --- distbuild/pkg/scheduler/README.md | 18 ++++++++++++------ distbuild/pkg/scheduler/export_test.go | 3 --- distbuild/pkg/scheduler/scheduler.go | 2 +- distbuild/pkg/scheduler/scheduler_test.go | 4 ++-- 4 files changed, 15 insertions(+), 12 deletions(-) delete mode 100644 distbuild/pkg/scheduler/export_test.go diff --git a/distbuild/pkg/scheduler/README.md b/distbuild/pkg/scheduler/README.md index 230aebc..8a3b4ac 100644 --- a/distbuild/pkg/scheduler/README.md +++ b/distbuild/pkg/scheduler/README.md @@ -14,14 +14,20 @@ Эта функция не нужна в этой задаче, но он потребуется вам для реализации передачи артефактов между воркерами. -Вы можете отложить реализацию полной версии шедулера на последний шаг, и реализовать упрощённую версию -на одном глобальном канале. Такой реализации будет достаточно, чтобы работали все интеграционные тесты с одним -воркером. +Для того, чтобы зачесть домашнее задание, достаточно реализовать упрошённый алгоритм планирования с +одной глобальной очередью. Функция `ScheduleJob` должна помещать `job` в очередь, или возвращать ссылку на существующий +`pendingJob`. Функция `PickJob` должна извлекать первый элемент из очереди. Обратите внимание, что функция `PickJob` +принимает контекст. Поскольку это блокирующая операция, она должна поддерживать отмены. Если вы забудете +реазиловать отмену в этом месте, интеграционные тесты будут зависать. ## Алгоритм планирования +*Далее описывается продвинутый алгоритм планирования. Алгоритм проверяется в отдельной задаче `smartsched`. +Для зачёта по домашнему заданию, реализовывать этот алгоритм не обязательно.* + Планировщик поддерживает множество очередей: - 1. Одна глобальная очередь + + 1. Одна глобальная очередь. 2. По две локальные очереди на воркер. При запросе нового джоба воркер выбирает случайную джобу из трех очередей - глобальной, и двух локальных относящихся @@ -45,5 +51,5 @@ Вместо реального времени, юниттесты шедулера используют библиотеку `clockwork`. Это накладывает ограничения на детали вашей реализации. Ожидание `CacheTimeout` и `DepTimeout` должно быть реализовано как `select {}` на -канале, который вернула функция `timeAfter`. Мы считаем что `CacheTimeout < DepTimeout`, и ожидание этих -таймаутов происходит последовательно в одной горутине. \ No newline at end of file +канале, который вернула функция `TimeAfter`. Мы считаем что `CacheTimeout < DepTimeout`, и ожидание этих +таймаутов происходит последовательно в одной горутине. diff --git a/distbuild/pkg/scheduler/export_test.go b/distbuild/pkg/scheduler/export_test.go deleted file mode 100644 index 9675c6f..0000000 --- a/distbuild/pkg/scheduler/export_test.go +++ /dev/null @@ -1,3 +0,0 @@ -package scheduler - -var TimeAfter = &timeAfter diff --git a/distbuild/pkg/scheduler/scheduler.go b/distbuild/pkg/scheduler/scheduler.go index 9c4444d..224bb17 100644 --- a/distbuild/pkg/scheduler/scheduler.go +++ b/distbuild/pkg/scheduler/scheduler.go @@ -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 diff --git a/distbuild/pkg/scheduler/scheduler_test.go b/distbuild/pkg/scheduler/scheduler_test.go index 9ccca3b..d5f6754 100644 --- a/distbuild/pkg/scheduler/scheduler_test.go +++ b/distbuild/pkg/scheduler/scheduler_test.go @@ -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) }