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, то есть при разрыве соединения не делается попытка возобновить передачу. Поэтому предлагаю сосредоточиться на первой части проблемы.
Не очень понятно, по какому критерию принимать решение об "отбрасывании" данных для соединения, не готового к их приему. Один из вариантов, который пришел мне в голову, такой: если буфер заполнен данными, но при этом часть данных уже передана хотя бы в одно из соединений, то новые данные из последовательного порта принимаются (но не больше уже переданной части буфера), из "головы" буфера удаляются данные, размером с вновь полученный фрагмент (при этом те соединения, которые из еще не получили, эти данные потеряют), а вновь прочитанные из порта данные добавляются в "хвост" буфера. Таким образом, полная остановка потока произойдет только в случае, если все клиентские соединения не готовы к приему новых данных.
Прошу высказать критику данного варианта и/или предложить альтернативные варианты решения.