27 lines
2.2 KiB
Markdown
27 lines
2.2 KiB
Markdown
|
# artifact
|
|||
|
|
|||
|
Пакет `artifact` реализует кеш хранения артефактов и протокол для передачи артефактов между воркерами.
|
|||
|
|
|||
|
Артефакт - это директория, содержащая в себе результат работы джоба. Артефакт может состоять из произвольного
|
|||
|
набора файлов и директорий.
|
|||
|
|
|||
|
Основной тип `artifact.Cache` занимается хранением артефактов на диске и контролем одновременного доступа.
|
|||
|
|
|||
|
Одна горутина может начать писать артефакт. Начало записи берёт лок на запись. Никто другой не может работать с артефактом,
|
|||
|
на который взят лок на запись. Горутина должна позвать `commit` или `abort` после того, как она закончила работать с артефактом.
|
|||
|
|
|||
|
`commit` помечает артефакт в кеш. `abort` отменяет запись артефакта, удаляя все данные.
|
|||
|
|
|||
|
Горутина может начать читать артефакт, позвав метод `Get`. Много горутин могут читать артефакт одновременно.
|
|||
|
Горутина должна позвать `unlock`, после того как она закончила работать с артефактом.
|
|||
|
|
|||
|
## Скачивание артефакта
|
|||
|
|
|||
|
`*artifact.Handler` должен реализовывать один метод `GET /artifact?id=1234`. Хендлер отвечает на
|
|||
|
запрос содержимым артефакта в формате `tarstream`.
|
|||
|
|
|||
|
Функция `Download` должна скачивать артефакт из удалённого кеша в локальный.
|
|||
|
|
|||
|
Обратите внимание, что конструктор хендлера принимает `*zap.Logger`. Запишите в этот логгер интересные события,
|
|||
|
это поможет при отладке в следующих частях задачи.
|