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 0, edited 6 years ago by alx (next)

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.