From 7bd8184159a08fabaff9c66e388b72ea9faa9659 Mon Sep 17 00:00:00 2001 From: Evgeny Demchenko Date: Tue, 16 Jun 2026 13:50:28 +0100 Subject: [PATCH] =?UTF-8?q?frigate=5Fmqtt:=20unique=20client=5Fid=20per=20?= =?UTF-8?q?instance=20(=D0=BD=D0=B5=D1=81=D0=BA=D0=BE=D0=BB=D1=8C=D0=BA?= =?UTF-8?q?=D0=BE=20subscriber'=D0=BE=D0=B2)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bug: client_id format "composer-frigate-%d" использовал только now_ms(). Когда создаются 2 subscriber'а подряд (frigate + yoloworld) — оба получают один client_id за тот же мс, mosquitto kick'ает старый при connect нового → infinite reconnect loop, ни один не получает events стабильно. Fix: static _Atomic int instance_seq counter — tie-break суффикс. Format: "composer-frigate-%d-%d". Verify mosquitto logs: composer-frigate--2117451292-0 (frigate subscriber) composer-frigate--2117451292-1 (yoloworld subscriber) Co-Authored-By: Claude Opus 4.7 --- src/frigate_mqtt.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/frigate_mqtt.c b/src/frigate_mqtt.c index db6e92b..dca6d46 100644 --- a/src/frigate_mqtt.c +++ b/src/frigate_mqtt.c @@ -228,8 +228,15 @@ int cfc_frigate_mqtt_create(const cfc_frigate_mqtt_config_t *cfg, atomic_init(&f->events_received, 0); atomic_init(&f->parse_errors, 0); + /* client_id уникальный per instance. now_ms() недостаточно — несколько + * subscriber'ов создаются в один тик (frigate + yoloworld), получают + * одинаковый client_id и mosquitto kick'aет old при connect нового + * → reconnect loop. Добавляем статический counter для tie-break. */ + static _Atomic int instance_seq = 0; + int seq = atomic_fetch_add(&instance_seq, 1); char client_id[64]; - snprintf(client_id, sizeof(client_id), "composer-frigate-%d", (int)now_ms()); + snprintf(client_id, sizeof(client_id), "composer-frigate-%d-%d", + (int)now_ms(), seq); f->mosq = mosquitto_new(client_id, true, f); if (!f->mosq) goto fail;