From 2b9f0ae94f9a52c19940f8ce8e8a61af903c5f21 Mon Sep 17 00:00:00 2001 From: Christophe Dumez Date: Mon, 16 Nov 2009 20:37:29 +0000 Subject: [PATCH] - Improve ETA calculation for big torrents - Bump to v1.5.6 --- Changelog | 1 + src/Icons/qBittorrent.desktop | 2 +- src/Icons/skin/splash.png | Bin 77376 -> 77762 bytes src/bittorrent.cpp | 71 +++++++++++++++++++++++++++------- src/bittorrent.h | 7 +++- src/src.pro | 4 +- 6 files changed, 68 insertions(+), 17 deletions(-) diff --git a/Changelog b/Changelog index 1a94355a0..eea393768 100644 --- a/Changelog +++ b/Changelog @@ -3,6 +3,7 @@ - BUGFIX: RSS feed downloader can only process unread articles now - BUGFIX: Fixed memory leak in RSS parser - BUGFIX: Fixed possible crash in search autocompletion + - BUGFIX: Improved ETA calculation for big torrents * Wed Nov 4 2009 - Christophe Dumez - v1.5.5 - BUGFIX: Fixed man page diff --git a/src/Icons/qBittorrent.desktop b/src/Icons/qBittorrent.desktop index 02610abf7..8fd497466 100644 --- a/src/Icons/qBittorrent.desktop +++ b/src/Icons/qBittorrent.desktop @@ -1,6 +1,6 @@ [Desktop Entry] Categories=Qt;Network;P2P; -Comment=V1.5.5 +Comment=V1.5.6 Exec=qbittorrent %f GenericName=Bittorrent client GenericName[bg]=Торент клиент diff --git a/src/Icons/skin/splash.png b/src/Icons/skin/splash.png index 6064e0b43d022ae27bf5482874273e6520a6f37c..5f806cc47d3ebead769d1e66ed1637eb67fa7dd8 100644 GIT binary patch delta 10775 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%0Dv zv3Qm7sZU={4}j-!{gs;%;Qa)12$Z6REEZhSV0$=nSLz-HN;%zmG$7R{3GWg&*s@1K zSFfYMFzs2McyR=ms~8$wU-uCavF+8%toJxPbIeYNzD`=aI|(gW+5!zdj=~q*&`Z8Y z@5Wgp zy^mb?!+K?V^+TQOtJf7U9=COWqD|pCYH+0Q6XlXA)5K7+|G`jPq63tCP9X9TGkbJ9 zs+U7L5g#^R+{1SGTBF4LUorRmgG1gO6mbe}w;PDNDWv19e!DI zRw3;C|Cmw1i`?XgH-K+>+*7T#s8lae>gkp(XYC2Pze2~&~7h7L_cP*mqDN% zjJPAW5*|w%xsZrm-}@g#Dj-ZFns3#4y6CZLZy(wLmcax;mVwBGp1g1IpQn2T&0@9w z^O9T}7g580`a;~+EZKV1@g)prHIs8o=?6=TXc-2rL?2cWu}%zc1jqff`TxT#Y+UN) z^_?s6zkhef|K~oue)->)#Q&KhuVsVwddvJ@YjXeNTIBy_(W^^4xc>5%r`RnPv$xmm Q&Fdp4r7T$?{w?7D03J+V7XSbN delta 10386 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 diff --git a/src/bittorrent.cpp b/src/bittorrent.cpp index 64cd14622..4df1515d1 100644 --- a/src/bittorrent.cpp +++ b/src/bittorrent.cpp @@ -114,6 +114,8 @@ bittorrent::~bittorrent() { delete FSWatcher; delete FSMutex; } + if(timerETA) + delete timerETA; // Delete BT session qDebug("Deleting session"); delete s; @@ -215,21 +217,64 @@ int bittorrent::getUpTorrentPriority(QString hash) const { return h.queue_position(); } -// Calculate the ETA using GASA -// GASA: global Average Speed Algorithm -qlonglong bittorrent::getETA(QString hash) const { - QTorrentHandle h = getTorrentHandle(hash); - if(!h.is_valid()) return -1; - switch(h.state()) { - case torrent_status::downloading: { - if(h.active_time() == 0) - return -1; - double avg_speed = (double)h.all_time_download() / h.active_time(); - return (qlonglong) floor((double) (h.actual_size() - h.total_wanted_done()) / avg_speed); +void bittorrent::takeETASamples() { + bool change = false;; + foreach(const QString &hash, ETA_samples.keys()) { + QTorrentHandle h = getTorrentHandle(hash); + if(h.is_valid() && !h.is_paused() && !h.is_seed()) { + QList samples = ETA_samples.value(h.hash(), QList()); + if(samples.size() >= MAX_SAMPLES) + samples.removeFirst(); + samples.append(h.download_payload_rate()); + ETA_samples[h.hash()] = samples; + change = true; + } else { + ETA_samples.remove(hash); } - default: - return -1; } + if(!change && timerETA) { + delete timerETA; + } +} + +// This algorithm was inspired from KTorrent - http://www.ktorrent.org +// Calculate the ETA using a combination of several algorithms: +// GASA: Global Average Speed Algorithm +// CSA: Current Speed Algorithm +// WINX: Window of X Algorithm +qlonglong bittorrent::getETA(QString hash) { + QTorrentHandle h = getTorrentHandle(hash); + if(!h.is_valid() || h.state() != torrent_status::downloading || !h.active_time()) + return -1; + // See if the torrent is going to be completed soon + qulonglong bytes_left = h.actual_size() - h.total_wanted_done(); + if(h.actual_size() > 10485760L) { // Size > 10MiB + if(h.progress() >= (float)0.99 && bytes_left < 10485760L) { // Progress>99% but less than 10MB left. + // Compute by taking samples + if(!ETA_samples.contains(h.hash())) { + ETA_samples[h.hash()] = QList(); + } + if(!timerETA) { + timerETA = new QTimer(this); + connect(timerETA, SIGNAL(timeout()), this, SLOT(takeETASamples())); + timerETA->start(); + } else { + QList samples = ETA_samples.value(h.hash(), QList()); + int nb_samples = samples.size(); + if(nb_samples > 3) { + long sum_samples = 0; + foreach(int val, samples) { + sum_samples += val; + } + // Use WINX + return (qlonglong)(((double)bytes_left) / (((double)sum_samples) / ((double)nb_samples))); + } + } + } + } + // Normal case: Use GASA + double avg_speed = (double)h.all_time_download() / h.active_time(); + return (qlonglong) floor((double) (bytes_left) / avg_speed); } std::vector bittorrent::getTorrents() const { diff --git a/src/bittorrent.h b/src/bittorrent.h index 7e753adf7..5432cf6d0 100644 --- a/src/bittorrent.h +++ b/src/bittorrent.h @@ -42,6 +42,8 @@ using namespace libtorrent; +#define MAX_SAMPLES 20 + class downloadThread; class QTimer; class QFileSystemWatcher; @@ -77,6 +79,8 @@ class bittorrent : public QObject { bool queueingEnabled; QStringList url_skippingDlg; QHash savepath_fromurl; + QPointer timerETA; + QHash > ETA_samples; protected: QString getSavePath(QString hash); @@ -107,7 +111,7 @@ class bittorrent : public QObject { int loadTorrentPriority(QString hash); QStringList getConsoleMessages() const; QStringList getPeerBanMessages() const; - qlonglong getETA(QString hash) const; + qlonglong getETA(QString hash); bool useTemporaryFolder() const; QString getDefaultSavePath() const; @@ -177,6 +181,7 @@ class bittorrent : public QObject { void readAlerts(); void loadTrackerFile(QString hash); void deleteBigRatios(); + void takeETASamples(); signals: void addedTorrent(QTorrentHandle& h); diff --git a/src/src.pro b/src/src.pro index f9ed8f4c7..e327b2070 100644 --- a/src/src.pro +++ b/src/src.pro @@ -14,10 +14,10 @@ CONFIG += qt \ network # Update this VERSION for each release -DEFINES += VERSION=\\\"v1.5.5\\\" +DEFINES += VERSION=\\\"v1.5.6\\\" DEFINES += VERSION_MAJOR=1 DEFINES += VERSION_MINOR=5 -DEFINES += VERSION_BUGFIX=5 +DEFINES += VERSION_BUGFIX=6 !mac:QMAKE_LFLAGS += -Wl,--as-needed contains(DEBUG_MODE, 1) { CONFIG += debug