[Pkg-owncloud-commits] [owncloud-client] 27/333: Make abort work even when there are parallel uploads

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 6db8daabf7d889971c30d80f9cb47140896d4d3c
Author: Olivier Goffart <ogoffart at woboq.com>
Date:   Thu Feb 6 14:52:56 2014 +0100

    Make abort work even when there are parallel uploads
---
 src/mirall/csyncthread.cpp             |  9 ++++-----
 src/mirall/csyncthread.h               |  2 --
 src/mirall/owncloudpropagator.cpp      | 26 +++++++++++++++++++++++++-
 src/mirall/owncloudpropagator.h        | 19 +++++++++++++++----
 src/mirall/owncloudpropagator_p.h      |  2 +-
 src/mirall/owncloudpropagator_qnam.cpp | 12 ++++++++++++
 src/mirall/owncloudpropagator_qnam.h   |  2 ++
 7 files changed, 59 insertions(+), 13 deletions(-)

diff --git a/src/mirall/csyncthread.cpp b/src/mirall/csyncthread.cpp
index 7256991..01b0bf5 100644
--- a/src/mirall/csyncthread.cpp
+++ b/src/mirall/csyncthread.cpp
@@ -429,9 +429,7 @@ void CSyncThread::startSync()
     _syncedItems.clear();
     _needsUpdate = false;
 
-    if (!_abortRequested.fetchAndAddRelease(0)) {
-        csync_resume(_csync_ctx);
-    }
+    csync_resume(_csync_ctx);
 
     if (!_journal->exists()) {
         qDebug() << "=====sync looks new (no DB exists), activating recursive PROPFIND if csync supports it";
@@ -559,7 +557,7 @@ void CSyncThread::slotUpdateFinished(int updateResult)
     Q_ASSERT(session);
 
     _propagator.reset(new OwncloudPropagator (session, _localPath, _remotePath,
-                                              _journal, &_abortRequested, &_thread));
+                                              _journal, &_thread));
     connect(_propagator.data(), SIGNAL(completed(SyncFileItem)),
             this, SLOT(transferCompleted(SyncFileItem)), Qt::QueuedConnection);
     connect(_propagator.data(), SIGNAL(progress(Progress::Kind,SyncFileItem,quint64,quint64)),
@@ -711,7 +709,8 @@ QString CSyncThread::adjustRenamedPath(const QString& original)
 void CSyncThread::abort()
 {
     csync_request_abort(_csync_ctx);
-    _abortRequested = true;
+    if(_propagator);
+        _propagator->abort();
 }
 
 } // ns Mirall
diff --git a/src/mirall/csyncthread.h b/src/mirall/csyncthread.h
index 2b5476b..5384dd5 100644
--- a/src/mirall/csyncthread.h
+++ b/src/mirall/csyncthread.h
@@ -122,8 +122,6 @@ private:
     qint64 _overallFileCount;
     quint64 _lastOverallBytes;
 
-    QAtomicInt _abortRequested;
-
     friend struct CSyncRunScopeHelper;
 };
 
