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/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>
```
prime@bee ~/C/shad-go> find distbuild -iname '*.go' | grep -v test | grep -v mock | grep -v pkg/build | xargs wc -l
23 distbuild/pkg/worker/state.go
111 distbuild/pkg/worker/worker.go
45 distbuild/pkg/worker/download.go
281 distbuild/pkg/worker/job.go
69 distbuild/pkg/api/heartbeat.go
121 distbuild/pkg/api/build_client.go
53 distbuild/pkg/api/build.go
60 distbuild/pkg/api/heartbeat_handler.go
142 distbuild/pkg/api/build_handler.go
56 distbuild/pkg/api/heartbeat_client.go
288 distbuild/pkg/scheduler/scheduler.go
119 distbuild/pkg/dist/build.go
120 distbuild/pkg/dist/coordinator.go
98 distbuild/pkg/tarstream/stream.go
42 distbuild/pkg/artifact/client.go
191 distbuild/pkg/artifact/cache.go
54 distbuild/pkg/artifact/handler.go
124 distbuild/pkg/client/build.go
83 distbuild/pkg/filecache/client.go
99 distbuild/pkg/filecache/handler.go
111 distbuild/pkg/filecache/filecache.go
2290 total
prime@fedora ~/C/s/distbuild (master)> find -iname '*_solution.go' | grep -v scheduler_solution| xargs wc -l
123 ./pkg/api/build_client_solution.go
140 ./pkg/api/build_handler_solution.go
58 ./pkg/api/heartbeat_client_solution.go
62 ./pkg/api/heartbeat_handler_solution.go
5 ./pkg/artifact/cache_solution.go
44 ./pkg/artifact/client_solution.go
56 ./pkg/artifact/handler_solution.go
126 ./pkg/client/build_solution.go
121 ./pkg/dist/build_solution.go
122 ./pkg/dist/coordinator_solution.go
85 ./pkg/filecache/client_solution.go
5 ./pkg/filecache/filecache_solution.go
101 ./pkg/filecache/handler_solution.go
5 ./pkg/tarstream/stream_solution.go
47 ./pkg/worker/download_solution.go
283 ./pkg/worker/job_solution.go
25 ./pkg/worker/state_solution.go
113 ./pkg/worker/worker_solution.go
1521 total
```
</details>

View file

@ -37,6 +37,7 @@ type env struct {
Client *client.Client
Coordinator *dist.Coordinator
Workers []*worker.Worker
WorkerCache []*artifact.Cache
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.WorkerCache = append(env.WorkerCache, artifacts)
router.Handle(workerPrefix+"/", http.StripPrefix(workerPrefix, w))
}

View file

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

View file

@ -19,8 +19,10 @@ Client и Coordinator общаются через два вызова.
- `POST /build` - стартует новый билд.
* Client посылает в Body запроса json c описанием сборки.
* Coordinator стримит в body ответа json сообщения, описывающие прогресс сборки.
* Первым сообщением в ответе Coordinator присылает `buildID`.
* _Тут можно было бы использовать websocket, но нас устраивает более простое решение._
* Чтобы послать клиенту неполный body, нужно использовать метод `Flush`.
Прочитайте про [`http.ResponseController`](https://pkg.go.dev/net/http#ResponseController) и используйте его.
* Первым сообщением в ответе Coordinator присылает `buildID`.
- `POST /signal?build_id=12345` - посылает сигнал бегущему билду.
* Запрос и ответ передаются в формате 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")
}
func (c *Scheduler) RegisterWorker(workerID api.WorkerID) {
panic("implement me")
}
func (c *Scheduler) OnJobComplete(workerID api.WorkerID, jobID build.ID, res *api.JobResult) bool {
panic("implement me")
}

View file

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