Cleanup distbuild
This commit is contained in:
parent
730654cac8
commit
ac8e1b435d
13 changed files with 37 additions and 35 deletions
|
@ -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>
|
||||||
|
|
|
@ -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))
|
||||||
}
|
}
|
|
@ -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()
|
||||||
|
}
|
||||||
}
|
}
|
|
@ -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.
|
||||||
|
|
|
@ -10,7 +10,7 @@
|
||||||
могут вызвать даже для того джоба, который никто не шедулил. В этом случае планировщик просто должен
|
могут вызвать даже для того джоба, который никто не шедулил. В этом случае планировщик просто должен
|
||||||
запомнить, что результаты джоба сохранены в кеше на воркере.
|
запомнить, что результаты джоба сохранены в кеше на воркере.
|
||||||
|
|
||||||
Фукнция `LocateArtifact` должна возвращать имя любого воркера, который хранит в кеше заданный артефакт.
|
Функция `LocateArtifact` должна возвращать имя любого воркера, который хранит в кеше заданный артефакт.
|
||||||
Эта функция не нужна в этой задаче, но он потребуется вам для реализации передачи артефактов между
|
Эта функция не нужна в этой задаче, но он потребуется вам для реализации передачи артефактов между
|
||||||
воркерами.
|
воркерами.
|
||||||
|
|
||||||
|
|
|
@ -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")
|
||||||
}
|
}
|
||||||
|
|
4
distbuild/pkg/tarstream/README.md
Normal file
4
distbuild/pkg/tarstream/README.md
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
# tarstream
|
||||||
|
|
||||||
|
Пакет `tarstream` содержит функции для сериализации и десериализации директории. Вам не нужно
|
||||||
|
писать новый код в этом пакете, но нужно научиться пользоваться тем кодом, который вам дан.
|
Loading…
Reference in a new issue