Доброго дня!
На контроллере wirenboard 7.3.4 5.10.35-wb175 release wb-2504 (as stable) 1 или 2 раза в день перезагружается движок правил wb-rules и mqtt брокер. Я не могу понять почему…
Причина перезагрузки wb-rules и MQTT брокера
В предоставленных логах контроллера Wiren Board отчетливо видна критическая ошибка:
fatal error: concurrent map iteration and map write
Это стандартная ошибка языка Go, означающая, что несколько горутин одновременно обращаются к одной и той же карте (map) для чтения и записи без синхронизации. В Go встроенные map не являются потокобезопасными, и при попытке одновременного чтения и записи возникает фатальная ошибка, которая завершает процесс.
В вашем случае wb-rules (движок правил) работает на Go и, судя по стеку вызовов, использует MQTT-клиент paho.mqtt.golang. Ошибка возникает внутри кастомного кода Wiren Board (wbgo-private, wbrules), который, вероятно, неправильно синхронизирует доступ к общей карте при обработке событий MQTT. После такой ошибки процесс wb-rules аварийно завершается, что может приводить и к перезапуску MQTT-брокера, если они связаны или настроены на совместный рестарт.
Почему это происходит 1-2 раза в день
• Скорее всего, ошибка проявляется при определённом стечении обстоятельств: когда одновременно срабатывают несколько правил или приходят сообщения по MQTT, которые обрабатываются параллельно.
• Если у вас много устройств или часто происходят события, вероятность столкновения горутин возрастает.
• Подобные ошибки могут быть спровоцированы некорректно написанными пользовательскими правилами, но чаще — багом в самой реализации wb-rules или используемых драйверах.
Как устранить
Для разработчиков ПО:
• Необходимо исправить код, чтобы доступ к map происходил с использованием синхронизации (например, через sync.RWMutex или sync.Map).
• Если используете сторонние модули или плагины, убедитесь, что они не нарушают потокобезопасность.
Для пользователя:
• Проверьте, не появлялись ли обновления прошивки или движка правил для вашей версии Wiren Board — подобные ошибки часто устраняются в новых релизах.
• Если есть возможность, временно отключите или упростите пользовательские правила, чтобы выявить, не связано ли падение с конкретным скриптом.
• Сообщите об ошибке в официальную поддержку Wiren Board, приложив логи — возможно, проблема уже известна.
Дополнительные замечания
• Аналогичные проблемы с периодическими сбоями и странным поведением устройств по MQTT обсуждаются и другими пользователями Wiren Board, что подтверждает наличие багов в реализации брокера или движка правил.
• Если MQTT-брокер и wb-rules перезапускаются одновременно, проверьте настройки Watchdog и зависимостей сервисов, чтобы исключить каскадные рестарты из-за одной ошибки.
Резюме
Ваши логи однозначно указывают на баг в многопоточном доступе к map в wb-rules. Это требует исправления на уровне исходного кода или обновления ПО. До выхода патча — минимизируйте количество параллельных событий и обратитесь в поддержку Wiren Board с логами для ускорения решения проблемы.
Спасибо за подробное описание и предоставленный архив.
Судя по логам, некоторые правила одновременно обращаются к одному и тому же объекту, что может вызывать конфликт и последующий сбой.
Можете, пожалуйста, уточнить, какое именно действие или событие отрабатывает перед сбоем?
Эта информация поможет воспроизвести проблему и передать её разработчикам для анализа и устранения.
я не был в курсе, что так делать некорректно, попробую убрать в одном из правил и отслеживать только состояние вирт устройства
Еще обнаружил некоторое количество ошибок такого типа:
24-06-2025 18:25:53.533 [wb-rules] ERROR: control virtual-zb-9/info SetValue() error: can't convert control value 'map[]' (type map[string]interface {}) to datatype '0'
24-06-2025 18:25:53.530 [wb-rules] ERROR: control virtual-zb-9/state SetValue() error: can't convert control value 'map[]' (type map[string]interface {}) to datatype '0'
Это небольшой бридж некоторых устройств из спрутхаба в ВБ.
При этом сами устройства работают корректно и подобные ошибки возникают только при первоначальном запуске правила (или перезапуске движка wb-rules), потом они больше не появляются. Думал, что проблема в хранящихся данных в wb-mqtt-db на момент создания правила, однако, почистив все мета топики, и перезапустив движок правил - при старте в логах опять эти ошибки.
[wb-rules] fatal error: concurrent map iteration and map write
?
В любом случае, на текущий момент отключил правило с дублирующим trackMqtt - буду наблюдать и ждать очередного рестарта ) Как-то спровоцировать я это не могу (не знаю как).
Это было со всеми отключенными правилами, которые имели в своей структуре trackMqtt… Пытаюсь отключать правила (которые не вызывали ранее никаких проблем) по одному сейчас и жду этой ошибки… все еще не знаю как ее спровоцировать специально. Какой-то вяло-текущий дебаг получается, но других идей пока нет - LLM продолжают настаивать на проблеме в столкновении горутин
Рекомендую отключить сразу все правила, чтобы убедиться, действительно ли они вызывают перезагрузку. Вполне возможно, что причина в другом компоненте системы, а перезагрузка — лишь следствие другой ошибки.
Добрый день! Вчера принял решение удалить (а не просто выключить) и пересоздать все правила через web-ui контроллера (правила остались те же). После этого пока за сутки не было ни единого рестарта движка правил.
Еще сутки посмотрю и пришлю диаг архив, если возобновятся рестарты.