.. | ||
cache.go | ||
client.go | ||
handler.go | ||
README.md |
artifact
Пакет artifact
реализует кеш хранения артефактов и протокол для передачи артефактов между воркерами.
Артефакт - это директория, содержащая в себе результат работы джоба. Артефакт может состоять из произвольного набора файлов и директорий.
Основной тип artifact.Cache
занимается хранением артефактов на диске и контролем одновременного доступа.
Все методы artifact.Cache
должны быть concurrency safe.
Одна горутина может начать писать артефакт. Начало записи берёт лок на запись. Никто другой не может работать с артефактом,
на который взят лок на запись. Горутина должна позвать commit
или abort
после того, как она закончила работать с артефактом.
commit
помещает артефакт в кеш. abort
отменяет запись артефакта, удаляя все данные.
После первого вызова commit
все последующие вызовы commit
и abort
должны ничего не делать.
Точно так же, после вызова abort
все последующие вызовы commit
и abort
должны ничего не делать.
Горутина может начать читать артефакт, позвав метод Get
. Много горутин могут читать артефакт одновременно.
Горутина должна позвать unlock
, после того как она закончила работать с артефактом.
Скачивание артефакта
*artifact.Handler
должен реализовывать один метод GET /artifact?id=1234
. Хендлер отвечает на
запрос содержимым артефакта в формате tarstream
.
Функция Download
должна скачивать артефакт из удалённого кеша в локальный.
Обратите внимание, что конструктор хендлера принимает *zap.Logger
. Запишите в этот логгер интересные события,
это поможет при отладке в следующих частях задачи.