From 4bb90910970725371d5e91e2493269ef1628e61e Mon Sep 17 00:00:00 2001 From: Katja Marttila Date: Mon, 27 Feb 2023 15:34:22 +0200 Subject: Optimize Updates.xml parsing Updates.xml was downloaded first to TEMP/MaintenanceTool.xml and from there renamed to TEMP/remoterepo-XXXXX/Updates.xml. This is quite time consuming operation in Windows. Fixed so that the Updates.xml is downloaded directly to TEMP/remoterepo-XXXXX. This change speeds up Updates.xml parsing around 70 percent in Windows. Task-number: QTIFW-2805 Change-Id: I1cb282beb2ce2648f5b0e43919800c92465538b4 Reviewed-by: Qt CI Bot Reviewed-by: Arttu Tarkiainen --- src/libs/installer/metadatajob.cpp | 46 ++++++++++++++++++++++++-------------- 1 file changed, 29 insertions(+), 17 deletions(-) (limited to 'src') diff --git a/src/libs/installer/metadatajob.cpp b/src/libs/installer/metadatajob.cpp index a62a23256..ff15d7b0d 100644 --- a/src/libs/installer/metadatajob.cpp +++ b/src/libs/installer/metadatajob.cpp @@ -279,7 +279,14 @@ void MetadataJob::doStart() return; } - FileTaskItem item(url); + QTemporaryDir tmp(QDir::tempPath() + QLatin1String("/remoterepo-XXXXXX")); + if (!tmp.isValid()) { + qCWarning(QInstaller::lcInstallerInstallLog) << "Cannot create unique temporary directory."; + continue; + } + tmp.setAutoRemove(false); + m_tempDirDeleter.add(tmp.path()); + FileTaskItem item(url, tmp.path() + QLatin1String("/Updates.xml")); item.insert(TaskRole::UserRole, QVariant::fromValue(repo)); item.insert(TaskRole::Authenticator, QVariant::fromValue(authenticator)); items.append(item); @@ -414,7 +421,15 @@ void MetadataJob::unzipRepositoryTaskFinished() error = testJob.error(); errorString = testJob.errorString(); if (error == Job::NoError) { - FileTaskItem item(url); + QTemporaryDir tmp(QDir::tempPath() + QLatin1String("/remoterepo-XXXXXX")); + if (!tmp.isValid()) { + qCWarning(QInstaller::lcInstallerInstallLog) << "Cannot create unique temporary directory."; + continue; + } + tmp.setAutoRemove(false); + m_tempDirDeleter.add(tmp.path()); + FileTaskItem item(url, tmp.path() + QLatin1String("/Updates.xml")); + item.insert(TaskRole::UserRole, QVariant::fromValue(repo)); m_unzipRepositoryitems.append(item); } else { @@ -604,6 +619,13 @@ void MetadataJob::metadataTaskFinished() } else { throw QInstaller::TaskException(mismatchMessage); } + QFileInfo fi(result.target()); + QString targetPath = fi.absolutePath(); + if (m_fetchedMetadata.contains(targetPath)) { + delete m_fetchedMetadata.value(targetPath); + m_fetchedMetadata.remove(targetPath); + } + continue; } UnzipArchiveTask *task = new UnzipArchiveTask(result.target(), item.value(TaskRole::UserRole).toString()); @@ -614,6 +636,9 @@ void MetadataJob::metadataTaskFinished() connect(watcher, &QFutureWatcherBase::finished, this, &MetadataJob::unzipTaskFinished); watcher->setFuture(QtConcurrent::run(&UnzipArchiveTask::doTask, task)); } + if (m_unzipTasks.isEmpty()) + startUpdateCacheTask(); + } else { startUpdateCacheTask(); } @@ -735,23 +760,10 @@ MetadataJob::Status MetadataJob::parseUpdatesXml(const QList &re if (result.target().isEmpty()) { continue; } - QTemporaryDir tmp(QDir::tempPath() + QLatin1String("/remoterepo-XXXXXX")); - if (!tmp.isValid()) { - qCWarning(QInstaller::lcInstallerInstallLog) << "Cannot create unique temporary directory."; - return XmlDownloadFailure; - } - - tmp.setAutoRemove(false); - QScopedPointer metadata(new Metadata(tmp.path())); - m_tempDirDeleter.add(metadata->path()); + QFileInfo fileInfo(result.target()); + QScopedPointer metadata(new Metadata(fileInfo.absolutePath())); QFile file(result.target()); - if (!file.rename(metadata->path() + QLatin1String("/Updates.xml"))) { - qCWarning(QInstaller::lcInstallerInstallLog) << "Cannot rename target to Updates.xml:" - << file.errorString(); - return XmlDownloadFailure; - } - if (!file.open(QIODevice::ReadOnly)) { qCWarning(QInstaller::lcInstallerInstallLog) << "Cannot open Updates.xml for reading:" << file.errorString(); -- cgit v1.2.3