ci / api / api (push) Successful in 50s
ci / docker / docker (образы собираются — их сервер собирает сам при обновлении) (push) Failing after 10s
ci / contract / contract (сгенерированный код совпадает с openapi.yaml) (push) Failing after 31m43s
ci / db / db (push) Failing after 19s
- Imported tracks are created directly under their final name with O_EXCL (never overwriting; " (2)" on conflict), fsync'ed and checked against SHA-256 — no hidden .pipu-tmp file next to them any more. - On any failure the agent removes its own partial file and the empty directories it created for it. - The write check uses access(W_OK) and the read-only mount flag instead of creating and deleting .pipu-write-test in the storage root. - Tests assert the storage tree holds only audio files after successful and failed writes and after the write check. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
19 lines
501 B
Go
19 lines
501 B
Go
//go:build unix
|
|
|
|
package storageagent
|
|
|
|
import (
|
|
"errors"
|
|
|
|
"golang.org/x/sys/unix"
|
|
)
|
|
|
|
// canWrite — можно ли создавать файлы в каталоге (без пробной записи); read-only монтирование — ошибка.
|
|
func canWrite(dir string) error {
|
|
var st unix.Statfs_t
|
|
if err := unix.Statfs(dir, &st); err == nil && st.Flags&unix.ST_RDONLY != 0 {
|
|
return errors.New("filesystem is mounted read-only")
|
|
}
|
|
return unix.Access(dir, unix.W_OK|unix.X_OK)
|
|
}
|