From 550d6d66d1397384bdce1d39ab7a22fe54785906 Mon Sep 17 00:00:00 2001 From: Olivier Goffart Date: Tue, 29 Jul 2014 15:51:22 +0200 Subject: [PATCH] Long Running Put: Better error reporting --- src/mirall/owncloudpropagator.cpp | 8 +++++--- src/mirall/owncloudpropagator.h | 1 + src/mirall/propagator_qnam.cpp | 30 ++++++++++++++++++------------ src/mirall/propagator_qnam.h | 3 +-- src/mirall/syncengine.cpp | 7 +++++++ src/mirall/syncengine.h | 1 + src/mirall/syncjournaldb.cpp | 2 +- 7 files changed, 34 insertions(+), 18 deletions(-) diff --git a/src/mirall/owncloudpropagator.cpp b/src/mirall/owncloudpropagator.cpp index a286686b7..eae8cee15 100644 --- a/src/mirall/owncloudpropagator.cpp +++ b/src/mirall/owncloudpropagator.cpp @@ -462,12 +462,14 @@ void CleanupPollsJob::slotPollFinished() { PollJob *job = qobject_cast(sender()); Q_ASSERT(job); - if (!job->_error.isEmpty()) { - qDebug() << "There was an error with file " << job->_item._file << job->_error ; + if (job->_item._status == SyncFileItem::FatalError) { + emit aborted(job->_item._errorString); + return; + } else if (job->_item._status != SyncFileItem::Success) { + qDebug() << "There was an error with file " << job->_item._file << job->_item._errorString; } else { _journal->setFileRecord(SyncJournalFileRecord(job->_item, _localPath + job->_item._file)); } - // Continue with the next entry, or finish start(); } diff --git a/src/mirall/owncloudpropagator.h b/src/mirall/owncloudpropagator.h index 7251138e8..be84ec38f 100644 --- a/src/mirall/owncloudpropagator.h +++ b/src/mirall/owncloudpropagator.h @@ -271,6 +271,7 @@ public: void start(); signals: void finished(); + void aborted(const QString &error); private slots: void slotPollFinished(); }; diff --git a/src/mirall/propagator_qnam.cpp b/src/mirall/propagator_qnam.cpp index 07258f3cf..530d8d4c6 100644 --- a/src/mirall/propagator_qnam.cpp +++ b/src/mirall/propagator_qnam.cpp @@ -96,28 +96,34 @@ bool PollJob::finished() { QNetworkReply::NetworkError err = reply()->error(); if (err != QNetworkReply::NoError) { + _item._httpErrorCode = reply()->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt(); + _item._status = classifyError(err, _item._httpErrorCode); + _item._errorString = reply()->errorString(); + if (_item._status == SyncFileItem::FatalError || int(_item._httpErrorCode / 100) == 4) { + emit finishedSignal(); + return true; + } + start(); return false; } bool ok = false; QVariantMap status = QtJson::parse(QString::fromUtf8(reply()->readAll()), ok).toMap(); if (!ok || status.isEmpty()) { - qDebug() << "Invalid json reply from the poll URL"; + _item._errorString = tr("Invalid json reply from the poll URL"); + _item._status = SyncFileItem::NormalError; emit finishedSignal(); - // FIXME: retry? return true; } - // the following code only happens after all chunks were uploaded. - // the file id should only be empty for new files up- or downloaded - QByteArray fid = status["fileid"].toByteArray(); - if( !fid.isEmpty() ) { - if( !_item._fileId.isEmpty() && _item._fileId != fid ) { - qDebug() << "WARN: File ID changed!" << _item._fileId << fid; - } - _item._fileId = fid; + if (status["unfinished"].isValid()) { + start(); + return false; } + _item._errorString = status["error"].toString(); + _item._status = _item._errorString.isEmpty() ? SyncFileItem::NormalError : SyncFileItem::Success; + _item._fileId = status["fileid"].toByteArray(); _item._etag = status["etag"].toByteArray(); _item._responseTimeStamp = responseTimestamp(); @@ -462,8 +468,8 @@ void PropagateUploadFileQNAM::slotPollFinished() PollJob *job = qobject_cast(sender()); Q_ASSERT(job); - if (!job->_error.isEmpty()) { - done(SyncFileItem::NormalError, job->_error); + if (job->_item._status != SyncFileItem::Success) { + done(job->_item._status, job->_item._errorString); return; } diff --git a/src/mirall/propagator_qnam.h b/src/mirall/propagator_qnam.h index de8d997ba..14a12048f 100644 --- a/src/mirall/propagator_qnam.h +++ b/src/mirall/propagator_qnam.h @@ -86,9 +86,8 @@ class PollJob : public AbstractNetworkJob { QString _localPath; public: SyncFileItem _item; - const QString _error; // Takes ownership of the device - explicit PollJob(Account* account, const QString &path, SyncFileItem item, + explicit PollJob(Account* account, const QString &path, const SyncFileItem &item, SyncJournalDb *journal, const QString &localPath, QObject *parent) : AbstractNetworkJob(account, path, parent), _journal(journal), _localPath(localPath), _item(item) {} diff --git a/src/mirall/syncengine.cpp b/src/mirall/syncengine.cpp index 6d1847e2d..03bd2356f 100644 --- a/src/mirall/syncengine.cpp +++ b/src/mirall/syncengine.cpp @@ -445,6 +445,7 @@ void SyncEngine::startSync() CleanupPollsJob *job = new CleanupPollsJob(pollInfos, AccountManager::instance()->account(), _journal, _localPath, this); connect(job, SIGNAL(finished()), this, SLOT(startSync())); + connect(job, SIGNAL(aborted(QString)), this, SLOT(slotCleanPollsJobAborted(QString))); job->start(); return; } @@ -623,6 +624,12 @@ void SyncEngine::slotUpdateFinished(int updateResult) _propagator->start(_syncedItems); } +void SyncEngine::slotCleanPollsJobAborted(const QString &error) +{ + csyncError(error); + finalize(); +} + void SyncEngine::setNetworkLimits(int upload, int download) { _uploadLimit = upload; diff --git a/src/mirall/syncengine.h b/src/mirall/syncengine.h index 34d919a88..b2525b31e 100644 --- a/src/mirall/syncengine.h +++ b/src/mirall/syncengine.h @@ -93,6 +93,7 @@ private slots: void slotProgress(const SyncFileItem& item, quint64 curent); void slotAdjustTotalTransmissionSize(qint64 change); void slotUpdateFinished(int updateResult); + void slotCleanPollsJobAborted(const QString &error); private: void handleSyncError(CSYNC *ctx, const char *state); diff --git a/src/mirall/syncjournaldb.cpp b/src/mirall/syncjournaldb.cpp index faa370ead..fdd7811e9 100644 --- a/src/mirall/syncjournaldb.cpp +++ b/src/mirall/syncjournaldb.cpp @@ -204,7 +204,7 @@ bool SyncJournalDb::checkConnect() } createQuery.prepare("CREATE TABLE IF NOT EXISTS version(" - "major VARCHAR(4096)," + "major INTEGER(8)," "minor INTEGER(8)," "patch INTEGER(8)," "custom VARCHAR(256)"