I found the reason for the kmail composer window being disabled forever, in 
some cases.

A blocking nepomuk query from an akonadiserver thread never terminates, 
because nepomukqueryservice crashes meanwhile.

This leads to two bugs:

1) queryserviceclient should kill blocking queries when _k_serviceUnregistered
tells us the service crashed.
The attached patch works for me, OK if I commit it to all appropriate branches?
(kdelibs 4.8, kdelibs 4.9, nepomuk-core, akonadi master -- LOL)

2) the crash itself should be fixed ;)

A valgrind log of `nepomukservicestub nepomukqueryservice` gives this:

"/d/kde/inst/kde4.9/bin/nepomukservicestub(19732)" Soprano: "Failed to write to 
fd -1 (Bad file descriptor)"
"/d/kde/inst/kde4.9/bin/nepomukservicestub(19732)" Soprano: "Failed to write 
unsigned int32."
"/d/kde/inst/kde4.9/bin/nepomukservicestub(19732)" Soprano: "Timeout (5)": 
"Command timed out."
==19732== Thread 3:
==19732== Invalid read of size 8
==19732==    at 0xC5AB6DA: 
QPointer<Soprano::Client::ClientConnection>::operator->() const (qpointer.h:74)
==19732==    by 0xC5AA70A: Soprano::Client::ClientModel::executeQuery(QString 
const&, Soprano::Query::QueryLanguage, QString const&) const 
(clientmodel.cpp:106)
==19732==    by 0x68E9319: Nepomuk2::MainModel::executeQuery(QString const&, 
Soprano::Query::QueryLanguage, QString const&) const (nepomukmainmodel.cpp:182)
==19732==    by 0x12BDDEED: Nepomuk2::Query::SearchRunnable::run() 
(searchrunnable.cpp:89)
==19732==    by 0x4ECA2FC: QThreadPoolThread::run() (qthreadpool.cpp:107)
==19732==    by 0x4EDAF27: QThreadPrivate::start(void*) (qthread_unix.cpp:307)
==19732==    by 0x53CCF04: start_thread (in /lib64/libpthread-2.14.1.so)
==19732==    by 0x86CD10C: clone (in /lib64/libc-2.14.1.so)
==19732==  Address 0x117af938 is 72 bytes inside a block of size 80 free'd
==19732==    at 0x4C28706: operator delete(void*) (vg_replace_malloc.c:457)
==19732==    by 0xC5AA2ED: Soprano::Client::ClientModel::~ClientModel() 
(clientmodel.cpp:58)
==19732==    by 0x68E8BAB: (anonymous 
namespace)::GlobalModelContainer::init(bool) (nepomukmainmodel.cpp:82)
==19732==    by 0x68E8E58: (anonymous namespace)::GlobalModelContainer::model() 
(nepomukmainmodel.cpp:100)
==19732==    by 0x68E932D: Nepomuk2::MainModel::executeQuery(QString const&, 
Soprano::Query::QueryLanguage, QString const&) const (nepomukmainmodel.cpp:183)
==19732==    by 0x12BDDEED: Nepomuk2::Query::SearchRunnable::run() 
(searchrunnable.cpp:89)
==19732==    by 0x4ECA2FC: QThreadPoolThread::run() (qthreadpool.cpp:107)
==19732==    by 0x4EDAF27: QThreadPrivate::start(void*) (qthread_unix.cpp:307)
==19732==    by 0x53CCF04: start_thread (in /lib64/libpthread-2.14.1.so)
==19732==    by 0x86CD10C: clone (in /lib64/libc-2.14.1.so)
==19732== 

Obviously the "delete localSocketModel" in nepomukmainmodel.cpp:82 is the 
problem,
I assume because it's used in another thread at the same time.
Or maybe the underlying soprano connection is used later on in the same thread; 
valgrind isn't really clear.

The -1 file descriptor is weird too, does anyone know the reason for that?

PS: please cc me, I'm not subscribed to [email protected]

-- 
David Faure, [email protected], http://www.davidfaure.fr
Sponsored by Nokia to work on KDE, incl. KDE Frameworks 5
diff --git a/server/src/nepomuk/queryserviceclient.cpp b/server/src/nepomuk/queryserviceclient.cpp
index 0ff1506..e75ad78 100644
--- a/server/src/nepomuk/queryserviceclient.cpp
+++ b/server/src/nepomuk/queryserviceclient.cpp
@@ -124,6 +124,7 @@ void Nepomuk::Query::QueryServiceClient::Private::_k_serviceUnregistered(const Q
 {
     if (service == QLatin1String("org.kde.nepomuk.services.nepomukqueryservice")) {
         Q_EMIT q->serviceAvailabilityChanged(false);
+        q->close();
     }
 }
 
_______________________________________________
Nepomuk mailing list
[email protected]
https://mail.kde.org/mailman/listinfo/nepomuk

Reply via email to