[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