Lorawan-stack: Сообщения класса C периодически не могут быть запланированы с недопустимым абсолютным временем

Созданный на 17 нояб. 2020  ·  15Комментарии  ·  Источник: TheThingsNetwork/lorawan-stack

Резюме

Сообщения класса C периодически не могут быть запланированы с "недопустимым абсолютным временем, установленным в нисходящем канале приложения", когда они расположены близко друг к другу.

Есть ли минимальное время между отправкой сообщений на одно и то же устройство? В идеале мы бы запланировали их с интервалом 130 мс, но мы попытались увеличить интервал до 1000 мс, чтобы смягчить проблему.

Действия по воспроизведению

  1. Запланировать нисходящий канал на текущее время + 7 секунд до шлюза X
  2. Запланировать нисходящий канал на текущее время + 8 секунд до шлюза X
  3. Подождите 10 секунд и наблюдайте за темой mqtt DowlinkFailed
  4. При необходимости запустите цикл, чтобы увеличить вероятность воспроизведения ошибки.

Мы видим это примерно каждые 15 переходов.

Что ты видишь сейчас?

17/11/2020 14:09:30.783 +1300   Sending TTN V3 multicast. topic: v3/halter/devices/2704aee7-7c77-4c99-8d26-cf110b1a90a7/down/push. Payload: {"downlinks":[{"f_port":1,"frm_payload":"ChQKEgoQEg4IAxIFDbQiy10YASDjAQ==","priority":"ABOVE_NORMAL","class_b_c":{"absolute_time":"2020-11-17T01:09:37.000Z","gateways":[{"gateway_ids":{"gateway_id":"eui-00800000a0003582"}}]}}]}
17/11/2020 14:09:30.883 +1300   Sending TTN V3 multicast. topic: v3/halter/devices/2704aee7-7c77-4c99-8d26-cf110b1a90a7/down/push. Payload: {"downlinks":[{"f_port":1,"frm_payload":"ChQKEgoQEg4IAxIFDbQiy10YASDjAQ==","priority":"ABOVE_NORMAL","class_b_c":{"absolute_time":"2020-11-17T01:09:38.000Z","gateways":[{"gateway_ids":{"gateway_id":"eui-00800000a0005314"}}]}}]}
17/11/2020 14:09:37.068 +1300   Serial 2704aee7-7c77-4c99-8d26-cf110b1a90a7: Receiving DownlinkFailed. Payload: {"end_device_ids":{"device_id":"2704aee7-7c77-4c99-8d26-cf110b1a90a7","application_ids":{"application_id":"halter"},"dev_addr":"01415A3E"},"correlation_ids":["as:downlink:01EQ9VZT44AARKQ3V190WBSXZA","as:up:01EQ9W005A64G2W1Y3GQA9S3SR"],"received_at":"2020-11-17T01:09:37.066774351Z","downlink_failed":{"downlink":{"f_port":1,"f_cnt":56,"frm_payload":"ChQKEgoQEg4IAxIFDbQiy10YASDjAQ==","class_b_c":{"gateways":[{"gateway_ids":{"gateway_id":"eui-00800000a0005314"}}],"absolute_time":"2020-11-17T01:09:38Z"},"priority":"ABOVE_NORMAL","correlation_ids":["as:downlink:01EQ9VZT44AARKQ3V190WBSXZA"]},"error":{"namespace":"pkg/networkserver","name":"absolute_time","message_format":"invalid absolute time set in application downlink","code":3}}}
17/11/2020 14:09:37.068 +1300   Serial 2704aee7-7c77-4c99-8d26-cf110b1a90a7: Receiving DownlinkFailed. Payload: {"end_device_ids":{"device_id":"2704aee7-7c77-4c99-8d26-cf110b1a90a7","application_ids":{"application_id":"halter"},"dev_addr":"01415A3E"},"correlation_ids":["as:downlink:01EQ9VZT44AARKQ3V190WBSXZA","as:up:01EQ9W005A64G2W1Y3GQA9S3SR"],"received_at":"2020-11-17T01:09:37.066774351Z","downlink_failed":{"downlink":{"f_port":1,"f_cnt":56,"frm_payload":"ChQKEgoQEg4IAxIFDbQiy10YASDjAQ==","class_b_c":{"gateways":[{"gateway_ids":{"gateway_id":"eui-00800000a0005314"}}],"absolute_time":"2020-11-17T01:09:38Z"},"priority":"ABOVE_NORMAL","correlation_ids":["as:downlink:01EQ9VZT44AARKQ3V190WBSXZA"]},"error":{"namespace":"pkg/networkserver","name":"absolute_time","message_format":"invalid absolute time set in application downlink","code":3}}}

