From 02a027144bb6064380195a3dcdf00eec29c80e61 Mon Sep 17 00:00:00 2001 From: sledgehammer999 Date: Mon, 23 Dec 2019 00:28:00 +0200 Subject: [PATCH] Tracker is errored only if all local endpoints fail Closes #11691 --- src/base/bittorrent/torrenthandle.cpp | 12 +++++++++++- src/base/bittorrent/trackerentry.cpp | 10 ++++++---- 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/src/base/bittorrent/torrenthandle.cpp b/src/base/bittorrent/torrenthandle.cpp index 823bf5077..247a55220 100644 --- a/src/base/bittorrent/torrenthandle.cpp +++ b/src/base/bittorrent/torrenthandle.cpp @@ -1693,7 +1693,17 @@ void TorrentHandle::handleTrackerErrorAlert(const lt::tracker_error_alert *p) m_trackerInfos[trackerUrl].lastMessage = message; - m_session->handleTorrentTrackerError(this, trackerUrl); + // Starting with libtorrent 1.2.x each tracker has multiple local endpoints from which + // an announce is attempted. Some endpoints might succeed while others might fail. + // Emit the signal only if all endpoints have failed. TrackerEntry::isWorking() returns + // true if at least one endpoint works. + const QVector trackerList = trackers(); + const auto iter = std::find_if(trackerList.cbegin(), trackerList.cend(), [&trackerUrl](const TrackerEntry &entry) + { + return (entry.url() == trackerUrl); + }); + if ((iter != trackerList.cend()) && !iter->isWorking()) + m_session->handleTorrentTrackerError(this, trackerUrl); } void TorrentHandle::handleTorrentCheckedAlert(const lt::torrent_checked_alert *p) diff --git a/src/base/bittorrent/trackerentry.cpp b/src/base/bittorrent/trackerentry.cpp index 3fc809197..ca13b059a 100644 --- a/src/base/bittorrent/trackerentry.cpp +++ b/src/base/bittorrent/trackerentry.cpp @@ -54,9 +54,13 @@ QString TrackerEntry::url() const bool TrackerEntry::isWorking() const { + // lt::announce_entry::is_working() returns + // true when the tracker hasn't been tried yet. #if (LIBTORRENT_VERSION_NUM < 10200) - return nativeEntry().is_working(); + return nativeEntry().verified && nativeEntry().is_working(); #else + if (!nativeEntry().verified) + return false; const auto &endpoints = nativeEntry().endpoints; return std::any_of(endpoints.begin(), endpoints.end() , [](const lt::announce_endpoint &endpoint) @@ -73,9 +77,7 @@ int TrackerEntry::tier() const TrackerEntry::Status TrackerEntry::status() const { - // lt::announce_entry::is_working() returns - // true when the tracker hasn't been tried yet. - if (nativeEntry().verified && isWorking()) + if (isWorking()) return Working; #if (LIBTORRENT_VERSION_NUM < 10200)