From a440b757c4be30458c4017ec26af7a7253ef49bb Mon Sep 17 00:00:00 2001 From: Hannah von Reth Date: Thu, 30 Jun 2022 12:52:53 +0200 Subject: [PATCH] Allow to set the priority on a job level Issue: #9832 --- changelog/unreleased/9832 | 5 +++++ src/libsync/abstractnetworkjob.cpp | 11 +++++++++++ src/libsync/abstractnetworkjob.h | 5 +++++ src/libsync/networkjobs.cpp | 12 ++++++++---- src/libsync/propagatedownload.cpp | 6 ++++-- src/libsync/propagateupload.cpp | 7 ++++--- 6 files changed, 37 insertions(+), 9 deletions(-) create mode 100644 changelog/unreleased/9832 diff --git a/changelog/unreleased/9832 b/changelog/unreleased/9832 new file mode 100644 index 00000000000..b5e6ee012cb --- /dev/null +++ b/changelog/unreleased/9832 @@ -0,0 +1,5 @@ +Enhancement: Run vfs downloads with a high priority + +This should reduce the occurance of timeouts when downloading vfs files in the Windows explorer. + +https://github.com/owncloud/client/issues/9832 diff --git a/src/libsync/abstractnetworkjob.cpp b/src/libsync/abstractnetworkjob.cpp index 514a4222780..766f86b810f 100644 --- a/src/libsync/abstractnetworkjob.cpp +++ b/src/libsync/abstractnetworkjob.cpp @@ -170,6 +170,7 @@ void AbstractNetworkJob::sendRequest(const QByteArray &verb, const QUrl &url, _verb = verb; _request = req; _request.setUrl(url); + _request.setPriority(_priority); _requestBody = requestBody; if (!isAuthenticationJob() && _account->jobQueue()->enqueue(this)) { return; @@ -442,6 +443,16 @@ void AbstractNetworkJob::abort() } } +void AbstractNetworkJob::setPriority(QNetworkRequest::Priority priority) +{ + _priority = priority; +} + +QNetworkRequest::Priority AbstractNetworkJob::priority() const +{ + return _priority; +} + } // namespace OCC QDebug operator<<(QDebug debug, const OCC::AbstractNetworkJob *job) diff --git a/src/libsync/abstractnetworkjob.h b/src/libsync/abstractnetworkjob.h index af5f2b28d27..51c26274bea 100644 --- a/src/libsync/abstractnetworkjob.h +++ b/src/libsync/abstractnetworkjob.h @@ -71,6 +71,9 @@ class OWNCLOUDSYNC_EXPORT AbstractNetworkJob : public QObject qint64 timeoutMsec() const { return _timer.interval(); } bool timedOut() const { return _timedout; } + void setPriority(QNetworkRequest::Priority priority); + QNetworkRequest::Priority priority() const; + /** Returns an error message, if any. */ QString errorString() const; @@ -196,6 +199,8 @@ private slots: bool _isAuthenticationJob = false; int _retryCount = 0; + QNetworkRequest::Priority _priority = QNetworkRequest::NormalPriority; + friend QDebug(::operator<<)(QDebug debug, const AbstractNetworkJob *job); }; diff --git a/src/libsync/networkjobs.cpp b/src/libsync/networkjobs.cpp index 41de2d46765..8e759013734 100644 --- a/src/libsync/networkjobs.cpp +++ b/src/libsync/networkjobs.cpp @@ -314,12 +314,20 @@ LsColJob::LsColJob(AccountPtr account, const QString &path, QObject *parent) : AbstractNetworkJob(account, QString(), parent) , _url(makeDavUrl(path)) { + // Always have a higher priority than the propagator because we use this from the UI + // and really want this to be done first (no matter what internal scheduling QNAM uses). + // Also possibly useful for avoiding false timeouts. + setPriority(QNetworkRequest::HighPriority); } LsColJob::LsColJob(AccountPtr account, const QUrl &url, QObject *parent) : AbstractNetworkJob(account, QString(), parent) , _url(url) { + // Always have a higher priority than the propagator because we use this from the UI + // and really want this to be done first (no matter what internal scheduling QNAM uses). + // Also possibly useful for avoiding false timeouts. + setPriority(QNetworkRequest::HighPriority); } void LsColJob::setProperties(const QList &properties) @@ -582,10 +590,6 @@ void PropfindJob::start() Q_EMIT result(values); }); QNetworkRequest req; - // Always have a higher priority than the propagator because we use this from the UI - // and really want this to be done first (no matter what internal scheduling QNAM uses). - // Also possibly useful for avoiding false timeouts. - req.setPriority(QNetworkRequest::HighPriority); req.setRawHeader(QByteArrayLiteral("Depth"), QByteArrayLiteral("0")); startImpl(req); } diff --git a/src/libsync/propagatedownload.cpp b/src/libsync/propagatedownload.cpp index 3ba98877656..b23cacd2d40 100644 --- a/src/libsync/propagatedownload.cpp +++ b/src/libsync/propagatedownload.cpp @@ -79,6 +79,8 @@ GETFileJob::GETFileJob(AccountPtr account, const QString &path, QIODevice *devic , _resumeStart(resumeStart) , _hasEmittedFinishedSignal(false) { + // Long downloads must not block non-propagation jobs. + setPriority(QNetworkRequest::LowPriority); } GETFileJob::GETFileJob(AccountPtr account, const QUrl &url, QIODevice *device, @@ -94,6 +96,8 @@ GETFileJob::GETFileJob(AccountPtr account, const QUrl &url, QIODevice *device, , _directDownloadUrl(url) , _hasEmittedFinishedSignal(false) { + // Long downloads must not block non-propagation jobs. + setPriority(QNetworkRequest::LowPriority); } void GETFileJob::start() @@ -109,8 +113,6 @@ void GETFileJob::start() req.setRawHeader(it.key(), it.value()); } - req.setPriority(QNetworkRequest::LowPriority); // Long downloads must not block non-propagation jobs. - if (_directDownloadUrl.isEmpty()) { sendRequest("GET", makeDavUrl(path()), req); } else { diff --git a/src/libsync/propagateupload.cpp b/src/libsync/propagateupload.cpp index e0b657fb82a..e56e035b46a 100644 --- a/src/libsync/propagateupload.cpp +++ b/src/libsync/propagateupload.cpp @@ -64,6 +64,8 @@ static bool fileIsStillChanging(const SyncFileItem &item) PUTFileJob::PUTFileJob(AccountPtr account, const QString &path, std::unique_ptr device, const QMap &headers, int chunk, QObject *parent) : PUTFileJob(account, Utility::concatUrlPath(account->davUrl(), path), std::move(device), headers, chunk, parent) { + // Long uploads must not block non-propagation jobs. + setPriority(QNetworkRequest::LowPriority); } PUTFileJob::PUTFileJob(AccountPtr account, const QUrl &url, std::unique_ptr device, const QMap &headers, int chunk, QObject *parent) @@ -74,6 +76,8 @@ PUTFileJob::PUTFileJob(AccountPtr account, const QUrl &url, std::unique_ptrsetParent(this); + // Long uploads must not block non-propagation jobs. + setPriority(QNetworkRequest::LowPriority); } PUTFileJob::~PUTFileJob() @@ -88,9 +92,6 @@ void PUTFileJob::start() for (auto it = _headers.cbegin(); it != _headers.cend(); ++it) { req.setRawHeader(it.key(), it.value()); } - - req.setPriority(QNetworkRequest::LowPriority); // Long uploads must not block non-propagation jobs. - sendRequest("PUT", _url, req, _device); connect(this, &AbstractNetworkJob::networkActivity, account().data(), &Account::propagatorNetworkActivity);