[Pkg-owncloud-commits] [owncloud-client] 28/333: Only starts 6 jobs in parallel
Sandro Knauß
hefee-guest at moszumanska.debian.org
Thu Apr 17 23:16:29 UTC 2014
This is an automated email from the git hooks/post-receive script.
hefee-guest pushed a commit to branch master
in repository owncloud-client.
commit f35b1f8a2bb9bf29a64df3d025cbe68b15324095
Author: Olivier Goffart <ogoffart at woboq.com>
Date: Wed Feb 12 11:07:34 2014 +0100
Only starts 6 jobs in parallel
---
src/mirall/csyncthread.cpp | 2 +-
src/mirall/owncloudpropagator.cpp | 37 +++++++++++++++++++++++++---------
src/mirall/owncloudpropagator.h | 37 ++++++++++++++++++++++++++++++++--
src/mirall/owncloudpropagator_qnam.cpp | 5 ++++-
4 files changed, 67 insertions(+), 14 deletions(-)
diff --git a/src/mirall/csyncthread.cpp b/src/mirall/csyncthread.cpp
index 01b0bf5..ffd4fdd 100644
--- a/src/mirall/csyncthread.cpp
+++ b/src/mirall/csyncthread.cpp
@@ -709,7 +709,7 @@ QString CSyncThread::adjustRenamedPath(const QString& original)
void CSyncThread::abort()
{
csync_request_abort(_csync_ctx);
- if(_propagator);
+ if(_propagator)
_propagator->abort();
}
diff --git a/src/mirall/owncloudpropagator.cpp b/src/mirall/owncloudpropagator.cpp
index 54fdcaf..8812396 100644
--- a/src/mirall/owncloudpropagator.cpp
+++ b/src/mirall/owncloudpropagator.cpp
@@ -49,6 +49,9 @@
#include <time.h>
+/* The maximum number of active job in parallel */
+static const int maximumActiveJob = 6;
+
// We use some internals of csync:
extern "C" int c_utimes(const char *, const struct timeval *);
extern "C" void csync_win32_set_file_hidden( const char *file, bool h );
@@ -1110,7 +1113,7 @@ void PropagateDirectory::start()
_current = -1;
_hasError = SyncFileItem::NoStatus;
if (!_firstJob) {
- slotSubJobFinished(SyncFileItem::Success);
+ slotSubJobReady();
} else {
startJob(_firstJob.data());
}
@@ -1125,18 +1128,32 @@ void PropagateDirectory::slotSubJobFinished(SyncFileItem::Status status)
} else if (status == SyncFileItem::NormalError || status == SyncFileItem::SoftError) {
_hasError = status;
}
+ _runningNow--;
+ slotSubJobReady();
+}
- if (_current == -1) {
- // Start all the jobs
- foreach( PropagatorJob *next , _subJobs ) {
- startJob(next);
- }
+void PropagateDirectory::slotSubJobReady()
+{
+ qDebug() << Q_FUNC_INFO << _runningNow << _propagator->_activeJobs;
+
+ if (_runningNow && _current == -1)
+ return; // Ignore the case when the _fistJob is ready and not yet finished
+ if (_runningNow && _current >= 0 && _current < _subJobs.count()) {
+ // there is a job running and the current one is not ready yet, we can't start new job
+ qDebug() << _subJobs[_current]->_readySent << maximumActiveJob << _subJobs[_current];
+ if (!_subJobs[_current]->_readySent || _propagator->_activeJobs >= maximumActiveJob)
+ return;
}
- _current ++;
- if (_current >= _subJobs.size()) {
- // We finished to process all the jobs
-
+ _current++;
+ if (_current < _subJobs.size() && !_propagator->_abortRequested.fetchAndAddRelaxed(0)) {
+ PropagatorJob *next = _subJobs.at(_current);
+ startJob(next);
+ return;
+ }
+ // We finished to processing all the jobs
+ emitReady();
+ if (!_runningNow) {
if (!_item.isEmpty() && _hasError == SyncFileItem::NoStatus) {
if( !_item._renameTarget.isEmpty() ) {
_item._file = _item._renameTarget;
diff --git a/src/mirall/owncloudpropagator.h b/src/mirall/owncloudpropagator.h
index 7c2d0d8..5ae00af 100644
--- a/src/mirall/owncloudpropagator.h
+++ b/src/mirall/owncloudpropagator.h
@@ -36,16 +36,39 @@ class PropagatorJob : public QObject {
Q_OBJECT
protected:
OwncloudPropagator *_propagator;
+ void emitReady() {
+ bool wasReady = _readySent;
+ _readySent = true;
+ if (!wasReady)
+ emit ready();
+ };
public:
- explicit PropagatorJob(OwncloudPropagator* propagator) : _propagator(propagator) {}
+ bool _readySent;
+ explicit PropagatorJob(OwncloudPropagator* propagator) : _propagator(propagator), _readySent(false) {}
public slots:
virtual void start() = 0;
virtual void abort() {}
signals:
+ /**
+ * Emitted when the job is fully finished
+ */
void finished(SyncFileItem::Status);
+
+ /**
+ * Emitted when one item has been completed within a job.
+ */
void completed(const SyncFileItem &);
+
+ /**
+ * Emitted when all the sub-jobs have been scheduled and
+ * we are ready and more jobs might be started
+ * This signal is not always emitted.
+ */
+ void ready();
+
void progress(Progress::Kind, const SyncFileItem& item, quint64 bytes, quint64 total);
+
};
/*
@@ -64,12 +87,13 @@ public:
SyncFileItem _item;
int _current; // index of the current running job
+ int _runningNow; // number of subJob running now
SyncFileItem::Status _hasError; // NoStatus, or NormalError / SoftError if there was an error
explicit PropagateDirectory(OwncloudPropagator *propagator, const SyncFileItem &item = SyncFileItem())
: PropagatorJob(propagator)
- , _firstJob(0), _item(item), _current(-1), _hasError(SyncFileItem::NoStatus) { }
+ , _firstJob(0), _item(item), _current(-1), _runningNow(0), _hasError(SyncFileItem::NoStatus) { }
virtual ~PropagateDirectory() {
qDeleteAll(_subJobs);
@@ -92,10 +116,13 @@ private slots:
connect(next, SIGNAL(finished(SyncFileItem::Status)), this, SLOT(slotSubJobFinished(SyncFileItem::Status)), Qt::QueuedConnection);
connect(next, SIGNAL(completed(SyncFileItem)), this, SIGNAL(completed(SyncFileItem)));
connect(next, SIGNAL(progress(Progress::Kind,SyncFileItem,quint64,quint64)), this, SIGNAL(progress(Progress::Kind,SyncFileItem,quint64,quint64)));
+ connect(next, SIGNAL(ready()), this, SLOT(slotSubJobReady()));
+ _runningNow++;
QMetaObject::invokeMethod(next, "start");
}
void slotSubJobFinished(SyncFileItem::Status status);
+ void slotSubJobReady();
};
@@ -152,6 +179,7 @@ public:
, _localDir((localDir.endsWith(QChar('/'))) ? localDir : localDir+'/' )
, _remoteDir((remoteDir.endsWith(QChar('/'))) ? remoteDir : remoteDir+'/' )
, _journal(progressDb)
+ , _activeJobs(0)
{ }
void start(const SyncFileItemVector &_syncedItems);
@@ -161,9 +189,14 @@ public:
QAtomicInt _abortRequested; // boolean set by the main thread to abort.
+ /* The number of currently active jobs */
+ int _activeJobs;
+
void overallTransmissionSizeChanged( qint64 change );
bool isInSharedDirectory(const QString& file);
+
+
void abort() {
_abortRequested.fetchAndStoreOrdered(true);
if (_rootJob)
diff --git a/src/mirall/owncloudpropagator_qnam.cpp b/src/mirall/owncloudpropagator_qnam.cpp
index 1603d76..0ba8d85 100644
--- a/src/mirall/owncloudpropagator_qnam.cpp
+++ b/src/mirall/owncloudpropagator_qnam.cpp
@@ -23,7 +23,6 @@ namespace Mirall {
void PUTFileJob::start() {
QNetworkRequest req;
- qDebug() << _headers;
for(QMap<QByteArray, QByteArray>::const_iterator it = _headers.begin(); it != _headers.end(); ++it) {
req.setRawHeader(it.key(), it.value());
qDebug() << it.key() << it.value();
@@ -217,10 +216,14 @@ void PropagateUploadFileQNAM::start()
emit progress(Progress::StartUpload, _item, 0, file->size());
job->start();
+
+ _propagator->_activeJobs++;
+ emitReady();
}
void PropagateUploadFileQNAM::slotPutFinished()
{
+ _propagator->_activeJobs--;
PUTFileJob *job = qobject_cast<PUTFileJob *>(sender());
Q_ASSERT(job);
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-owncloud/owncloud-client.git
More information about the Pkg-owncloud-commits
mailing list