вторник, 10 декабря 2013 г.

Последовательная закачка в rtorrent

Сегодня вычеркнул еще один пункт из TODO-листа, а именно - пересобрал libtorrent чтобы rtorrent качал файлы последовательно (sequential download).
Это оказалось не так сложно, благо найденную когда то ссылку на патчи я себе сразу сохранил, только ссылка оказалась мертвой, но тут мне помог web.archive.org
http://web.archive.org/web/20100917225805/http://libtorrent.rakshasa.no/ticket/2307
У меня как раз текущая версия libtorrent 0.12.6, какая удача!
Файлик надо поправить всего один и всего в 2 местах.
В общем качаем исходник libtorrent, правим файлик, собираем, ставим

$ cd /usr/local/src
$ aptitude update
$ aptitude build-dep libtorrent
$ apt-get source libtorrent
$ cd libtorrent-0.12.6/
$ tar -xvzf libtorrent-0.12.6.tar.gz

# далее правка исходника src/download/chunk_selector.cc (наложение патча руками)
# затем сборка
$ dpkg-buildpackage -rfakeroot -uc -b

# сгенерилось 2 файла 
# libtorrent11_0.12.6-2_amd64.deb
# libtorrent-dev_0.12.6-2_amd64.deb
# ставим
$ dpkg -i libtorrent11_0.12.6-2_amd64.deb

перезапустил rtorrent, скачал пробный файл
Данное изображение показывает, что торрент-клиент теперь качает файл последовательно.

SOLVED


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

Использованные материалы
http://www.debian.org/doc/manuals/apt-howto/ch-sourcehandling.en.html

на всякий случай содержимое патча
Index: chunk_selector.cc
===================================================================
--- chunk_selector.cc (revision 1171)
+++ chunk_selector.cc (working copy)
@@ -79,7 +79,7 @@
  m_sharedQueue.clear();
  if (m_position == invalid_chunk)
-    m_position = random() % size();
+    m_position = 0;
  advance_position();
}
@@ -97,14 +97,6 @@
  // set.
  rak::partial_queue* queue = pc->is_seeder() ? &m_sharedQueue : pc->download_cache();
-  // Randomize position on average every 16 chunks to prevent
-  // inefficient distribution with a slow seed and fast peers
-  // all arriving at the same position.
-  if ((random() & 63) == 0) {
-    m_position = random() % size();
-    queue->clear();
-  }
-
  if (queue->is_enabled()) {
    // First check the cached queue.
upd: для uTorrent на хабре нашлась старая статья http://habrahabr.ru/post/87632/
upd2: исходники разных версий libtorrent и rtorrent http://rtorrent.net/downloads/

Комментариев нет:

Отправить комментарий