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. К серверу подключены клиент1 и клиент2
  2. с клиентом1 потерялась связь, но подключение всё ещё присутствует
  3. пока связи с клиентом1 нет, буфер заполняется данными предназначемыми для передачи клиенту1
  4. Буфер заполнился доверху, новые данные не принимаются

В результате получили неприятную ситуацию: клиент2 не получает данные, хотя связь с сервером у него есть.

А дальше хуже, после того как подключение к клиенту1 протухло, клиент2 по прежнему не может получать данные, т.к. буфер всё ещё заполнен данными предназначавшимися для клиента1. В результате получили полный отказ системы.
Думаю что это серьезная проблема и надо с этим что-то делать.

Change History (9)

comment:1 by san, 6 years ago

Priority: majorcritical

in reply to:  description comment:2 by alx, 6 years ago

Replying to san:

Думаю что это серьезная проблема и надо с этим что-то делать.

Согласен.

По поводу второй части (невозобновления передачи после разрыва соединения) - уверен, что это тривиальный баг, подобный исправленному в r91, то есть при разрыве соединения не делается попытка возобновить передачу. Поэтому предлагаю сосредоточиться на первой части проблемы.

Не очень понятно, по какому критерию принимать решение об "отбрасывании" данных для соединения, не готового к их приему. Один из вариантов, который пришел мне в голову, такой: если буфер заполнен данными, но при этом часть данных уже передана хотя бы в одно из соединений, то новые данные из последовательного порта принимаются (но не больше уже переданной части буфера), из "головы" буфера удаляются данные, размером с вновь полученный фрагмент (при этом те соединения, которые из еще не получили, эти данные потеряют), а вновь прочитанные из порта данные добавляются в "хвост" буфера. Таким образом, полная остановка потока произойдет только в случае, если все клиентские соединения не готовы к приему новых данных.

Прошу высказать критику данного варианта и/или предложить альтернативные варианты решения.

Version 1, edited 6 years ago by alx (previous) (next) (diff)

comment:3 by Director, 6 years ago

Priority: criticalblocker

comment:4 by san, 6 years ago

Прошу высказать критику данного варианта

На мой взгляд это разумный вариант, чего-то более подходящего придумать не могу.

comment:5 by alx, 6 years ago

In 99/smartCrypto:

При отключении клиента от сервера сетве делает попытку возобновления передачи
в оставшиеся соединения. See #21.

comment:6 by alx, 6 years ago

Чтобы не забыть: тест экспериментальной реализации предложенного алгоритма показал, что при неготовности к приему всех клиентов (2 из 2) данные из последовательного порта продолжают приниматься.

comment:7 by alx, 6 years ago

In 102/smartCrypto:

Реализован алгоритм с ротацией данных в буфере, не позволяющий одному
"мертвому" соединению блокировать передачу данных всем остальным.
See #21.

comment:8 by alx, 6 years ago

Тест показал, что при наличии одного соединения, не готового к приему, при заполнении буфера прием из последовательного порта прекращается. То есть все работает правильно.

comment:9 by alx, 6 years ago

Resolution: fixed
Status: newclosed

Думаю, что тикет можно закрыть: описанная в нем проблема решена.

Note: See TracTickets for help on using tickets.