qBittorrent BitTorrent client
Find a file
Ivan Sorokin 6dabf50781 Speedup and fix a bug in torrent moving.
This commit implements a map where qbittorrent store a state of
current torrent movings. This commit speed up
torrents moving a bit and also fix a bug when qbittorrent doesn't do
cleanup action when a single torrent is moved several times without
waiting for a previous move to complete.

How it worked before.

Libtorrent has a function torrent_handle::move_storage() that allows to move a
torrent to a specific directory. This function is asynchorous. It means that
this function quits instantaneously and when the actual operation
completes the alert 'storage_moved_alert' or
'storage_moved_failed_alert' will be sent. The storage_moved_alert contains a
torrent_handle and a new path to where the torrent is moved.

During handling of storage_moved_alert, qbittorrent needs not only new path,
but also an old path to perform some of cleanup actions (like removing an old
folder if it is empty). This was achieved by storing a value named
'previous save path' in TorrentPersistentData. A previous save path is
written when move_storage() is issued and is read when
storage_moved_alert is received.

Problems.

This mechanism has two negative aspects:

1. TorrentPersistentData is very slow. As torrent_handle::move_storage() is asynchoronous,
TorrentPersistentData is responsible for more that 99.8% of time
QTorrentHandle::move_storage(). This percent could be higher when there
are lots of torrents and lower when there are few of them.

2. TorrentPersistentData stores only one previous path. But many
move_storage()'s could be issued without waiting for previous to
complete. Subsequent move_storage()'s overwrites previous save path of a
previous move.

A fix.

The fix is simple. Before issueing move_storage() the oldPath is stored in
a special map called 'torrentMoveStates'. When a storage_moved_alert
is received the map is consulted and an alert is handled.

When user moves torrent when previous moving have not yet finished, the
new location is saved in a field 'queuedPath' the same map. When
torrent moving is completed (or failed) qbittorrent attemps to perform
move again to the queued location.

Future direction.

This fix removes one slow read and one slow write to
TorrentPersistentData on torrent moving, but there is still exists
TorrentPersistentData::saveSavePath in handleStorageMovedAlert(), so
overall time for UI hang should be reduced only threefold. A speeding up
TorrentPersistentData should be addressed in a separate commit.

I don't know if I should clean up torrentMoveStates when torrent is
deleted. In any case, torrent could be deleted when corresponding alert
is in alert queue. So if we decide to clean up torrentMoveStates, then
we should not treat receiving alert from unknown torrent as a error.
2014-06-23 11:21:24 +04:00
.tx Update transifex config file. 2013-10-20 20:29:33 +03:00
build-aux Migrate the build system to autotools. 2014-05-04 15:28:58 +03:00
doc Optional daemon-mode for qbittorrent-nox 2012-08-18 17:33:51 +02:00
m4 Migrate the build system to autotools. 2014-05-04 15:28:58 +03:00
src Speedup and fix a bug in torrent moving. 2014-06-23 11:21:24 +04:00
.gitignore Migrate the build system to autotools. 2014-05-04 15:28:58 +03:00
.travis.yml Fix Travis. 2014-05-04 15:31:26 +03:00
AUTHORS Update Translator's info. 2013-10-27 16:07:02 +02:00
bootstrap.sh Migrate the build system to autotools. 2014-05-04 15:28:58 +03:00
Changelog Updated Changelog. 2014-05-04 15:41:47 +03:00
conf.pri.in Migrate the build system to autotools. 2014-05-04 15:28:58 +03:00
configure Support out of srcdir builds. 2014-05-08 00:57:11 +03:00
configure.ac Support out of srcdir builds. 2014-05-08 00:57:11 +03:00
COPYING Remove unprintable 0x0C from license text 2013-02-10 22:46:03 +04:00
INSTALL RSS code clean up 2012-02-20 20:49:31 +02:00
install.os2 OS/2 fixes by Silvan Scherrer 2012-09-20 20:45:53 +03:00
macxconf.pri Use <OS_name>conf.pri file to control libz linkage 2013-03-11 00:04:40 +04:00
NEWS - Moved everything to trunk to create a stable branch 2006-09-30 16:02:39 +00:00
os2conf.pri Use <OS_name>conf.pri file to control libz linkage 2013-03-11 00:04:40 +04:00
qbittorrent.pro Create translations at configure time 2013-01-16 00:21:41 +04:00
qbittorrent.qc Get rid of libnotify dependency (Use DBus instead) 2011-04-02 08:54:28 +00:00
qm_gen.pri Create translations at configure time 2013-01-16 00:21:41 +04:00
README.md Update README file. 2014-05-04 16:28:29 +03:00
README.os2 OS/2 Fixes from Silvan Scherrer 2012-09-06 15:40:50 +03:00
TODO - Updated TODO 2009-07-15 11:02:56 +00:00
unixconf.pri Migrate the build system to autotools. 2014-05-04 15:28:58 +03:00
version.pri Correct version.pri 2013-10-20 13:25:21 +03:00
winconf-mingw.pri Fix linkers errors with AllowSetForegroundWindow function 2013-09-27 14:07:47 +04:00
winconf-msvc.pri Fix linkers errors with AllowSetForegroundWindow function 2013-09-27 14:07:47 +04:00
winconf.pri Don't force stacktrace with mingw 2013-07-28 20:31:01 +04:00

qBittorrent - A BitTorrent client in Qt

Build Status


###Description: qBittorrent is a bittorrent client programmed in C++ / Qt that uses libtorrent (sometimes called libtorrent-rasterbar) by Arvid Norberg.

It aims to be a good alternative to all other bittorrent clients out there. qBittorrent is fast, stable and provides unicode support as well as many features.

This product includes GeoLite data created by MaxMind, available from http://maxmind.com/

Installation:

For installation, follow the instructions from INSTALL file, but simple:

./configure
make && make install
qbittorrent

will install and execute qBittorrent hopefully without any problem.

For more information please visit: http://www.qbittorrent.org

or our wiki here: http://wiki.qbittorrent.org

Please report any bug (or feature request) to: http://bugs.qbittorrent.org

You can also meet me (sledgehammer_999) on IRC: #qbittorrent on irc.freenode.net


sledgehammer999 sledgehammer999@qbittorrent.org