Что вы хотите увидеть вместо этого?

Отсутствие отказов нисходящего канала и сообщений, исходящих от шлюза

Среда

Стек вещей для LoRaWAN: ttn-lw-stack
Версия: 3.9.4
Дата сборки: 2020-09-23T09: 56: 19Z
Git commit: c4be55c
Версия Go: go1.15.2
ОС / Arch: Linux / amd64

Как вы предлагаете это реализовать?

Определите причины недопустимого абсолютного времени и устраните ошибку

Как вы предлагаете это проверить?

Мы рады протестировать PR в нашей среде разработки

Можете ли вы сделать это самостоятельно и отправить запрос на слияние?

@rvolosatovs ?

bug gateway server

Все 15 Комментарий

@virtualguy, проблема не

Какая скорость передачи данных и в каком регионе вы находитесь?

Когда вы говорите, что хотите передавать с интервалом в 130 мс, учитываете ли вы эфирное время?

Можете ли вы подписаться на события шлюза и конечных устройств с помощью $ ttn-lw-cli events ... и вставить точные сообщения об ошибках, которые сервер шлюза сообщает о причинах сбоя планирования?

@virtualguy Я добавил несколько дополнительных строк отладки. Выберите любой из:

  1. Применить патчvestigate-3487.txt
  2. Выбор вишни https://github.com/TheThingsNetwork/lorawan-stack/commit/f9bbda5db5090dd7eb7bc2d798c92bed82efc2dd
  3. Оформить заказ https://github.com/TheThingsNetwork/lorawan-stack/tree/investigate/3487-abs-downlink-timing (на основе v3.10.7 )

Пожалуйста, введите вывод с помощью команды grep с помощью #3487 и скопируйте сюда. Это также единственный вывод, который попадает в stdout (поскольку журналы идут в stderr ).

Если в ScheduleAt указано, что слишком мало RTT, вы можете увеличить TTN_LW_EXP_RTT_TTL (продолжительность, например 6h на 6 часов, по умолчанию 30m в течение 30 минут) и / или уменьшите TTN_LW_EXP_SCHEDULE_MIN_RTT_COUNT до 3 или чего-то подобного (по умолчанию - 5). Это временные флаги функций.

cc @ymgupta

fyi, у нас возникли проблемы с запущенными двоичными файлами, которые мы создали так, что заблокированы на # 3736, прежде чем мы сможем собрать журналы из вашего патча @johanstokking

@virtualguy @johanstokking Вот несколько журналов запуска исправленной версии: https://gist.github.com/kurtmc/75f4ecf93c2f7a1ee8373d3a9c7f181a

Большое спасибо. Приносим извинения за задержку с ответом.

Это будет очень полезно. Чтобы найти основную причину, я добавил еще несколько записей в журнал.

Можете ли вы запустить это снова с новой сборкой, используя https://github.com/TheThingsNetwork/lorawan-stack/tree/investigate/3487-abs-downlink-timing?

Если вы хотите выбрать Cherry-Pick на v3.10.x, выберите Cherry-Pick 50f56055ba2c0172c002784d0ef22f140b60903c и d1e5305d2363aa8ce8dc485b36c9977857da6b66

Также для вывода мне нужна полная трассировка с самого начала.

Обратите внимание, что сейчас мы печатаем идентификатор шлюза (или EUI). Если это конфиденциальная информация, отредактируйте ее до другого значимого значения или отправьте журнал по электронной почте.

@kurtmc @virtualguy, дайте мне знать, как мы можем помочь в настройке. Если мне нужно отправить вам двоичный файл образа Docker, просто дайте мне знать.

@johanstokking Обновленные журналы: https://gist.github.com/kurtmc/041dd593d24fd9f01784e56ec1deb325

Спасибо @kurtmc. Я не вижу здесь ошибок «нет абсолютного времени», только в начале, но это нормально. Итак, здесь все заработало, как и ожидалось, не так ли?

@adriansmares - здесь действительно происходит гонка, для которой синхронизация фиксирована с https://github.com/TheThingsNetwork/lorawan-stack/pull/3794 . Так что это реально, смотрите:

"1613339916024","15/02/2021 10:58:36.024 +1300","stack_1  | #3487 1 ScheduleAt: median is 30.900256ms"
"1613339916024","15/02/2021 10:58:36.024 +1300","stack_1  | #3487 1 ScheduleAt: median is 30.900256ms"
"1613339916024","15/02/2021 10:58:36.024 +1300","stack_1  | #3487 1 ScheduleAt: relative time downlink"
"1613339916024","15/02/2021 10:58:36.024 +1300","stack_1  | #3487 1 ScheduleAt: relative time downlink"
"1613339916024","15/02/2021 10:58:36.024 +1300","stack_1  | #3487 1 ScheduleAt: scheduled"
"1613339916024","15/02/2021 10:58:36.024 +1300","stack_1  | #3487 1 ScheduleAt: scheduled"
"1613339916024","15/02/2021 10:58:36.024 +1300","stack_1  | #3487 Record: 30.629582ms at 2021-02-14 21:58:36.014795727 +0000 UTC m=+86.734546258"
"1613339916024","15/02/2021 10:58:36.024 +1300","stack_1  | #3487 Stats: sorted items: [{30446978 {13835767378842655859 75767631763 0x3a7a1c0}} {30504816 {13835767372765423622 70132850448 0x3a7a1c0}} {30639590 {13835767387106897922 83515681039 0x3a7a1c0}} {30830194 {13835767336362635015 36237283864 0x3a7a1c0}} {30834436 {13835767341445058316 40950998050 0x3a7a1c0}} {30835582 {13835767336764530097 36639178949 0x3a7a1c0}} {30842181 {13835767341958726238 41464666012 0x3a7a1c0}} {30845267 {13835767320071738555 21052514770 0x3a7a1c0}} {30847416 {13835767323811969378 24571520108 0x3a7a1c0}} {30889585 {13835767369324628633 66913280952 0x3a7a1c0}} {30910927 {13835767324288677194 24974486184 0x3a7a1c0}} {30943729 {13835767344594801745 43879516001 0x3a7a1c0}} {30952793 {13835767349113727476 48103474433 0x3a7a1c0}} {30963569 {13835767326445257112 26983582371 0x3a7a1c0}} {30993783 {13835767329486798315 29803898110 0x3a7a1c0}} {31018584 {13835767328128331563 28592914998 0x3a7a1c0}} {31045641 {13835767318515021603 19643281462 0x3a7a1c0}} {31073394 {13835767334606151403 34628283902 0x3a7a1c0}} {31090774 {13835767382891657128 79595407630 0x3a7a1c0}} {31249183 {13835767338921164328 38648329532 0x3a7a1c0}}]"
"1613339916024","15/02/2021 10:58:36.024 +1300","stack_1  | #3487 Stats: sorted items: [{30446978 {13835767378842655859 75767631763 0x3a7a1c0}} {30504816 {13835767372765423622 70132850448 0x3a7a1c0}} {30639590 {13835767387106897922 83515681039 0x3a7a1c0}} {30830194 {13835767336362635015 36237283864 0x3a7a1c0}} {30834436 {13835767341445058316 40950998050 0x3a7a1c0}} {30835582 {13835767336764530097 36639178949 0x3a7a1c0}} {30842181 {13835767341958726238 41464666012 0x3a7a1c0}} {30845267 {13835767320071738555 21052514770 0x3a7a1c0}} {30847416 {13835767323811969378 24571520108 0x3a7a1c0}} {30889585 {13835767369324628633 66913280952 0x3a7a1c0}} {30910927 {13835767324288677194 24974486184 0x3a7a1c0}} {30943729 {13835767344594801745 43879516001 0x3a7a1c0}} {30952793 {13835767349113727476 48103474433 0x3a7a1c0}} {30963569 {13835767326445257112 26983582371 0x3a7a1c0}} {30993783 {13835767329486798315 29803898110 0x3a7a1c0}} {31018584 {13835767328128331563 28592914998 0x3a7a1c0}} {31045641 {13835767318515021603 19643281462 0x3a7a1c0}} {31073394 {13835767334606151403 34628283902 0x3a7a1c0}} {31090774 {13835767382891657128 79595407630 0x3a7a1c0}} {31249183 {13835767338921164328 38648329532 0x3a7a1c0}}]"

Обратите внимание, что эти операторы не по порядку из-за лежащей в основе промывки; похоже, что короткие операторы немедленно сбрасываются, а более длинные запросы задерживаются.


Я думаю, что проблема в том, что когда (*rtts).Record() освобождает блокировку записи, оба одновременных вызова (*rtts).Stats() получают блокировку чтения, и поэтому два одновременных вызова (*Scheduler).ScheduleAt() становятся точно синхронизированными. Поскольку они получают (другую) блокировку чтения, они происходят одновременно, что приводит к повреждению состояния Scheduler .

Это исправлено с помощью https://github.com/TheThingsNetwork/lorawan-stack/pull/3794.

@kurtmc, есть ли шанс, что мы также сможем получить логи уровня DEBUG из The Things Stack? Установите log.level: debug в конфиге YAML.

@virtualguy @kurtmc, можете ли вы убедиться, что проблема решена в последней v3.11 ?

Обратите внимание на незначительный удар, вам необходимо выполнить миграцию БД, см. Https://github.com/TheThingsNetwork/lorawan-stack/blob/e56f7f70e60dba8c1ad584411fb63a8c35659e7c/CHANGELOG.md#3110 --- 2021-02-10

Сегодня мы выпустим релиз 3.11.1.

Закрыл # 3794

@virtualguy @kurtmc К вашему сведению, мы

@johanstokking Просто чтобы вы знали, мы обновили нашу производственную среду до 3.10.10, и мы все еще видим абсолютную ошибку времени в журналах.

@kurtmc ожидается в следующем случае:

  1. Шлюз не предоставляет временные метки GPS, поэтому на шлюзе нет абсолютного времени, и его необходимо рассчитывать на шлюзе.
  2. Шлюз не передал более 5 сообщений нисходящего канала.
  3. Шлюз не подтвердил более 5 сообщений нисходящего канала (через подтверждение передачи)

Мы используем задержку между планированием сообщения нисходящей линии связи и получением подтверждения передачи в качестве времени приема-передачи. Нам нужно как минимум 5 из них, чтобы надежно взять медианное значение. Затем, при планировании передачи сообщения нисходящей линии связи класса C с абсолютным временем, сервер шлюза использует время сервера и среднее время приема-передачи для вычисления абсолютного (серверного) времени и соответствующей временной метки концентратора.


Если вы все еще видите ошибки абсолютного времени, за исключением случаев, указанных выше, предоставьте журналы сервера уровня DEBUG.

Определенно все еще наблюдается эта проблема в 3.10.10, похоже, что это происходит при последовательной передаче (1000 мсек на одном и том же идентификаторе устройства). Я отправил журналы DEBUG через службу поддержки TTI

Была ли эта страница полезной?
0 / 5 - 0 рейтинги

Смежные вопросы

johanstokking picture johanstokking  ·  8Комментарии

thinkOfaNumber picture thinkOfaNumber  ·  4Комментарии

bafonins picture bafonins  ·  5Комментарии

johanstokking picture johanstokking  ·  5Комментарии

adamsondelacruz picture adamsondelacruz  ·  7Комментарии