Optimize Session::startupTorrents()

Reduce queue size by starting up initial items (torrents) when they are detected
This commit is contained in:
Vladimir Golovnev (qlassez) 2015-12-17 16:47:34 +03:00 committed by Vladimir Golovnev (Glassez)
commit 245f424014

View file

@ -1898,7 +1898,6 @@ void Session::startUpTorrents()
QStringList fastresumes = resumeDataDir.entryList( QStringList fastresumes = resumeDataDir.entryList(
QStringList(QLatin1String("*.fastresume")), QDir::Files, QDir::Unsorted); QStringList(QLatin1String("*.fastresume")), QDir::Files, QDir::Unsorted);
QString filePath;
Logger *const logger = Logger::instance(); Logger *const logger = Logger::instance();
typedef struct typedef struct
@ -1909,28 +1908,41 @@ void Session::startUpTorrents()
QByteArray data; QByteArray data;
} TorrentResumeData; } TorrentResumeData;
auto startupTorrent = [this, logger, resumeDataDir](const TorrentResumeData &params)
{
QString filePath = resumeDataDir.filePath(QString("%1.torrent").arg(params.hash));
qDebug() << "Starting up torrent" << params.hash << "...";
if (!addTorrent_impl(params.addTorrentData, params.magnetUri, TorrentInfo::loadFromFile(filePath), params.data))
logger->addMessage(tr("Unable to resume torrent '%1'.", "e.g: Unable to resume torrent 'hash'.")
.arg(params.hash), Log::CRITICAL);
};
qDebug("Starting up torrents"); qDebug("Starting up torrents");
qDebug("Queue size: %d", fastresumes.size()); qDebug("Queue size: %d", fastresumes.size());
// Resume downloads // Resume downloads
QMap<int, TorrentResumeData> queuedResumeData; QMap<int, TorrentResumeData> queuedResumeData;
int nextQueuePosition = 1;
QRegExp rx(QLatin1String("^([A-Fa-f0-9]{40})\\.fastresume$")); QRegExp rx(QLatin1String("^([A-Fa-f0-9]{40})\\.fastresume$"));
foreach (const QString &fastresumeName, fastresumes) { foreach (const QString &fastresumeName, fastresumes) {
if (rx.indexIn(fastresumeName) == -1) continue; if (rx.indexIn(fastresumeName) == -1) continue;
QString hash = rx.cap(1); QString hash = rx.cap(1);
QString fastresumePath = QString fastresumePath = resumeDataDir.absoluteFilePath(fastresumeName);
resumeDataDir.absoluteFilePath(fastresumeName);
QByteArray data; QByteArray data;
AddTorrentData resumeData; AddTorrentData resumeData;
MagnetUri magnetUri; MagnetUri magnetUri;
int queuePosition; int queuePosition;
if (readFile(fastresumePath, data) && loadTorrentResumeData(data, resumeData, queuePosition, magnetUri)) { if (readFile(fastresumePath, data) && loadTorrentResumeData(data, resumeData, queuePosition, magnetUri)) {
if (queuePosition == 0) { if (queuePosition <= nextQueuePosition) {
filePath = resumeDataDir.filePath(QString("%1.torrent").arg(hash)); startupTorrent({ hash, magnetUri, resumeData, data });
qDebug("Starting up torrent %s ...", qPrintable(hash));
if (!addTorrent_impl(resumeData, magnetUri, TorrentInfo::loadFromFile(filePath), data)) if (queuePosition == nextQueuePosition) {
logger->addMessage(tr("Unable to resume torrent '%1'.", "e.g: Unable to resume torrent 'hash'.") ++nextQueuePosition;
.arg(hash), Log::CRITICAL); while (queuedResumeData.contains(nextQueuePosition)) {
startupTorrent(queuedResumeData.take(nextQueuePosition));
++nextQueuePosition;
}
}
} }
else { else {
queuedResumeData[queuePosition] = { hash, magnetUri, resumeData, data }; queuedResumeData[queuePosition] = { hash, magnetUri, resumeData, data };
@ -1939,13 +1951,8 @@ void Session::startUpTorrents()
} }
// starting up downloading torrents (queue position > 0) // starting up downloading torrents (queue position > 0)
foreach (const TorrentResumeData &torrentResumeData, queuedResumeData) { foreach (const TorrentResumeData &torrentResumeData, queuedResumeData)
filePath = resumeDataDir.filePath(QString("%1.torrent").arg(torrentResumeData.hash)); startupTorrent(torrentResumeData);
qDebug("Starting up torrent %s ...", qPrintable(torrentResumeData.hash));
if (!addTorrent_impl(torrentResumeData.addTorrentData, torrentResumeData.magnetUri, TorrentInfo::loadFromFile(filePath), torrentResumeData.data))
logger->addMessage(tr("Unable to resume torrent '%1'.", "e.g: Unable to resume torrent 'hash'.")
.arg(torrentResumeData.hash), Log::CRITICAL);
}
} }
quint64 Session::getAlltimeDL() const quint64 Session::getAlltimeDL() const