From 693b1ef93ebb2e5e565fcc41a8b18f546271797e Mon Sep 17 00:00:00 2001 From: adonis Date: Tue, 18 Aug 2026 12:39:45 +0330 Subject: [PATCH] fix(replicas): do not flock on manual repair-data Operator --repair was blocked when pm2 watch owned /tmp lock file. Only --repair-if-needed uses flock; lock path moved under deploy/. Co-authored-by: Cursor --- .gitignore | 1 + deploy/sync-replica-data.sh | 19 +++++++++++++------ 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/.gitignore b/.gitignore index 7d2965f..81b42a9 100644 --- a/.gitignore +++ b/.gitignore @@ -12,6 +12,7 @@ coverage # replica DSNs contain live DB passwords deploy/replicas.env +deploy/.replica-data.lock # SMS import target files may contain live DB passwords prisma/khanegi-sms-targets.json diff --git a/deploy/sync-replica-data.sh b/deploy/sync-replica-data.sh index 9083de1..7dacfb3 100644 --- a/deploy/sync-replica-data.sh +++ b/deploy/sync-replica-data.sh @@ -208,12 +208,19 @@ check_replicas() { return "$needs_repair" } -LOCK_FILE="${REPLICA_DATA_LOCK:-/tmp/superadmin-replica-data.lock}" -if [[ "$MODE" != "--check" ]] && command -v flock >/dev/null; then - exec 9>"$LOCK_FILE" - if ! flock -n 9; then - echo "replica data sync already running — skip" - exit 0 +LOCK_FILE="${REPLICA_DATA_LOCK:-$API_DIR/deploy/.replica-data.lock}" +# --repair is operator-initiated; never block on flock (avoids /tmp permission fights with pm2 user). +if [[ "$MODE" == "--repair-if-needed" ]] && command -v flock >/dev/null; then + mkdir -p "$(dirname "$LOCK_FILE")" + touch "$LOCK_FILE" 2>/dev/null || true + chmod 666 "$LOCK_FILE" 2>/dev/null || true + if exec 9>>"$LOCK_FILE" 2>/dev/null; then + if ! flock -n 9; then + echo "replica data sync already running — skip" + exit 0 + fi + else + echo " ! lock unavailable ($LOCK_FILE) — continuing without flock" >&2 fi fi