Cleanup distbuild

This commit is contained in:
Fedor Korotkiy 2023-04-26 16:29:27 +04:00
parent 730654cac8
commit ac8e1b435d
13 changed files with 37 additions and 35 deletions

View file

@ -96,7 +96,7 @@ type Job struct {
После того, как все кубики будут готовы, нужно будет соединить их вместе, реализовав [`distbuild/pkg/worker`](./pkg/worker), После того, как все кубики будут готовы, нужно будет соединить их вместе, реализовав [`distbuild/pkg/worker`](./pkg/worker),
[`distbuild/pkg/client`](./pkg/client) и [`distbuild/pkg/dist`](./pkg/dist). Код в этих пакетах нужно отлаживать на [`distbuild/pkg/client`](./pkg/client) и [`distbuild/pkg/dist`](./pkg/dist). Код в этих пакетах нужно отлаживать на
интеграционных тестах в [`distbuild/disttest`](../disttest). интеграционных тестах в [`distbuild/disttest`](./disttest).
Код тестов в этом задании менять нельзя. Это значит, что вы не можете менять интерфейсы в тех местах, где Код тестов в этом задании менять нельзя. Это значит, что вы не можете менять интерфейсы в тех местах, где
код покрыт тестами. код покрыт тестами.
@ -105,28 +105,25 @@ type Job struct {
<summary markdown="span">Сколько кода нужно написать?</summary> <summary markdown="span">Сколько кода нужно написать?</summary>
``` ```
prime@bee ~/C/shad-go> find distbuild -iname '*.go' | grep -v test | grep -v mock | grep -v pkg/build | xargs wc -l prime@fedora ~/C/s/distbuild (master)> find -iname '*_solution.go' | grep -v scheduler_solution| xargs wc -l
23 distbuild/pkg/worker/state.go 123 ./pkg/api/build_client_solution.go
111 distbuild/pkg/worker/worker.go 140 ./pkg/api/build_handler_solution.go
45 distbuild/pkg/worker/download.go 58 ./pkg/api/heartbeat_client_solution.go
281 distbuild/pkg/worker/job.go 62 ./pkg/api/heartbeat_handler_solution.go
69 distbuild/pkg/api/heartbeat.go 5 ./pkg/artifact/cache_solution.go
121 distbuild/pkg/api/build_client.go 44 ./pkg/artifact/client_solution.go
53 distbuild/pkg/api/build.go 56 ./pkg/artifact/handler_solution.go
60 distbuild/pkg/api/heartbeat_handler.go 126 ./pkg/client/build_solution.go
142 distbuild/pkg/api/build_handler.go 121 ./pkg/dist/build_solution.go
56 distbuild/pkg/api/heartbeat_client.go 122 ./pkg/dist/coordinator_solution.go
288 distbuild/pkg/scheduler/scheduler.go 85 ./pkg/filecache/client_solution.go
119 distbuild/pkg/dist/build.go 5 ./pkg/filecache/filecache_solution.go
120 distbuild/pkg/dist/coordinator.go 101 ./pkg/filecache/handler_solution.go
98 distbuild/pkg/tarstream/stream.go 5 ./pkg/tarstream/stream_solution.go
42 distbuild/pkg/artifact/client.go 47 ./pkg/worker/download_solution.go
191 distbuild/pkg/artifact/cache.go 283 ./pkg/worker/job_solution.go
54 distbuild/pkg/artifact/handler.go 25 ./pkg/worker/state_solution.go
124 distbuild/pkg/client/build.go 113 ./pkg/worker/worker_solution.go
83 distbuild/pkg/filecache/client.go 1521 total
99 distbuild/pkg/filecache/handler.go
111 distbuild/pkg/filecache/filecache.go
2290 total
``` ```
</details> </details>

View file

@ -37,6 +37,7 @@ type env struct {
Client *client.Client Client *client.Client
Coordinator *dist.Coordinator Coordinator *dist.Coordinator
Workers []*worker.Worker Workers []*worker.Worker
WorkerCache []*artifact.Cache
HTTP *http.Server HTTP *http.Server
} }
@ -140,6 +141,7 @@ func newEnv(t *testing.T, config *Config) (e *env, cancel func()) {
) )
env.Workers = append(env.Workers, w) env.Workers = append(env.Workers, w)
env.WorkerCache = append(env.WorkerCache, artifacts)
router.Handle(workerPrefix+"/", http.StripPrefix(workerPrefix, w)) router.Handle(workerPrefix+"/", http.StripPrefix(workerPrefix, w))
} }

