[Pkg-owncloud-commits] [owncloud-client] 35/484: Sync: An initial diskspace check #2939

Sandro Knauß hefee-guest at moszumanska.debian.org
Wed Dec 16 00:37:08 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 12dc372b2147f82a68237507e8abefeadd32016c
Author: Christian Kamm <mail at ckamm.de>
Date:   Wed Sep 30 15:07:45 2015 +0200

    Sync: An initial diskspace check #2939
    
    * Before each sync, check that there are at least
      250 MB of space available and abort otherwise.
    * Can be overridden with OWNCLOUD_MIN_FREE_SPACE
---
 src/libsync/syncengine.cpp | 29 +++++++++++++++++++++++++++++
 src/libsync/utility.cpp    | 23 ++++++++++-------------
 src/libsync/utility.h      |  2 +-
 3 files changed, 40 insertions(+), 14 deletions(-)

diff --git a/src/libsync/syncengine.cpp b/src/libsync/syncengine.cpp
index 62f6c10..e4bb8ce 100644
--- a/src/libsync/syncengine.cpp
+++ b/src/libsync/syncengine.cpp
@@ -54,6 +54,18 @@ extern "C" const char *csync_instruction_str(enum csync_instructions_e instr);
 
 namespace OCC {
 
+/* The minimum amount of space required to start a sync run */
+static qint64 minFreeSpace()
+{
+    static bool ok = false;
+    static qint64 freeSpace = qgetenv("OWNCLOUD_MIN_FREE_SPACE").toLongLong(&ok);
+    if (ok) {
+        return freeSpace;
+    }
+
+    return 250 * 1000 * 1000LL;
+}
+
 bool SyncEngine::_syncRunning = false;
 
 SyncEngine::SyncEngine(AccountPtr account, CSYNC *ctx, const QString& localPath,
@@ -599,6 +611,23 @@ void SyncEngine::startSync()
         return;
     }
 
+    // Check free size on disk first.
+    const qint64 minFree = minFreeSpace();
+    const qint64 freeBytes = Utility::freeDiskSpace(_localPath);
+    if (freeBytes >= 0) {
+        qDebug() << "There are" << freeBytes << "bytes available at" << _localPath
+                 << "and at least" << minFree << "are required";
+        if (freeBytes < minFree) {
+            emit csyncError(tr("Only %1 are available, need at least %2 to start").arg(
+                                Utility::octetsToString(freeBytes),
+                                Utility::octetsToString(minFree)));
+            finalize();
+            return;
+        }
+    } else {
+        qDebug() << "Could not determine free space available at" << _localPath;
+    }
+
     _syncedItems.clear();
     _syncItemMap.clear();
     _needsUpdate = false;
diff --git a/src/libsync/utility.cpp b/src/libsync/utility.cpp
index 5babf16..4f63ebf 100644
--- a/src/libsync/utility.cpp
+++ b/src/libsync/utility.cpp
@@ -180,29 +180,26 @@ void Utility::setLaunchOnStartup(const QString &appName, const QString& guiName,
     setLaunchOnStartup_private(appName, guiName, enable);
 }
 
-qint64 Utility::freeDiskSpace(const QString &path, bool *ok)
+qint64 Utility::freeDiskSpace(const QString &path)
 {
 #if defined(Q_OS_MAC) || defined(Q_OS_FREEBSD) || defined(Q_OS_FREEBSD_KERNEL) || defined(Q_OS_NETBSD) || defined(Q_OS_OPENBSD)
-    Q_UNUSED(ok)
     struct statvfs stat;
-    statvfs(path.toUtf8().data(), &stat);
-    return (qint64) stat.f_bavail * stat.f_frsize;
+    if (statvfs(path.toLocal8Bit().data(), &stat) == 0) {
+        return (qint64) stat.f_bavail * stat.f_frsize;
+    }
 #elif defined(Q_OS_UNIX)
-    Q_UNUSED(ok)
     struct statvfs64 stat;
-    statvfs64(path.toUtf8().data(), &stat);
-    return (qint64) stat.f_bavail * stat.f_frsize;
+    if (statvfs64(path.toLocal8Bit().data(), &stat) == 0) {
+        return (qint64) stat.f_bavail * stat.f_frsize;
+    }
 #elif defined(Q_OS_WIN)
     ULARGE_INTEGER freeBytes;
     freeBytes.QuadPart = 0L;
-    if( !GetDiskFreeSpaceEx( reinterpret_cast<const wchar_t *>(path.utf16()), &freeBytes, NULL, NULL ) ) {
-        if (ok) *ok = false;
+    if (GetDiskFreeSpaceEx( reinterpret_cast<const wchar_t *>(path.utf16()), &freeBytes, NULL, NULL )) {
+        return freeBytes.QuadPart;
     }
-    return freeBytes.QuadPart;
-#else
-    if (ok) *ok = false;
-    return 0;
 #endif
+    return -1;
 }
 
 QString Utility::compactFormatDouble(double value, int prec, const QString& unit)
diff --git a/src/libsync/utility.h b/src/libsync/utility.h
index 40e7961..d4bc2f8f 100644
--- a/src/libsync/utility.h
+++ b/src/libsync/utility.h
@@ -38,7 +38,7 @@ namespace Utility
     OWNCLOUDSYNC_EXPORT QByteArray userAgentString();
     OWNCLOUDSYNC_EXPORT bool hasLaunchOnStartup(const QString &appName);
     OWNCLOUDSYNC_EXPORT void setLaunchOnStartup(const QString &appName, const QString& guiName, bool launch);
-    OWNCLOUDSYNC_EXPORT qint64 freeDiskSpace(const QString &path, bool *ok = 0);
+    OWNCLOUDSYNC_EXPORT qint64 freeDiskSpace(const QString &path);
     OWNCLOUDSYNC_EXPORT QString toCSyncScheme(const QString &urlStr);
     /** Like QLocale::toString(double, 'f', prec), but drops trailing zeros after the decimal point */
 

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