From 2299580dc92577c4b7754f2f3a1693f68cab9553 Mon Sep 17 00:00:00 2001 From: Chocobo1 Date: Fri, 12 Jun 2015 16:18:28 +0800 Subject: [PATCH] Improve ratio calculation formula. Closes #3096. --- src/core/bittorrent/torrenthandle.cpp | 31 +++++++-------------------- 1 file changed, 8 insertions(+), 23 deletions(-) diff --git a/src/core/bittorrent/torrenthandle.cpp b/src/core/bittorrent/torrenthandle.cpp index 9b77f0f13..a1168f95f 100644 --- a/src/core/bittorrent/torrenthandle.cpp +++ b/src/core/bittorrent/torrenthandle.cpp @@ -1031,31 +1031,16 @@ qreal TorrentHandle::maxRatio(bool *usesGlobalRatio) const qreal TorrentHandle::realRatio() const { - libt::size_type all_time_upload = m_nativeStatus.all_time_upload; - libt::size_type all_time_download = m_nativeStatus.all_time_download; - libt::size_type total_done = m_nativeStatus.total_done; + libt::size_type upload = m_nativeStatus.all_time_upload; + // special case for a seeder who lost its stats, also assume nobody will import a 99% done torrent + libt::size_type download = (m_nativeStatus.all_time_download < m_nativeStatus.total_done * 0.01) ? m_nativeStatus.total_done : m_nativeStatus.all_time_download; - if (all_time_download < total_done) { - // We have more data on disk than we downloaded - // either because the user imported the file - // or because of crash the download history was lost. - // Otherwise will get weird ratios - // eg when downloaded 1KB and uploaded 700MB of a - // 700MB torrent. - all_time_download = total_done; - } - - if (all_time_download == 0) { - if (all_time_upload == 0) return 0.0; - else return MAX_RATIO + 1; - } - - qreal ratio = all_time_upload / static_cast(all_time_download); - Q_ASSERT(ratio >= 0.); - if (ratio > MAX_RATIO) - ratio = MAX_RATIO; + if (download == 0) + return (upload == 0) ? 0.0 : MAX_RATIO; - return ratio; + qreal ratio = upload / static_cast(download); + Q_ASSERT(ratio >= 0.0); + return (ratio > MAX_RATIO) ? MAX_RATIO : ratio; } int TorrentHandle::uploadPayloadRate() const