[Pkg-owncloud-commits] [owncloud-client] 92/484: ETagJob: Depth 0 for server >= 8.1 #3730

Sandro Knauß hefee-guest at moszumanska.debian.org
Wed Dec 16 00:37:19 UTC 2015


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 ccec186b9896c19739ebec5ddf10b7882c956f69
Author: Markus Goetz <markus at woboq.com>
Date:   Fri Oct 16 11:52:27 2015 +0200

    ETagJob: Depth 0 for server >= 8.1 #3730
---
 src/libsync/abstractnetworkjob.cpp |  2 +-
 src/libsync/abstractnetworkjob.h   |  3 ++-
 src/libsync/account.cpp            | 16 ++++++++++++++++
 src/libsync/account.h              |  4 ++++
 src/libsync/discoveryphase.cpp     |  7 +++++++
 src/libsync/discoveryphase.h       |  5 ++++-
 src/libsync/networkjobs.cpp        | 15 ++++++++++-----
 src/libsync/propagateupload.cpp    |  6 +-----
 src/libsync/syncengine.cpp         |  9 +++++++--
 9 files changed, 52 insertions(+), 15 deletions(-)

diff --git a/src/libsync/abstractnetworkjob.cpp b/src/libsync/abstractnetworkjob.cpp
index 599e5be..ad874ed 100644
--- a/src/libsync/abstractnetworkjob.cpp
+++ b/src/libsync/abstractnetworkjob.cpp
@@ -44,9 +44,9 @@ AbstractNetworkJob::AbstractNetworkJob(AccountPtr account, const QString &path,
     : QObject(parent)
     , _timedout(false)
     , _followRedirects(false)
+    , _account(account)
     , _ignoreCredentialFailure(false)
     , _reply(0)
-    , _account(account)
     , _path(path)
     , _redirectCount(0)
 {
diff --git a/src/libsync/abstractnetworkjob.h b/src/libsync/abstractnetworkjob.h
index c471cca..08e71cf 100644
--- a/src/libsync/abstractnetworkjob.h
+++ b/src/libsync/abstractnetworkjob.h
@@ -91,11 +91,12 @@ private slots:
     void slotFinished();
     virtual void slotTimeout();
 
+protected:
+    AccountPtr _account;
 private:
     QNetworkReply* addTimer(QNetworkReply *reply);
     bool _ignoreCredentialFailure;
     QPointer<QNetworkReply> _reply; // (QPointer because the NetworkManager may be destroyed before the jobs at exit)
-    AccountPtr _account;
     QString _path;
     QTimer _timer;
     int _redirectCount;
diff --git a/src/libsync/account.cpp b/src/libsync/account.cpp
index cbf537f..73a6887 100644
--- a/src/libsync/account.cpp
+++ b/src/libsync/account.cpp
@@ -478,9 +478,25 @@ QString Account::serverVersion()
     return _serverVersion;
 }
 
+int Account::serverVersionInt()
+{
+    // FIXME: Use Qt 5.5 QVersionNumber
+    auto components = serverVersion().split('.');
+    return  (components.value(0).toInt() << 16)
+                   + (components.value(1).toInt() << 8)
+                   + components.value(2).toInt();
+}
+
 void Account::setServerVersion(const QString& version)
 {
     _serverVersion = version;
 }
 
+bool Account::rootEtagChangesNotOnlySubFolderEtags()
+{
+    return (serverVersionInt() >= 0x080100);
+}
+
+
+
 } // namespace OCC
diff --git a/src/libsync/account.h b/src/libsync/account.h
index e142a9a..cb706c4 100644
--- a/src/libsync/account.h
+++ b/src/libsync/account.h
@@ -154,6 +154,10 @@ public:
     const Capabilities &capabilities() const;
     void setServerVersion(const QString &version);
     QString serverVersion();
+    int serverVersionInt();
+
+    // Fixed from 8.1 https://github.com/owncloud/client/issues/3730
+    bool rootEtagChangesNotOnlySubFolderEtags();
 
     void clearCookieJar();
     void lendCookieJarTo(QNetworkAccessManager *guest);
diff --git a/src/libsync/discoveryphase.cpp b/src/libsync/discoveryphase.cpp
index dcf2500..8273d7d 100644
--- a/src/libsync/discoveryphase.cpp
+++ b/src/libsync/discoveryphase.cpp
@@ -327,6 +327,10 @@ void DiscoverySingleDirectoryJob::directoryListingIteratedSlot(QString file,QMap
     //This works in concerto with the RequestEtagJob and the Folder object to check if the remote folder changed.
     if (map.contains("getetag")) {
        _etagConcatenation += map.value("getetag");
+
+       if (_firstEtag.isEmpty()) {
+           _firstEtag = map.value("getetag"); // for directory itself
+       }
     }
 }
 
@@ -339,6 +343,7 @@ void DiscoverySingleDirectoryJob::lsJobFinishedWithoutErrorSlot()
         deleteLater();
         return;
     }
+    emit etag(_firstEtag);
     emit etagConcatenation(_etagConcatenation);
     emit finishedWithResult(_results);
     deleteLater();
@@ -410,6 +415,8 @@ void DiscoveryMainThread::doOpendirSlot(QString subPath, DiscoveryDirectoryResul
                      this, SLOT(singleDirectoryJobFirstDirectoryPermissionsSlot(QString)));
     QObject::connect(_singleDirJob, SIGNAL(etagConcatenation(QString)),
                      this, SIGNAL(etagConcatenation(QString)));
