Preskoči na sadržaj

Distributed lock — pregled

TL;DR

Vendor-neutral lock za remote mutaciju shared state izvan lokalnog workspace-a. Tri live consumera: Coolify deploy, mobile version-state read-modify-write, bump fingerprint auto-seed. Lock ide prije svake mutacije; release_lock() na kraju. Vendor-neutral = isti lock API, više backend implementacija.

Šta lock štiti

Coolify deploy — dva paralelna pipeline-a ne smiju istovremeno pisati u isti Coolify env. Posljedica bez locka: prepisani secrets, nepredvidivi image_tag.

Mobile version-state (Flagsmith / Infisical / git / Backoffice) — read-modify-write kritična sekcija. Posljedica bez locka: dva pipeline-a pročitaju isti state, oba inkrementiraju, oba pišu — jedan increment izgubljen.

bump fingerprint auto-seed — kada novi servis treba baseline, bump acquire-uje lock da ne bi drugi bump paralelno seed-ovao različit baseline.

Kada NE treba lock

  • Samo-lokalne operacije (file read/write unutar workspace-a).
  • Idempotentne operacije (Coolify redeploy sa istim tagom).
  • Read-only pozivi (Sentry DSN fetch, Slack channel info).

Lock backend opcije

Backend Trade-off
Infisical (default) Lock key je secret u Infisical folder-u; CAS preko Infisical API
Flagsmith Lock key je Flagsmith feature flag; CAS preko Flagsmith API
Backoffice (v25+) Lock u version-store HTTP backend; native CAS
git Lock preko git refs na dedicated branch; CAS preko push
memory / none Samo za testiranje; nikad production

CI_LOCK_BACKEND env var bira backend. Production treba infisical / flagsmith / backoffice (ovisno o dostupnosti u consumer repo-u).

Lock životni ciklus

from ci.lock import acquire, release

with acquire("coolify:<uuid>:<env>", timeout=300) as lock:
    coolify_set_env(uuid, key, value)
    coolify_redeploy(uuid, image_tag)
# lock automatski otpusti

Ako acquire timeout-uje (drugi pipeline drži), acquire raise-uje LockTimeout. Verb to tretira kao transient fail (exit 1, retry).

Tri load-bearing konstante (F35/F38/F40)

  • F35 — dvofazni lock (Phase 1 lock, Phase 2 lock, između release)
  • F38 — deploy/mobile folder split (Coolify deploy koristi jedan lock namespace, mobile RMW drugi — ne mogu se preklapati)
  • F40 — acquire budget (timeout + max retries)

Detalji u 06-lock-protocol.md.

Failure modes

  • Acquire timeout (drugi pipeline drži) → exit 1, retry.
  • Release fail (lock ostaje držan) → sljedeći run će timeout-ovati; ručno čišćenje (ili release_lock sa --force).
  • Backend unreachable → exit 2, fail-loud. Lock NIKAD ne degradira na "no-op".

Vidi i