summaryrefslogtreecommitdiffstats
path: root/src/libs/installer/metadatajob.cpp
diff options
context:
space:
mode:
authorKatja Marttila <katja.marttila@qt.io>2018-03-28 11:46:38 +0300
committerKatja Marttila <katja.marttila@qt.io>2018-04-03 06:57:06 +0000
commit64a23f240f7a90ae5863ef3d37497e57ae6e8c09 (patch)
treed4d710d51d8e67a6d75e5869d10e569999f4e32b /src/libs/installer/metadatajob.cpp
parent6f28abfa588d36076ad24f39a17d6752fd070ab6 (diff)
Fix install fail if there is huge amount of downloadable packages
In some machines, installer does not manage to download meta files if there are huge amount of downloadable packages. It seems that QtConcurrent is not always able to handle so many download tasks. Divided the downloadable tasks into size of 1000 to keep the QtConcurrent running. Change-Id: I3ba110e2cc565251e540349a6b073245280a6fbe Reviewed-by: Ville Voutilainen <ville.voutilainen@qt.io>
Diffstat (limited to 'src/libs/installer/metadatajob.cpp')
-rw-r--r--src/libs/installer/metadatajob.cpp66
1 files changed, 46 insertions, 20 deletions
diff --git a/src/libs/installer/metadatajob.cpp b/src/libs/installer/metadatajob.cpp
index 0c674e313..9e1e9f5a6 100644
--- a/src/libs/installer/metadatajob.cpp
+++ b/src/libs/installer/metadatajob.cpp
@@ -52,6 +52,8 @@ MetadataJob::MetadataJob(QObject *parent)
: Job(parent)
, m_core(0)
, m_addCompressedPackages(false)
+ , m_downloadableChunkSize(1000)
+ , m_taskNumber(0)
{
setCapabilities(Cancelable);
connect(&m_xmlTask, &QFutureWatcherBase::finished, this, &MetadataJob::xmlTaskFinished);
@@ -325,12 +327,7 @@ void MetadataJob::xmlTaskFinished()
return;
if (status == XmlDownloadSuccess) {
- setProcessedAmount(0);
- DownloadFileTask *const metadataTask = new DownloadFileTask(m_packages);
- metadataTask->setProxyFactory(m_core->proxyFactory());
- m_metadataTask.setFuture(QtConcurrent::run(&DownloadFileTask::doTask, metadataTask));
- setProgressTotalAmount(100);
- emit infoMessage(this, tr("Retrieving meta information from remote repository..."));
+ fetchMetaDataPackages();
} else if (status == XmlDownloadRetry) {
QMetaObject::invokeMethod(this, "doStart", Qt::QueuedConnection);
} else {
@@ -379,21 +376,23 @@ void MetadataJob::metadataTaskFinished()
{
try {
m_metadataTask.waitForFinished();
- QFuture<FileTaskResult> future = m_metadataTask.future();
- if (future.resultCount() > 0) {
- emit infoMessage(this, tr("Extracting meta information..."));
- foreach (const FileTaskResult &result, future.results()) {
- const FileTaskItem item = result.value(TaskRole::TaskItem).value<FileTaskItem>();
- UnzipArchiveTask *task = new UnzipArchiveTask(result.target(),
- item.value(TaskRole::UserRole).toString());
-
- QFutureWatcher<void> *watcher = new QFutureWatcher<void>();
- m_unzipTasks.insert(watcher, qobject_cast<QObject*> (task));
- connect(watcher, &QFutureWatcherBase::finished, this, &MetadataJob::unzipTaskFinished);
- watcher->setFuture(QtConcurrent::run(&UnzipArchiveTask::doTask, task));
+ m_metadataResult.append(m_metadataTask.future().results());
+ if (!fetchMetaDataPackages()) {
+ if (m_metadataResult.count() > 0) {
+ emit infoMessage(this, tr("Extracting meta information..."));
+ foreach (const FileTaskResult &result, m_metadataResult) {
+ const FileTaskItem item = result.value(TaskRole::TaskItem).value<FileTaskItem>();
+ UnzipArchiveTask *task = new UnzipArchiveTask(result.target(),
+ item.value(TaskRole::UserRole).toString());
+
+ QFutureWatcher<void> *watcher = new QFutureWatcher<void>();
+ m_unzipTasks.insert(watcher, qobject_cast<QObject*> (task));
+ connect(watcher, &QFutureWatcherBase::finished, this, &MetadataJob::unzipTaskFinished);
+ watcher->setFuture(QtConcurrent::run(&UnzipArchiveTask::doTask, task));
+ }
+ } else {
+ emitFinished();
}
- } else {
- emitFinished();
}
} catch (const TaskException &e) {
reset();
@@ -410,6 +409,30 @@ void MetadataJob::metadataTaskFinished()
// -- private
+bool MetadataJob::fetchMetaDataPackages()
+{
+ //Download files in chunks. QtConcurrent will choke if too many task is given to it
+ int chunkSize = qMin(m_packages.length(), m_downloadableChunkSize);
+ QList<FileTaskItem> tempPackages = m_packages.mid(0, chunkSize);
+ m_packages = m_packages.mid(chunkSize, m_packages.length());
+ if (tempPackages.length() > 0) {
+ m_taskNumber++;
+ setProcessedAmount(0);
+ DownloadFileTask *const metadataTask = new DownloadFileTask(tempPackages);
+ metadataTask->setProxyFactory(m_core->proxyFactory());
+ m_metadataTask.setFuture(QtConcurrent::run(&DownloadFileTask::doTask, metadataTask));
+ setProgressTotalAmount(100);
+ QString metaInformation;
+ if (m_totalTaskCount > 1)
+ metaInformation = tr("Retrieving meta information from remote repository... %1/%2 ").arg(m_taskNumber).arg(m_totalTaskCount);
+ else
+ metaInformation = tr("Retrieving meta information from remote repository... ");
+ emit infoMessage(this, metaInformation);
+ return true;
+ }
+ return false;
+}
+
void MetadataJob::reset()
{
m_packages.clear();
@@ -615,6 +638,9 @@ MetadataJob::Status MetadataJob::parseUpdatesXml(const QList<FileTaskResult> &re
}
}
}
+ double taskCount = m_packages.length()/static_cast<double>(m_downloadableChunkSize);
+ m_totalTaskCount = ceil(taskCount);
+
return XmlDownloadSuccess;
}