- Берем WB7.4 testing
- Крыжик Relay&FETs V-Out переводим в ON
- …
- Вырубаем контроллер, выдернув питалово. Свет пропал, а упса нет.
- …
- Включаем контроллер.
- V-Out в off.
Пытаюсь воспроизвести WB7.4 для начала на stable
/etc/wb-mqtt-gpio.conf - по умолчанию.
Оставляю включенным контрол, перезапускаю.
timeout 2 mosquitto_sub -v -t "/devices/wb-gpio/controls/V_OUT/#"
/devices/wb-gpio/controls/V_OUT/meta {"order":11,"readonly":false,"type":"switch"}
/devices/wb-gpio/controls/V_OUT/meta/order 11
/devices/wb-gpio/controls/V_OUT/meta/readonly 0
/devices/wb-gpio/controls/V_OUT/meta/type switch
/devices/wb-gpio/controls/V_OUT 1
Переключаюсь на testing.
Состояние восстанавливается. Собственно как и настроено.
journalctl -b 0 -u wb-mqtt-gpio
подозрительного нет. Как воспроизвести?
Вот прямо сейчас обновился на самое последнее и воспроизвел. На всякий
- обновился.
- пощелкал VOUT, оставляя его в ON
- рубанул питание
- контроллер загрузился
- VOUT OFF
На всякий диагностику прикладываю
Проверил с помощью reboot. VOUT на месте.
Так что для повторения надо рубить именно по питанию на входе
Сейчас попробую.
Отключил ИБП, заодно повключал три открытых коллектора
Перезапускаю выключением.
Интересно, что последний (A1_OUT) который я выключал - не сохранился.
У вас так же?
Ну и пришлите пожалуйста /var/lib/wb-mqtt-gpio/libwbmqtt.db до перезагрузки и после.
after.db (8 KB)
это после
before.zip (310 Bytes)
А это ПЕРЕД (форму почему-то не хочет грузить его просто так, ставит after)
Но ситуация стала гораздо интереснее.
- На этот раз я VOUT не трогал.
- включил все a-out.
- подергал a1-out туда сюда (чтобы все были включены) (снял before)
- рубанул по питанию
- a1-out включен, остальные a - выключены!
- снял after
PS vout остался в порядке. так что тикет надо переименовывать “какая-то фигня с последней группой переключаителей при ребуте по питанию”
Да, высоковероятно что в
/var/lib/wb-mqtt-gpio/libwbmqtt.db запись идет не синхронно. а кэшируется. При этом для штатного завершения работы - кэш всегда успевает записаться.
UPD: Проверил еще, специально подождав ~полчаса. Да, сохраняется.
не, что-то другое
root@wirenboard-AG4LVLTQ:~# stat /var/lib/wb-mqtt-gpio/libwbmqtt.db
File: /var/lib/wb-mqtt-gpio/libwbmqtt.db
Size: 8192 Blocks: 16 IO Block: 4096 regular file
Device: b302h/45826d Inode: 28682 Links: 1
Access: (0640/-rw-r-----) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2024-06-26 09:13:55.223022094 +0300
Modify: 2024-07-03 15:13:28.784344620 +0300
Change: 2024-07-03 15:13:28.784344620 +0300
Birth: 2023-12-21 16:55:51.778295002 +0300
root@wirenboard-AG4LVLTQ:~# stat /var/lib/wb-mqtt-gpio/libwbmqtt.db
File: /var/lib/wb-mqtt-gpio/libwbmqtt.db
Size: 8192 Blocks: 16 IO Block: 4096 regular file
Device: b302h/45826d Inode: 28682 Links: 1
Access: (0640/-rw-r-----) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2024-06-26 09:13:55.223022094 +0300
Modify: 2024-07-03 15:40:52.071532805 +0300
Change: 2024-07-03 15:40:52.071532805 +0300
Birth: 2023-12-21 16:55:51.778295002 +0300
- Дал поработать
- снял статистику
- пощелкал выключателями
- тут же снял еще раз статистику.
По второму stat видно, что он меняет файл тут же, не ждет никаких сбросов кешей
А, cтоп, есть же еще кэш у FS. И он может всю малину портить. А в логах нет ничего про fsck…
Причем подозреваю что тут из-за ядра, нового То есть оно оптимизирует записи на EMMC кэшем, если принудительный sync сделать - то пишет. Но тут пожалуй моей компетенции мало - позову разработчиков. Обсудим глюк ли это.
Ну да, это кеширование FS. Проверьте, сработает ли фикс у вас. У меня - сработал
# cat /etc/systemd/system/libwbmqtt-saver.service
[Unit]
Description=Drop file cache for libwbmqtt.db if it changed
[Service]
ExecStart=/bin/bash -c 'inotifywait -qq -e modify /var/lib/wb-mqtt-gpio/libwbmqtt.db && dd of=/var/lib/wb-mqtt-gpio/libwbmqtt.db oflag=nocache conv=notrunc,fdatasync count=0 status=none'
Restart=always
[Install]
WantedBy=multi-user.target
ну и потом systemctl daemon-reload
, systemctl enable libwbmqtt-saver.service
, systemctl start libwbmqtt-saver.service
Сервис тупо смотрит на изменение этого файлика и как только он поменялся, сбрасывает файловый кеш только для этого файла.
Можно пользовать для тех, у кого болит
Ну и вариант 2 - лезть в код и ставить там принудительный сброс. Но тут и у меня компетенция кончилась
Описал багу в трекере, подождем что разработчики решат - как обходить/чинить.
Вполне возможно что будут форсить запись по таймеру при наличии изменений.