diff --git a/src/mirall/owncloudpropagator.cpp b/src/mirall/owncloudpropagator.cpp
index 3777803..54fdcaf 100644
--- a/src/mirall/owncloudpropagator.cpp
+++ b/src/mirall/owncloudpropagator.cpp
@@ -187,6 +187,9 @@ static bool removeRecursively(const QString &path)
 
 void PropagateLocalRemove::start()
 {
+    if (_propagator->_abortRequested.fetchAndAddRelaxed(0))
+        return;
+
     QString filename = _propagator->_localDir +  _item._file;
     if (_item._isDirectory) {
         if (QDir(filename).exists() && !removeRecursively(filename)) {
@@ -209,6 +212,9 @@ void PropagateLocalRemove::start()
 
 void PropagateLocalMkdir::start()
 {
+    if (_propagator->_abortRequested.fetchAndAddRelaxed(0))
+        return;
+
     QDir d;
     if (!d.mkpath(_propagator->_localDir +  _item._file)) {
         done(SyncFileItem::NormalError, tr("could not create directory %1").arg(_propagator->_localDir +  _item._file));
@@ -219,6 +225,9 @@ void PropagateLocalMkdir::start()
 
 void PropagateRemoteRemove::start()
 {
+    if (_propagator->_abortRequested.fetchAndAddRelaxed(0))
+        return;
+
     QScopedPointer<char, QScopedPointerPodDeleter> uri(
         ne_path_escape((_propagator->_remoteDir + _item._file).toUtf8()));
     emit progress(Progress::StartDelete, _item, 0, _item._size);
@@ -242,6 +251,9 @@ void PropagateRemoteRemove::start()
 
 void PropagateRemoteMkdir::start()
 {
+    if (_propagator->_abortRequested.fetchAndAddRelaxed(0))
+        return;
+
     QScopedPointer<char, QScopedPointerPodDeleter> uri(
         ne_path_escape((_propagator->_remoteDir + _item._file).toUtf8()));
 
@@ -257,6 +269,8 @@ void PropagateRemoteMkdir::start()
 
 void PropagateUploadFile::start()
 {
+    if (_propagator->_abortRequested.fetchAndAddRelaxed(0))
+        return;
 
     QFile file(_propagator->_localDir + _item._file);
     if (!file.open(QIODevice::ReadOnly)) {
@@ -542,7 +556,7 @@ int PropagateDownloadFile::content_reader(void *userdata, const char *buf, size_
     PropagateDownloadFile *that = static_cast<PropagateDownloadFile *>(userdata);
     size_t written = 0;
 
-    if (that->_propagator->_abortRequested->fetchAndAddRelaxed(0)) {
+    if (that->_propagator->_abortRequested.fetchAndAddRelaxed(0)) {
         ne_set_error(that->_propagator->_session, "%s", tr("Sync was aborted by user.").toUtf8().data());
         return NE_ERROR;
     }
@@ -645,6 +659,9 @@ void PropagateDownloadFile::notify_status_cb(void* userdata, ne_session_status s
 
 void PropagateDownloadFile::start()
 {
+    if (_propagator->_abortRequested.fetchAndAddRelaxed(0))
+        return;
+
     emit progress(Progress::StartDownload, _item, 0, _item._size);
 
     QString tmpFileName;
@@ -839,6 +856,9 @@ void PropagateDownloadFile::start()
 
 void PropagateLocalRename::start()
 {
+    if (_propagator->_abortRequested.fetchAndAddRelaxed(0))
+        return;
+
     // if the file is a file underneath a moved dir, the _item.file is equal
     // to _item.renameTarget and the file is not moved as a result.
     if (_item._file != _item._renameTarget) {
@@ -866,6 +886,9 @@ void PropagateLocalRename::start()
 
 void PropagateRemoteRename::start()
 {
+    if (_propagator->_abortRequested.fetchAndAddRelaxed(0))
+        return;
+
     if (_item._file == _item._renameTarget) {
         if (!_item._isDirectory) {
             // The parents has been renamed already so there is nothing more to do.
@@ -1096,6 +1119,7 @@ void PropagateDirectory::start()
 void PropagateDirectory::slotSubJobFinished(SyncFileItem::Status status)
 {
     if (status == SyncFileItem::FatalError) {
+        abort();
         emit finished(status);
         return;
     } else if (status == SyncFileItem::NormalError || status == SyncFileItem::SoftError) {
diff --git a/src/mirall/owncloudpropagator.h b/src/mirall/owncloudpropagator.h
index 64de7ce..7c2d0d8 100644
--- a/src/mirall/owncloudpropagator.h
+++ b/src/mirall/owncloudpropagator.h
@@ -41,6 +41,7 @@ public:
 
 public slots:
     virtual void start() = 0;
+    virtual void abort() {}
 signals:
     void finished(SyncFileItem::Status);
     void completed(const SyncFileItem &);
@@ -79,7 +80,12 @@ public:
     }
 
     virtual void start();
-
+    virtual void abort() {
+        if (_firstJob)
+            _firstJob->abort();
+        foreach (PropagatorJob *j, _subJobs)
+            j->abort();
+    }
 
 private slots:
     void startJob(PropagatorJob *next) {
@@ -140,13 +146,12 @@ public:
 
 public:
     OwncloudPropagator(ne_session_s *session, const QString &localDir, const QString &remoteDir,
-                       SyncJournalDb *progressDb, QAtomicInt *abortRequested, QThread *neonThread)
+                       SyncJournalDb *progressDb, QThread *neonThread)
             : _neonThread(neonThread)
             , _session(session)
             , _localDir((localDir.endsWith(QChar('/'))) ? localDir : localDir+'/'  )
             , _remoteDir((remoteDir.endsWith(QChar('/'))) ? remoteDir : remoteDir+'/'  )
             , _journal(progressDb)
-            , _abortRequested(abortRequested)
     { }
 
     void start(const SyncFileItemVector &_syncedItems);
@@ -154,11 +159,17 @@ public:
     QAtomicInt _downloadLimit;
     QAtomicInt _uploadLimit;
 
-    QAtomicInt *_abortRequested; // boolean set by the main thread to abort.
+    QAtomicInt _abortRequested; // boolean set by the main thread to abort.
 
     void overallTransmissionSizeChanged( qint64 change );
 
     bool isInSharedDirectory(const QString& file);
+    void abort() {
+        _abortRequested.fetchAndStoreOrdered(true);
+        if (_rootJob)
+            _rootJob->abort();
+        emit finished();
+    }
 signals:
     void completed(const SyncFileItem &);
     void progress(Progress::Kind kind, const SyncFileItem&, quint64 bytes, quint64 total);
diff --git a/src/mirall/owncloudpropagator_p.h b/src/mirall/owncloudpropagator_p.h
index 380e3fe..6e5d531 100644
--- a/src/mirall/owncloudpropagator_p.h
+++ b/src/mirall/owncloudpropagator_p.h
@@ -130,7 +130,7 @@ private:
     // abort callback for httpbf
     static int _user_want_abort(void *userData)
     {
-        return  static_cast<PropagateUploadFile *>(userData)->_propagator->_abortRequested->fetchAndAddRelaxed(0);
+        return  static_cast<PropagateUploadFile *>(userData)->_propagator->_abortRequested.fetchAndAddRelaxed(0);
     }
 
     // callback from httpbf when a chunk is finished
diff --git a/src/mirall/owncloudpropagator_qnam.cpp b/src/mirall/owncloudpropagator_qnam.cpp
index 2d93e9f..1603d76 100644
--- a/src/mirall/owncloudpropagator_qnam.cpp
+++ b/src/mirall/owncloudpropagator_qnam.cpp
@@ -157,6 +157,9 @@ void ChunkedPUTFileJob::slotChunkFinished()
 
 void PropagateUploadFileQNAM::start()
 {
+    if (_propagator->_abortRequested.fetchAndAddRelaxed(0))
+        return;
+
     QFile *file = new QFile(_propagator->_localDir + _item._file);
     if (!file->open(QIODevice::ReadOnly)) {
         done(SyncFileItem::NormalError, file->errorString());
@@ -221,6 +224,8 @@ void PropagateUploadFileQNAM::slotPutFinished()
     PUTFileJob *job = qobject_cast<PUTFileJob *>(sender());
     Q_ASSERT(job);
 
+    qDebug() << Q_FUNC_INFO << job->reply()->request().url() << "FINISHED WITH STATUS" << job->reply()->error() << job->reply()->errorString();
+
     QNetworkReply::NetworkError err = job->reply()->error();
     if (err != QNetworkReply::NoError) {
 //             /* If the source file changed during submission, lets try again */
@@ -310,4 +315,11 @@ void PropagateUploadFileQNAM::slotPutFinished()
     done(SyncFileItem::Success);
 }
 
+void PropagateUploadFileQNAM::abort()
+{
+    if (_job &&  _job->reply())
+        _job->reply()->abort();
+}
+
+
 }
diff --git a/src/mirall/owncloudpropagator_qnam.h b/src/mirall/owncloudpropagator_qnam.h
index 0e732e7..6634f8a 100644
--- a/src/mirall/owncloudpropagator_qnam.h
+++ b/src/mirall/owncloudpropagator_qnam.h
@@ -69,11 +69,13 @@ signals:
 
 class PropagateUploadFileQNAM : public PropagateItemJob {
     Q_OBJECT
+    QPointer<PUTFileJob> _job;
 public:
     PropagateUploadFileQNAM(OwncloudPropagator* propagator,const SyncFileItem& item)  : PropagateItemJob(propagator, item) {}
     void start();
 private slots:
     void slotPutFinished();
+    void abort();
 };
 
 class ChunkedPUTFileJob : public AbstractNetworkJob {

-- 
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