This commit is contained in:
Dmitry Zuikov 2023-02-27 06:19:39 +03:00
parent 98a0ab8db5
commit 9a758eaa22
2 changed files with 58 additions and 6 deletions

View File

@ -1,4 +1,61 @@
## 2023-02-27
В целом ясно, что нужно пересмотреть работу с очередью:
скачивание огромных объемов при небольшом количестве
пиров забивает её целиком, и другие каналы не будут
синхронизированы, пока не будет выкачан большой объем
данных. Это дорога к DDoS атаке и полной остановке
сервиса --- можно рассылать огромные файлы и забивать
очередь. Для борьбы с этим, кажется, необходима либо
рандомизация очереди (как?), либо введение приоритетной
очереди, и приоритет ставить в обратную зависимость от
глубины (высоты) дерева и размера merkle-tree блока,
либо же понижение приоритета выкачивания для "больших"
пакетов.
Вместе с тем, нам очевидно, нужен мониторинг скачивания
референса/блока.
Какое видится решение:
Отдельная очередь на каждый fetch/announce. Качаем,
порциями забрасывая пакеты в общую очередь и запоминая,
что забросили. На каждый скачанный блок мы подписываемся
на уведомление, кроме того, вешаем монитор.
По уведомлению --- вычеркиваем блок.
По монитору --- проверяем, сколько блоков осталось.
Можно при анонсе/фетче парсить пришедший блок и
запоминать число невыкачанных блоков. Тогда
при каждом событии, что блок скачан - мы уменьшаем
это число, что даёт нам возможность мониторить прогресс.
Когда это число достигает 0, мы запускаем процессинг опять,
удостовериваемся, что всё выкачано и если да --- то можем
уведомить о том, что блок скачан (и удаляем процесс).
FIXME: e5bd-download-stuck-on-big-volumes
Скачивание затыкается при большом объеме передаваемых
данных и длительном времени работы, т.е на медленном канале.
с чем конкретно это связано, пока что непонятно.
Кажется, что это может быть связано с потерей пакетов, т.е
очередь на скачивание пустеет, тогда как блоки еще не выкачаны.
Необходимо проверить это в первую очередь.
1. Пока нет счётчиков, добавить trace в цикл работы с очередью
2. Добавить debug на размер очереди (пустая/не пустая)
Возможно, происходящее связано с неатомарностью обновления
счётчиков/wip и самой очереди, хотя то, что закачка фактически
прекращается, а данные очевидно не выкачаны --- говорит нам
о потере самих блоков для скачивания. Куда они могут теряться
в принципе? Есть место в алгоритме, где блоки не возвращаются
в очередь?
## 2023-02-26
TODO: block-shuffle

View File

@ -285,7 +285,7 @@ addDownload h = do
notPostponed <- liftIO $ readTVarIO po <&> isNothing . HashMap.lookup h
if (doAdd && notPostponed && notHere) then do
when (doAdd && notPostponed && notHere) do
q <- asks (view downloadQ)
wip <- asks (view blockWip)
@ -296,11 +296,6 @@ addDownload h = do
writeTQueue q h
Cache.insert wip h ()
else do
-- FIXME: wtf?
po <- asks (view peerPostponed)
liftIO $ atomically $ do
modifyTVar po $ HashMap.insert h ()
-- | False -> do -- not hasSize -> do