[prev in list] [next in list] [prev in thread] [next in thread]
List: kde-commits
Subject: [muon/frameworks] libmuon/backends/PackageKitBackend: We were not processing the details properly
From: Aleix Pol <aleixpol () kde ! org>
Date: 2014-10-01 0:44:31
Message-ID: E1XZ81v-0005Eh-DE () scm ! kde ! org
[Download RAW message or body]
Git commit 1a7bb449a29830bc3f85f683251335a64a3cdc91 by Aleix Pol.
Committed on 01/10/2014 at 00:43.
Pushed by apol into branch 'frameworks'.
We were not processing the details properly
First we can't fetch all the details at once. PackageKit has a limit of
packages to process at the same time, process them one after the other.
Also differentiate between packageName and packageId.
M +40 -12 libmuon/backends/PackageKitBackend/PackageKitBackend.cpp
M +5 -1 libmuon/backends/PackageKitBackend/PackageKitBackend.h
http://commits.kde.org/muon/1a7bb449a29830bc3f85f683251335a64a3cdc91
diff --git a/libmuon/backends/PackageKitBackend/PackageKitBackend.cpp \
b/libmuon/backends/PackageKitBackend/PackageKitBackend.cpp index 2fcbb5d..d62603d \
100644
--- a/libmuon/backends/PackageKitBackend/PackageKitBackend.cpp
+++ b/libmuon/backends/PackageKitBackend/PackageKitBackend.cpp
@@ -112,28 +112,56 @@ void \
PackageKitBackend::getPackagesFinished(PackageKit::Transaction::Exit exit) if (exit \
!= PackageKit::Transaction::ExitSuccess) { qWarning() << "error while fetching \
details" << exit; }
- PackageKit::Transaction* transaction = \
PackageKit::Daemon::global()->getDetails(m_updatingPackages.keys());
- connect(transaction, SIGNAL(details(PackageKit::Details)), \
SLOT(packageDetails(PackageKit::Details)));
- connect(transaction, SIGNAL(finished(PackageKit::Transaction::Exit,uint)), \
SLOT(getDetailsFinished(PackageKit::Transaction::Exit,uint))); +
+ m_packages = m_updatingPackages;
+ setFetching(false);
+ QStringList ids;
+ foreach(AbstractResource* res, m_updatingPackages) {
+ ids += qobject_cast<PackageKitResource*>(res)->availablePackageId();
+ }
+
+// PackageKit has a maximum of packages to process called \
PK_TRANSACTION_MAX_PACKAGES_TO_PROCESS +// which is 5200 today. To workaround that, \
we'll create different transactions that we'll process +// one after the other.
+
+ for(int i=0, step=1000; i<m_updatingPackages.count(); i+=step) {
+ QStringList chunk = ids.mid(i, qMin(step, m_updatingPackages.count()-i));
+ m_transactionQueue.append([chunk]() { return \
PackageKit::Daemon::global()->getDetails(chunk); }); + }
+ iterateTransactionQueue();
+}
+
+void PackageKitBackend::transactionError(PackageKit::Transaction::Error, const \
QString& message) +{
+ qWarning() << "Transaction error: " << message << sender();
}
-void PackageKitBackend::getDetailsFinished(PackageKit::Transaction::Exit exit, uint)
+void PackageKitBackend::queueTransactionFinished(PackageKit::Transaction::Exit exit, \
uint) {
+// that's a workaround to some kind of bug I don't really understand
+ if (exit == PackageKit::Transaction::ExitUnknown)
+ return;
+
if (exit != PackageKit::Transaction::ExitSuccess) {
qWarning() << "error while fetching details" << exit;
}
-// commented out because it's not the case currently, the finished signal is \
getting
-// emitted twice, for some reason. *sigh*
-// Q_ASSERT(m_isFetching);
- m_packages = m_updatingPackages;
- setFetching(false);
+ iterateTransactionQueue();
}
-void PackageKitBackend::packageDetails(const PackageKit::Details& details)
+void PackageKitBackend::iterateTransactionQueue()
{
- Q_ASSERT(m_isFetching);
+ if (m_transactionQueue.isEmpty())
+ return;
- PackageKitResource* res = \
qobject_cast<PackageKitResource*>(m_updatingPackages.value(details.packageId())); + \
PackageKit::Transaction* transaction = m_transactionQueue.takeFirst()(); + \
connect(transaction, SIGNAL(details(PackageKit::Details)), \
SLOT(packageDetails(PackageKit::Details))); + connect(transaction, \
SIGNAL(errorCode(PackageKit::Transaction::Error,QString)), \
SLOT(transactionError(PackageKit::Transaction::Error,QString))); + \
connect(transaction, SIGNAL(finished(PackageKit::Transaction::Exit,uint)), \
SLOT(queueTransactionFinished(PackageKit::Transaction::Exit,uint))); +}
+
+void PackageKitBackend::packageDetails(const PackageKit::Details& details)
+{
+ PackageKitResource* res = \
qobject_cast<PackageKitResource*>(m_updatingPackages.value(PackageKit::Daemon::packageName(details.packageId())));
Q_ASSERT(res);
res->setDetails(details);
}
diff --git a/libmuon/backends/PackageKitBackend/PackageKitBackend.h \
b/libmuon/backends/PackageKitBackend/PackageKitBackend.h index d263ca9..f0c6bf4 \
100644
--- a/libmuon/backends/PackageKitBackend/PackageKitBackend.h
+++ b/libmuon/backends/PackageKitBackend/PackageKitBackend.h
@@ -28,6 +28,7 @@
#include <qpointer.h>
#include <PackageKit/Transaction>
#include <AppstreamQt/database.h>
+#include <functional>
class PackageKitUpdater;
@@ -63,9 +64,11 @@ class MUONPRIVATE_EXPORT PackageKitBackend : public \
AbstractResourcesBackend void updateDatabase();
void addPackage(PackageKit::Transaction::Info info, const QString \
&packageId, const QString &summary); void packageDetails(const PackageKit::Details& \
details);
- void getDetailsFinished(PackageKit::Transaction::Exit, uint);
+ void transactionError(PackageKit::Transaction::Error, const QString& \
message); + void queueTransactionFinished(PackageKit::Transaction::Exit,uint);
private:
+ void iterateTransactionQueue();
void setFetching(bool f);
QHash<QString, AbstractResource*> m_packages;
@@ -76,6 +79,7 @@ class MUONPRIVATE_EXPORT PackageKitBackend : public \
AbstractResourcesBackend QList<PackageKitResource*> m_upgradeablePackages;
QPointer<PackageKit::Transaction> m_refresher;
bool m_isFetching;
+ QList<std::function<PackageKit::Transaction*()>> m_transactionQueue;
};
#endif // PACKAGEKITBACKEND_H
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic