Sun Jan 10 19:40:30 2016 UTC ()
Don't leak old external payload files. Bump PKGREVISION.
(markd)
diff -r1.70 -r1.71 pkgsrc/mail/akonadi/Makefile
diff -r1.22 -r1.23 pkgsrc/mail/akonadi/distinfo
diff -r0 -r1.1 pkgsrc/mail/akonadi/patches/patch-server_src_storage_partstreamer.cpp
diff -r0 -r1.1 pkgsrc/mail/akonadi/patches/patch-server_tests_unittest_partstreamertest.cpp
--- pkgsrc/mail/akonadi/Makefile 2015/10/10 01:58:11 1.70
+++ pkgsrc/mail/akonadi/Makefile 2016/01/10 19:40:30 1.71
| @@ -1,17 +1,17 @@ | | | @@ -1,17 +1,17 @@ |
1 | # $NetBSD: Makefile,v 1.70 2015/10/10 01:58:11 ryoon Exp $ | | 1 | # $NetBSD: Makefile,v 1.71 2016/01/10 19:40:30 markd Exp $ |
2 | | | 2 | |
3 | DISTNAME= akonadi-1.13.0 | | 3 | DISTNAME= akonadi-1.13.0 |
4 | PKGREVISION= 4 | | 4 | PKGREVISION= 5 |
5 | CATEGORIES= mail | | 5 | CATEGORIES= mail |
6 | MASTER_SITES= ftp://kde.mirror.anlx.net/stable/akonadi/src/ | | 6 | MASTER_SITES= ftp://kde.mirror.anlx.net/stable/akonadi/src/ |
7 | EXTRACT_SUFX= .tar.bz2 | | 7 | EXTRACT_SUFX= .tar.bz2 |
8 | | | 8 | |
9 | MAINTAINER= markd@NetBSD.org | | 9 | MAINTAINER= markd@NetBSD.org |
10 | HOMEPAGE= http://pim.kde.org/akonadi/ | | 10 | HOMEPAGE= http://pim.kde.org/akonadi/ |
11 | COMMENT= The KDE PIM Storage Service | | 11 | COMMENT= The KDE PIM Storage Service |
12 | LICENSE= gnu-lgpl-v2.1 | | 12 | LICENSE= gnu-lgpl-v2.1 |
13 | | | 13 | |
14 | # BUILD_MAKE_FLAGS+= VERBOSE=1 | | 14 | # BUILD_MAKE_FLAGS+= VERBOSE=1 |
15 | | | 15 | |
16 | BUILD_DEPENDS+= automoc4>=0.9.87:../../devel/automoc4 | | 16 | BUILD_DEPENDS+= automoc4>=0.9.87:../../devel/automoc4 |
17 | BUILD_DEPENDS+= libxslt-[0-9]*:../../textproc/libxslt | | 17 | BUILD_DEPENDS+= libxslt-[0-9]*:../../textproc/libxslt |
--- pkgsrc/mail/akonadi/distinfo 2015/11/03 23:27:01 1.22
+++ pkgsrc/mail/akonadi/distinfo 2016/01/10 19:40:30 1.23
| @@ -1,10 +1,12 @@ | | | @@ -1,10 +1,12 @@ |
1 | $NetBSD: distinfo,v 1.22 2015/11/03 23:27:01 agc Exp $ | | 1 | $NetBSD: distinfo,v 1.23 2016/01/10 19:40:30 markd Exp $ |
2 | | | 2 | |
3 | SHA1 (akonadi-1.13.0.tar.bz2) = 9d594b5840e2e5d90057a7e5d8545004a3476bc0 | | 3 | SHA1 (akonadi-1.13.0.tar.bz2) = 9d594b5840e2e5d90057a7e5d8545004a3476bc0 |
4 | RMD160 (akonadi-1.13.0.tar.bz2) = 411e4e3b203cd9681b10d21af75806f723a687ec | | 4 | RMD160 (akonadi-1.13.0.tar.bz2) = 411e4e3b203cd9681b10d21af75806f723a687ec |
5 | SHA512 (akonadi-1.13.0.tar.bz2) = 4bf2026c3807b5493c9f63d0c2bff2e6db00fbe97a4e2c2f707aaa3bf4a848b70dd9657d8fa1743690e8eeefd967de4895c1329c6bb817a1d023fe398285222f | | 5 | SHA512 (akonadi-1.13.0.tar.bz2) = 4bf2026c3807b5493c9f63d0c2bff2e6db00fbe97a4e2c2f707aaa3bf4a848b70dd9657d8fa1743690e8eeefd967de4895c1329c6bb817a1d023fe398285222f |
6 | Size (akonadi-1.13.0.tar.bz2) = 294198 bytes | | 6 | Size (akonadi-1.13.0.tar.bz2) = 294198 bytes |
7 | SHA1 (patch-agentserver_CMakeLists.txt) = 01249fd521e23a8cb8c7119ad9c8cd9877338c54 | | 7 | SHA1 (patch-agentserver_CMakeLists.txt) = 01249fd521e23a8cb8c7119ad9c8cd9877338c54 |
8 | SHA1 (patch-cmake_modules_FindSqlite.cmake) = 3deefae90ec3485affeda4de283d4166d85c41fc | | 8 | SHA1 (patch-cmake_modules_FindSqlite.cmake) = 3deefae90ec3485affeda4de283d4166d85c41fc |
9 | SHA1 (patch-git_21465191) = 735e05bfa08c113ec196049dcea035f889cd7b6d | | 9 | SHA1 (patch-git_21465191) = 735e05bfa08c113ec196049dcea035f889cd7b6d |
10 | SHA1 (patch-libs_xdgbasedirs.cpp) = eccf2de9445ea63eb09529e077d36f43303bd0ee | | 10 | SHA1 (patch-libs_xdgbasedirs.cpp) = eccf2de9445ea63eb09529e077d36f43303bd0ee |
| | | 11 | SHA1 (patch-server_src_storage_partstreamer.cpp) = c8de60299129673d5cfb699c8c73a9275088fd61 |
| | | 12 | SHA1 (patch-server_tests_unittest_partstreamertest.cpp) = 1068831b3abeb855f759941d5e38bd86ef89cf0a |
$NetBSD: patch-server_src_storage_partstreamer.cpp,v 1.1 2016/01/10 19:40:30 markd Exp $
From: Dan Vrátil <dvratil@redhat.com>
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
--- server/src/storage/partstreamer.cpp.orig 2014-08-10 10:38:58.000000000 +0000
+++ server/src/storage/partstreamer.cpp
@@ -290,6 +290,12 @@ bool PartStreamer::stream(const QByteArr
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 @@ bool PartStreamer::stream(const QByteArr
*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;
}
$NetBSD: patch-server_tests_unittest_partstreamertest.cpp,v 1.1 2016/01/10 19:40:30 markd Exp $
From: Dan Vrátil <dvratil@redhat.com>
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
--- server/tests/unittest/partstreamertest.cpp.orig 2014-08-10 10:38:58.000000000 +0000
+++ server/tests/unittest/partstreamertest.cpp
@@ -91,6 +91,7 @@ private Q_SLOTS:
QTest::addColumn<qint64>("expectedPartSize");
QTest::addColumn<bool>("expectedChanged");
QTest::addColumn<bool>("isExternal");
+ QTest::addColumn<int>("version");
QTest::addColumn<PimItem>("pimItem");
PimItem item;
@@ -101,13 +102,12 @@ private Q_SLOTS:
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()
{
@@ -117,6 +117,7 @@ private Q_SLOTS:
QFETCH(qint64, expectedPartSize);
QFETCH(bool, expectedChanged);
QFETCH(bool, isExternal);
+ QFETCH(int, version);
QFETCH(PimItem, pimItem);
FakeConnection connection;
@@ -160,17 +161,18 @@ private Q_SLOTS:
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 @@ private Q_SLOTS:
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 @@ private Q_SLOTS:
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));