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