+    QObject::connect(_singleDirJob, SIGNAL(etag(QString)),
+                     this, SIGNAL(etag(QString)));
     _singleDirJob->start();
 }
 
diff --git a/src/libsync/discoveryphase.h b/src/libsync/discoveryphase.h
index 0c320a5..71d126a 100644
--- a/src/libsync/discoveryphase.h
+++ b/src/libsync/discoveryphase.h
@@ -87,6 +87,7 @@ public:
 signals:
     void firstDirectoryPermissions(const QString &);
     void etagConcatenation(const QString &);
+    void etag(const QString &);
     void finishedWithResult(const QList<FileStatPointer> &);
     void finishedWithError(int csyncErrnoCode, QString msg);
 private slots:
@@ -97,6 +98,7 @@ private:
     QList<FileStatPointer> _results;
     QString _subPath;
     QString _etagConcatenation;
+    QString _firstEtag;
     AccountPtr _account;
     bool _ignoredFirst;
     QPointer<LsColJob> _lsColJob;
@@ -134,7 +136,8 @@ public slots:
     void slotGetSizeFinishedWithError();
     void slotGetSizeResult(const QVariantMap&);
 signals:
-    void etagConcatenation(QString);
+    void etag(const QString &);
+    void etagConcatenation(const QString &);
 public:
     void setupHooks(DiscoveryJob* discoveryJob, const QString &pathPrefix);
 };
diff --git a/src/libsync/networkjobs.cpp b/src/libsync/networkjobs.cpp
index 0d7f8b6..2a62ee4 100644
--- a/src/libsync/networkjobs.cpp
+++ b/src/libsync/networkjobs.cpp
@@ -46,11 +46,16 @@ RequestEtagJob::RequestEtagJob(AccountPtr account, const QString &path, QObject
 void RequestEtagJob::start()
 {
     QNetworkRequest req;
-    // Let's always request all entries inside a directory. There are/were bugs in the server
-    // where a root or root-folder ETag is not updated when its contents change. We work around
-    // this by concatenating the ETags of the root and its contents.
-    req.setRawHeader("Depth", "1");
-    // See https://github.com/owncloud/core/issues/5255 and others
+    if (_account && _account->rootEtagChangesNotOnlySubFolderEtags()) {
+        // Fixed from 8.1 https://github.com/owncloud/client/issues/3730
+        req.setRawHeader("Depth", "0");
+    } else {
+        // Let's always request all entries inside a directory. There are/were bugs in the server
+        // where a root or root-folder ETag is not updated when its contents change. We work around
+        // this by concatenating the ETags of the root and its contents.
+        req.setRawHeader("Depth", "1");
+        // See https://github.com/owncloud/core/issues/5255 and others
+    }
 
     QByteArray xml("<?xml version=\"1.0\" ?>\n"
                    "<d:propfind xmlns:d=\"DAV:\">\n"
diff --git a/src/libsync/propagateupload.cpp b/src/libsync/propagateupload.cpp
index 905b379..4fe2182 100644
--- a/src/libsync/propagateupload.cpp
+++ b/src/libsync/propagateupload.cpp
@@ -513,11 +513,7 @@ void PropagateUploadFileQNAM::startNextChunk()
     if (!env.isEmpty()) {
         parallelChunkUpload = env != "false" && env != "0";
     } else {
-        auto version = _propagator->account()->serverVersion();
-        auto components = version.split('.');
-        int versionNum = (components.value(0).toInt() << 16)
-                       + (components.value(1).toInt() << 8)
-                       + components.value(2).toInt();
+        int versionNum = _propagator->account()->serverVersionInt();
         if (versionNum < 0x080003) {
             // Disable parallel chunk upload severs older than 8.0.3 to avoid too many
             // internal sever errors (#2743, #2938)
diff --git a/src/libsync/syncengine.cpp b/src/libsync/syncengine.cpp
index 807af16..ca2f8ff 100644
--- a/src/libsync/syncengine.cpp
+++ b/src/libsync/syncengine.cpp
@@ -676,8 +676,13 @@ void SyncEngine::startSync()
     _discoveryMainThread = new DiscoveryMainThread(account());
     _discoveryMainThread->setParent(this);
     connect(this, SIGNAL(finished()), _discoveryMainThread, SLOT(deleteLater()));
-    connect(_discoveryMainThread, SIGNAL(etagConcatenation(QString)), this, SLOT(slotRootEtagReceived(QString)));
-
+    qDebug() << "=====Server" << account()->serverVersion()
+             <<  QString("rootEtagChangesNotOnlySubFolderEtags=%1").arg(account()->rootEtagChangesNotOnlySubFolderEtags());
+    if (account()->rootEtagChangesNotOnlySubFolderEtags()) {
+        connect(_discoveryMainThread, SIGNAL(etag(QString)), this, SLOT(slotRootEtagReceived(QString)));
+    } else {
+        connect(_discoveryMainThread, SIGNAL(etagConcatenation(QString)), this, SLOT(slotRootEtagReceived(QString)));
+    }
 
     DiscoveryJob *discoveryJob = new DiscoveryJob(_csync_ctx);
     discoveryJob->_selectiveSyncBlackList = selectiveSyncBlackList;

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