[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