From 6cd233dd61b75e32917b4e8395abf0cad0f3f953 Mon Sep 17 00:00:00 2001 From: Eugene Shalygin Date: Wed, 18 Jan 2017 17:17:51 +0100 Subject: [PATCH 1/2] Add queue repair code This is a bit adjusted code created by nxd4, who shared it in issue disappearing). --- src/base/bittorrent/session.cpp | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/src/base/bittorrent/session.cpp b/src/base/bittorrent/session.cpp index 6ef664e6f..3c3716a78 100644 --- a/src/base/bittorrent/session.cpp +++ b/src/base/bittorrent/session.cpp @@ -3077,6 +3077,7 @@ void Session::startUpTorrents() // Resume downloads QMap queuedResumeData; int nextQueuePosition = 1; + int numOfRemappedFiles = 0; QRegExp rx(QLatin1String("^([A-Fa-f0-9]{40})\\.fastresume$")); foreach (const QString &fastresumeName, fastresumes) { if (rx.indexIn(fastresumeName) == -1) continue; @@ -3100,11 +3101,23 @@ void Session::startUpTorrents() } } else { - queuedResumeData[queuePosition] = { hash, magnetUri, resumeData, data }; + int q = queuePosition; + for(; queuedResumeData.contains(q); ++q) { + } + if (q != queuePosition) { + ++numOfRemappedFiles; + } + queuedResumeData[q] = { hash, magnetUri, resumeData, data }; } } } + if (numOfRemappedFiles > 0) { + logger->addMessage( + QString(tr("Queue positions were corrected in %1 resume files")).arg(numOfRemappedFiles), + Log::CRITICAL); + } + // starting up downloading torrents (queue position > 0) foreach (const TorrentResumeData &torrentResumeData, queuedResumeData) startupTorrent(torrentResumeData); From b6e64c13d8b2ea7535b593560b6d3a3372701455 Mon Sep 17 00:00:00 2001 From: Eugene Shalygin Date: Wed, 18 Jan 2017 17:23:57 +0100 Subject: [PATCH 2/2] Fetch torrent status when generating final fastresume data This is done to get correct queue position, which has to be written into the fastresume file. See discussion in #6154. --- src/base/bittorrent/session.cpp | 6 +++--- src/base/bittorrent/session.h | 2 +- src/base/bittorrent/torrenthandle.cpp | 5 ++++- src/base/bittorrent/torrenthandle.h | 2 +- 4 files changed, 9 insertions(+), 6 deletions(-) diff --git a/src/base/bittorrent/session.cpp b/src/base/bittorrent/session.cpp index 3c3716a78..0885819a0 100644 --- a/src/base/bittorrent/session.cpp +++ b/src/base/bittorrent/session.cpp @@ -1858,7 +1858,7 @@ void Session::generateResumeData(bool final) if (torrent->isChecking() || torrent->hasError()) continue; if (!final && !torrent->needSaveResumeData()) continue; - saveTorrentResumeData(torrent); + saveTorrentResumeData(torrent, final); qDebug("Saving fastresume data for %s", qPrintable(torrent->name())); } } @@ -2782,9 +2782,9 @@ void Session::handleTorrentRatioLimitChanged(TorrentHandle *const torrent) updateRatioTimer(); } -void Session::saveTorrentResumeData(TorrentHandle *const torrent) +void Session::saveTorrentResumeData(TorrentHandle *const torrent, bool finalSave) { - torrent->saveResumeData(); + torrent->saveResumeData(finalSave); ++m_numResumeData; } diff --git a/src/base/bittorrent/session.h b/src/base/bittorrent/session.h index 0ec3dc038..32ccbec11 100644 --- a/src/base/bittorrent/session.h +++ b/src/base/bittorrent/session.h @@ -467,7 +467,7 @@ namespace BitTorrent void updateRatioTimer(); void exportTorrentFile(TorrentHandle *const torrent, TorrentExportFolder folder = TorrentExportFolder::Regular); - void saveTorrentResumeData(TorrentHandle *const torrent); + void saveTorrentResumeData(TorrentHandle *const torrent, bool finalSave = false); void handleAlert(libtorrent::alert *a); void dispatchTorrentAlert(libtorrent::alert *a); diff --git a/src/base/bittorrent/torrenthandle.cpp b/src/base/bittorrent/torrenthandle.cpp index b03bf90af..6e6dfafbd 100644 --- a/src/base/bittorrent/torrenthandle.cpp +++ b/src/base/bittorrent/torrenthandle.cpp @@ -485,8 +485,11 @@ bool TorrentHandle::needSaveResumeData() const SAFE_RETURN(bool, need_save_resume_data, false); } -void TorrentHandle::saveResumeData() +void TorrentHandle::saveResumeData(bool updateStatus) { + if (updateStatus) // to update queue_position, see discussion in PR #6154 + this->updateStatus(); + SAFE_CALL(save_resume_data); m_needSaveResumeData = false; } diff --git a/src/base/bittorrent/torrenthandle.h b/src/base/bittorrent/torrenthandle.h index aad66f001..a0837d09f 100644 --- a/src/base/bittorrent/torrenthandle.h +++ b/src/base/bittorrent/torrenthandle.h @@ -351,7 +351,7 @@ namespace BitTorrent void handleTempPathChanged(); void handleCategorySavePathChanged(); void handleAppendExtensionToggled(); - void saveResumeData(); + void saveResumeData(bool updateStatus = false); private: typedef boost::function EventTrigger;