Hello community,

here is the log from the commit of package akonadi-runtime for openSUSE:Factory 
checked in at 2015-07-05 17:55:15
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/akonadi-runtime (Old)
 and      /work/SRC/openSUSE:Factory/.akonadi-runtime.new (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "akonadi-runtime"

Changes:
--------
--- /work/SRC/openSUSE:Factory/akonadi-runtime/akonadi-runtime.changes  
2014-11-28 08:48:38.000000000 +0100
+++ /work/SRC/openSUSE:Factory/.akonadi-runtime.new/akonadi-runtime.changes     
2015-07-05 17:55:16.000000000 +0200
@@ -1,0 +2,7 @@
+Tue Jun 30 05:31:19 UTC 2015 - [email protected]
+
+- Add do-not-leak-old-external-payload-files.diff: do not leak
+  external payload files, fixes disk usage of akonadi file_db_data 
+  (kde#341884)
+
+-------------------------------------------------------------------

New:
----
  do-not-leak-old-external-payload-files.diff

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ akonadi-runtime.spec ++++++
--- /var/tmp/diff_new_pack.C2ViF9/_old  2015-07-05 17:55:17.000000000 +0200
+++ /var/tmp/diff_new_pack.C2ViF9/_new  2015-07-05 17:55:17.000000000 +0200
@@ -1,7 +1,7 @@
 #
 # spec file for package akonadi-runtime
 #
-# Copyright (c) 2014 SUSE LINUX Products GmbH, Nuernberg, Germany.
+# Copyright (c) 2015 SUSE LINUX GmbH, Nuernberg, Germany.
 #
 # All modifications and additions to the file contributed by third parties
 # remain the property of their copyright owners, unless otherwise agreed
@@ -27,6 +27,8 @@
 Source:         
http://download.kde.org/stable/%{rname}/src/%{rname}-%{version}.tar.bz2
 Source1:        baselibs.conf
 Source99:       akonadi-runtime-rpmlintrc
+# PATCH-FIX-UPSTREAM: Do not leak external payload files (kde#341884)
+Patch0:         do-not-leak-old-external-payload-files.diff
 BuildRequires:  boost-devel
 BuildRequires:  cmake >= 2.8.8
 BuildRequires:  fdupes
@@ -70,6 +72,7 @@
 
 %prep
 %setup -q -n %{rname}-%{version}
+%patch0 -p1
 
 %build
   %cmake_kde4 -d build -- -DCONFIG_INSTALL_DIR=/etc 
-DINSTALL_QSQLITE_IN_QT_PREFIX=TRUE -DWITH_SOPRANO=FALSE

++++++ do-not-leak-old-external-payload-files.diff ++++++
From: Dan Vrátil <[email protected]>
Date: Mon, 29 Jun 2015 20:45:11 +0000
Subject: Don't leak old external payload files
X-Git-Url: 
http://quickgit.kde.org/?p=akonadi.git&a=commitdiff&h=9c0dc6b3f0826d32eac310b2e7ecd858ca3df681
---
Don't leak old external payload files

Actually delete old payload files after we increase the payload revision or
switch from external to internal payload. This caused 
~/.local/share/akonadi/file_db_data
to grow insanely for all users, leaving them with many duplicated files (just 
with
different revisions).

It is recommended that users run akonadictl fsck to clean up the leaked payload
files.

Note that there won't be any more releases of Akonadi 1.13 (and this has been
fixed in master already), so I strongly recommend distributions to pick this
patch into their packaging.

BUG: 341884
CCBUG: 338402
---


--- a/server/src/storage/partstreamer.cpp
+++ b/server/src/storage/partstreamer.cpp
@@ -290,6 +290,12 @@
         mDataChanged = true;
     }
 
+    // If the part is external, remember it's current file name
+    QString originalFile;
+    if (part.isValid() && part.external()) {
+        originalFile = PartHelper::resolveAbsolutePath(part.data());
+    }
+
     part.setPartType(partType);
     part.setVersion(partVersion);
     part.setPimItemId(mItem.id());
@@ -306,6 +312,14 @@
         *changed = mDataChanged;
     }
 
+    if (!originalFile.isEmpty()) {
+        // If the part was external but is not anymore, or if it's still 
external
+        // but the filename has changed (revision update), remove the original 
file
+        if (!part.external() || (part.external() && originalFile != 
PartHelper::resolveAbsolutePath(part.data()))) {
+            PartHelper::removeFile(originalFile);
+        }
+    }
+
     return ok;
 }
 

--- a/server/tests/unittest/partstreamertest.cpp
+++ b/server/tests/unittest/partstreamertest.cpp
@@ -91,6 +91,7 @@
         QTest::addColumn<qint64>("expectedPartSize");
         QTest::addColumn<bool>("expectedChanged");
         QTest::addColumn<bool>("isExternal");
+        QTest::addColumn<int>("version");
         QTest::addColumn<PimItem>("pimItem");
 
         PimItem item;
@@ -101,22 +102,22 @@
         QVERIFY(item.insert());
 
         // Order of these tests matters!
-        QTest::newRow("item 1, internal") << QByteArray("PLD:DATA") << 
QByteArray("123") << 3ll << true << false << item;
-        QTest::newRow("item 1, change to external") << QByteArray("PLD:DATA") 
<< QByteArray("123456789") << 9ll << true << true << item;
-        QTest::newRow("item 1, update external") << QByteArray("PLD:DATA") << 
QByteArray("987654321") << 9ll << true << true << item;
-        QTest::newRow("item 1, external, no change") << QByteArray("PLD:DATA") 
<< QByteArray("987654321") << 9ll << false << true << item;
-        QTest::newRow("item 1, change to internal") << QByteArray("PLD:DATA") 
<< QByteArray("1234") << 4ll << true << false << item;
-        QTest::newRow("item 1, internal, no change") << QByteArray("PLD:DATA") 
<< QByteArray("1234") << 4ll << false << false << item;
+        QTest::newRow("item 1, internal") << QByteArray("PLD:DATA") << 
QByteArray("123") << 3ll << true << false << -1 << item;
+        QTest::newRow("item 1, change to external") << QByteArray("PLD:DATA") 
<< QByteArray("123456789") << 9ll << true << true << 0 << item;
+        QTest::newRow("item 1, update external") << QByteArray("PLD:DATA") << 
QByteArray("987654321") << 9ll << true << true << 1 << item;
+        QTest::newRow("item 1, external, no change") << QByteArray("PLD:DATA") 
<< QByteArray("987654321") << 9ll << false << true << 2 << item;
+        QTest::newRow("item 1, change to internal") << QByteArray("PLD:DATA") 
<< QByteArray("1234") << 4ll << true << false << 2 << item;
+        QTest::newRow("item 1, internal, no change") << QByteArray("PLD:DATA") 
<< QByteArray("1234") << 4ll << false << false << 2 << item;
     }
 
     void testStreamer()
     {
-        return;
         QFETCH(QByteArray, expectedPartName);
         QFETCH(QByteArray, expectedData);
         QFETCH(qint64, expectedPartSize);
         QFETCH(bool, expectedChanged);
         QFETCH(bool, isExternal);
+        QFETCH(int, version);
         QFETCH(PimItem, pimItem);
 
         FakeConnection connection;
@@ -160,17 +161,18 @@
 
         PimItem item = PimItem::retrieveById(pimItem.id());
         const QVector<Part> parts = item.parts();
-        QVERIFY(parts.count() == 1);
+        QCOMPARE(parts.count(), 1);
         const Part part = parts[0];
         QCOMPARE(part.datasize(), expectedPartSize);
         QCOMPARE(part.external(), isExternal);
+        qDebug() << part.version() << part.data();
         const QByteArray data = part.data();
         if (isExternal) {
             QVERIFY(streamerSpy.count() == 1);
             QVERIFY(streamerSpy.first().count() == 1);
             const Response response = 
streamerSpy.first().first().value<Akonadi::Server::Response>();
             const QByteArray str = response.asString();
-            const QByteArray expectedResponse = "+ STREAM [FILE " + 
QByteArray::number(part.id()) + "_r" + QByteArray::number(part.version()) + "]";
+            const QByteArray expectedResponse = "+ STREAM [FILE " + 
QByteArray::number(part.id()) + "_r" + QByteArray::number(version) + "]";
             QCOMPARE(QString::fromUtf8(str), 
QString::fromUtf8(expectedResponse));
 
             QFile file(PartHelper::resolveAbsolutePath(data));
@@ -182,7 +184,7 @@
             QCOMPARE(fileData, expectedData);
 
             // Make sure no previous versions are left behind in file_db_data
-            for (int i = 0; i < part.version(); ++i) {
+            for (int i = 0; i < version; ++i) {
                 const QByteArray fileName = QByteArray::number(part.id()) + 
"_r" + QByteArray::number(part.version());
                 const QString filePath = 
PartHelper::resolveAbsolutePath(fileName);
                 QVERIFY(!QFile::exists(filePath));
@@ -194,7 +196,7 @@
             QCOMPARE(data, expectedData);
 
             // Make sure nothing is left behind in file_db_data
-            for (int i = 0; i <= part.version(); ++i) {
+            for (int i = 0; i <= version; ++i) {
                 const QByteArray fileName = QByteArray::number(part.id()) + 
"_r" + QByteArray::number(part.version());
                 const QString filePath = 
PartHelper::resolveAbsolutePath(fileName);
                 QVERIFY(!QFile::exists(filePath));


Reply via email to