You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Панель зависает ~24с: /projects упирается в stale state git-lock (.docker-git.lock не переустанавливается) #448
WARN: State auto-pull failed: state git lock (exit 75)
Первопричина
GET /projects → listProjects() → readProjectItemsForInventory() → refreshProjectStateForInventory() = autoPullState, обёрнутый в withStateGitLock.
Файловый лок берётся в acquireStateFileLock (packages/lib/src/usecases/state-repo/lock.ts):
conststateGitLockRetryDelay=Duration.millis(100)conststateGitLockMaxAttempts=50// => до 5 секунд ожиданияconststateGitLockBusyExitCode=75constresolveStateLockPath=(root)=>`${root}.lock`// /home/dev/.docker-git.lock (каталог)
Проблема: stale-лок никак не детектируется и не переустанавливается. Если каталог-лок остался от аварийно завершённой/убитой git-операции (а контейнер docker-git-api за сессию рестартовал 4 раза), то каждая последующая state-операция:
fs.makeDirectory(lockPath) → AlreadyExists;
ретраит 50×100мс = 5 секунд;
падает с exit 75 (тот самый лог-спам).
Операции ещё и сериализуются через Effect.unsafeMakeSemaphore(1) и копятся в очередь, поэтому /projects ждёт суммарно ~24с.
В нашем случае были найдены два залипших лока:
/home/dev/.docker-git.lock # каталог, возраст ~5.5 часов
/home/dev/.docker-git/.git/index.lock # 0 байт, возраст ~3 недели
Детекция и авто-переустановка stale-лока в acquireStateFileLock: проверять возраст каталога-лока (mtime) и/или PID владельца, и переустанавливать лок по TTL вместо бесконечного упирания в него.
Гарантированное снятие лока при аварийном завершении/рестарте процесса (cleanup on startup / signal handler) — сейчас крэш/kill оставляет вечный лок.
Опционально — не завязывать hot-path чтения на этот лок (см. отдельный issue про autoPullState на read-пути).
Окружение
Контейнер docker-git-api (панель на 127.0.0.1:3334, реверс через nginx).
Диагностировано через host docker socket. Диск/CPU/RAM в норме — проблема чисто в логике state-лока.
Activity