View file

@ -5,9 +5,9 @@ import (
"os" "os"
"sync" "sync"
"testing" "testing"
"time"
"github.com/stretchr/testify/assert" "github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"gitlab.com/slon/shad-go/distbuild/pkg/build" "gitlab.com/slon/shad-go/distbuild/pkg/build"
) )
@ -29,8 +29,6 @@ func TestArtifactTransferBetweenWorkers(t *testing.T) {
var wg sync.WaitGroup var wg sync.WaitGroup
wg.Add(3) wg.Add(3)
startTime := time.Now()
for i := 0; i < 3; i++ { for i := 0; i < 3; i++ {
depJobID := build.ID{'b', byte(i)} depJobID := build.ID{'b', byte(i)}
depJob := build.Job{ depJob := build.Job{
@ -59,6 +57,9 @@ func TestArtifactTransferBetweenWorkers(t *testing.T) {
wg.Wait() wg.Wait()
testDuration := time.Since(startTime) for _, cache := range env.WorkerCache {
assert.True(t, testDuration < time.Second*5/2, "test duration should be less than 2.5 seconds") _, unlock, err := cache.Get(baseJob.ID)
require.NoError(t, err)
defer unlock()
}
} }

View file

@ -19,8 +19,10 @@ Client и Coordinator общаются через два вызова.
- `POST /build` - стартует новый билд. - `POST /build` - стартует новый билд.
* Client посылает в Body запроса json c описанием сборки. * Client посылает в Body запроса json c описанием сборки.
* Coordinator стримит в body ответа json сообщения, описывающие прогресс сборки. * Coordinator стримит в body ответа json сообщения, описывающие прогресс сборки.
* Первым сообщением в ответе Coordinator присылает `buildID`.
* _Тут можно было бы использовать websocket, но нас устраивает более простое решение._ * _Тут можно было бы использовать websocket, но нас устраивает более простое решение._
* Чтобы послать клиенту неполный body, нужно использовать метод `Flush`.
Прочитайте про [`http.ResponseController`](https://pkg.go.dev/net/http#ResponseController) и используйте его.
* Первым сообщением в ответе Coordinator присылает `buildID`.
- `POST /signal?build_id=12345` - посылает сигнал бегущему билду. - `POST /signal?build_id=12345` - посылает сигнал бегущему билду.
* Запрос и ответ передаются в формате json. * Запрос и ответ передаются в формате json.

View file

@ -10,7 +10,7 @@
могут вызвать даже для того джоба, который никто не шедулил. В этом случае планировщик просто должен могут вызвать даже для того джоба, который никто не шедулил. В этом случае планировщик просто должен
запомнить, что результаты джоба сохранены в кеше на воркере. запомнить, что результаты джоба сохранены в кеше на воркере.
Фукнция `LocateArtifact` должна возвращать имя любого воркера, который хранит в кеше заданный артефакт. Функция `LocateArtifact` должна возвращать имя любого воркера, который хранит в кеше заданный артефакт.
Эта функция не нужна в этой задаче, но он потребуется вам для реализации передачи артефактов между Эта функция не нужна в этой задаче, но он потребуется вам для реализации передачи артефактов между
воркерами. воркерами.

View file

@ -36,10 +36,6 @@ func (c *Scheduler) LocateArtifact(id build.ID) (api.WorkerID, bool) {
panic("implement me") panic("implement me")
} }
func (c *Scheduler) RegisterWorker(workerID api.WorkerID) {
panic("implement me")
}
func (c *Scheduler) OnJobComplete(workerID api.WorkerID, jobID build.ID, res *api.JobResult) bool { func (c *Scheduler) OnJobComplete(workerID api.WorkerID, jobID build.ID, res *api.JobResult) bool {
panic("implement me") panic("implement me")
} }

View file

@ -0,0 +1,4 @@
# tarstream
Пакет `tarstream` содержит функции для сериализации и десериализации директории. Вам не нужно
писать новый код в этом пакете, но нужно научиться пользоваться тем кодом, который вам дан.