Skip to content

/projects выполняет git pull (autoPullState) на каждый запрос и всегда падает без github-кредов (exit 128) #449

Description

@skulidropek

Проблема

Каждый GET /projects (рендер панели) синхронно делает git pull state-репозитория, хотя список проектов читается из «БД» (файлов) и в git-сети не нуждается.

Цепочка (packages/api/src/services/projects.ts):

export const listProjects = () =>
  readProjectItemsForInventory().pipe(...)                    // ~628

export const readProjectItemsForInventory = () =>
  refreshProjectStateForInventory().pipe(                     // ~251
    Effect.zipRight(listProjectItems),
  )

export const refreshProjectStateForInventory = () => autoPullState   // ~249  <-- git pull на каждый read

Иронично, что рядом стоят комментарии, декларирующие обратное:

// FORMAT THEOREM: forall p in DB: listProjects(p) does not require docker(p)
// CHANGE: keep project inventory reads DB-only

По факту read-путь дергает сеть + берёт state git-lock (см. связанный issue про зависание панели).

Дополнительно: pull всегда падает без github-кредов

В нашем окружении autoPullState стабильно падает:

WARN: State auto-pull failed: git pull (exit 128)

Причина — у контейнера docker-git-api нет github-credential для https://github.com/<owner>/.docker-git.git:

$ git -C /home/dev/.docker-git fetch origin
fatal: could not read Username for 'https://github.com': No such device or address

То есть на каждый рендер панели: сетевой git-вызов + захват лока + гарантированная ошибка + запись в лог. Даже когда лок не залип, это лишняя латентность и шум.

Предложение

  1. Отвязать чтение инвентаря от autoPullState. Pull делать по расписанию (фоновый тик) и/или по явному действию пользователя («Sync»), а GET /projects пусть читает только из файлов/кэша.
  2. Если auto-pull на старте всё же нужен — делать его один раз при инициализации, а не на hot-path каждого запроса.
  3. Уважать DOCKER_GIT_STATE_AUTO_PULL=false как быстрый выключатель (сейчас помогает, но по умолчанию латентность всё равно есть). Возможно, авто-отключать pull после N подряд неуспешных попыток (например, когда нет кредов), чтобы не долбить впустую.

Связано

  • Зависание панели на ~24с из-за stale state-лока (отдельный issue) — этот дизайн-дефект и ставит git-лок на hot-path чтения.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions