Opened 6 years ago
Closed 6 years ago
#21 closed улучшение (fixed)
При отсутствии связи с клиентом1 данные клиенту2 не передаются
Reported by: | san | Owned by: | |
---|---|---|---|
Priority: | blocker | Milestone: | 1 очередь |
Keywords: | Cc: |
Description
- К серверу подключены клиент1 и клиент2
- с клиентом1 потерялась связь, но подключение всё ещё присутствует
- пока связи с клиентом1 нет, буфер заполняется данными предназначемыми для передачи клиенту1
- Буфер заполнился доверху, новые данные не принимаются
В результате получили неприятную ситуацию: клиент2 не получает данные, хотя связь с сервером у него есть.
А дальше хуже, после того как подключение к клиенту1 протухло, клиент2 по прежнему не может получать данные, т.к. буфер всё ещё заполнен данными предназначавшимися для клиента1. В результате получили полный отказ системы.
Думаю что это серьезная проблема и надо с этим что-то делать.
Change History (9)
comment:1 by , 6 years ago
Priority: | major → critical |
---|
comment:3 by , 6 years ago
Priority: | critical → blocker |
---|
comment:4 by , 6 years ago
Прошу высказать критику данного варианта
На мой взгляд это разумный вариант, чего-то более подходящего придумать не могу.
comment:6 by , 6 years ago
Чтобы не забыть: тест экспериментальной реализации предложенного алгоритма показал, что при неготовности к приему всех клиентов (2 из 2) данные из последовательного порта продолжают приниматься.
comment:8 by , 6 years ago
Тест показал, что при наличии одного соединения, не готового к приему, при заполнении буфера прием из последовательного порта прекращается. То есть все работает правильно.
comment:9 by , 6 years ago
Resolution: | → fixed |
---|---|
Status: | new → closed |
Думаю, что тикет можно закрыть: описанная в нем проблема решена.
Replying to san:
Согласен.
По поводу второй части (невозобновления передачи после разрыва соединения) - уверен, что это тривиальный баг, подобный исправленному в r91, то есть при разрыве соединения просто ничего не делается. Поэтому предлагаю сосредоточиться на первой части проблемы.
Не очень понятно, по какому критерию принимать решение об "отбрасывании" данных для соединения, не готового к их приему. Один из вариантов, который пришел мне в голову, такой: если буфер заполнен данными, но при этом часть данных уже передана хотя бы в одно из соединений, то новые данные из последовательного порта принимаются (но не больше уже переданной части буфера), из "головы" буфера удаляются данные, размером с вновь полученный фрагмент (при этом те соединения, которые из еще не получили, эти данные потеряют), а вновь прочитанные из порта данные добавляются в "хвост" буфера. Таким образом, полная остановка потока произойдет только в случае, если все клиентские соединения не готовы к приему новых данных.
Прошу высказать критику данного варианта и/или предложить альтернативные варианты решения.