Bug 503362 - Sometimes whole KDevelop freezes when editing file on slow disk (because sync on main thread)
Summary: Sometimes whole KDevelop freezes when editing file on slow disk (because sync...
Status: REPORTED
Alias: None
Product: kdevelop
Classification: Applications
Component: general (other bugs)
Version First Reported In: 6.1.241203
Platform: Arch Linux Linux
: NOR normal
Target Milestone: ---
Assignee: kdevelop-bugs-null
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2025-04-25 19:24 UTC by Dāvis
Modified: 2025-04-26 09:01 UTC (History)
1 user (show)

See Also:
Latest Commit:
Version Fixed/Implemented In:
Sentry Crash Report:


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Dāvis 2025-04-25 19:24:46 UTC
SUMMARY

When editing file on slow disk then whole KDevelop freezes/gets stuck

STEPS TO REPRODUCE
1. Edit file on slow disk (maybe try on NFS)

OBSERVED RESULT

Sometimes whole KDevelop freezes

EXPECTED RESULT

Save/sync in another thread not to block UI

SOFTWARE/OS VERSIONS
KDE Plasma Version: 6.3.4
KDE Frameworks Version: 6.12.0
Qt Version: 6.9.0

ADDITIONAL INFORMATION

This happens because `fdatasync` is invoked in Main Thread.
I noticed 2 separate cases

One when `.kate-swp` file is synced

> fd is file like /mnt/path/.filename.c.kate-swp

> Thread 1 (Thread 0x7ebd7ada66c0 (LWP 336849) "kdevelop"):
> #0  __GI_fdatasync (fd=75) at ../sysdeps/unix/sysv/linux/fdatasync.c:27
> #1  0x00007ebdfffb6cc9 in QtPrivate::QSlotObjectBase::call (this=<optimized out>, r=<optimized out>, a=<optimized out>, this=<optimized out>, r=<optimized out>, a=<optimized out>) at /usr/src/debug/qt6-base/qtbase/src/corelib/kernel/qobjectdefs_impl.h:461
> #2  doActivate<false> (sender=<optimized out>, signal_index=<optimized out>, argv=<optimized out>) at /usr/src/debug/qt6-base/qtbase/src/corelib/kernel/qobject.cpp:4138
> #3  0x00007ebdfffbd8a5 in QMetaObject::activate<void, QTimer::QPrivateSignal> (sender=0x5fda75824150, mo=<optimized out>, local_signal_index=0, ret=0x0) at /usr/src/debug/qt6-base/qtbase/src/corelib/kernel/qobjectdefs.h:306
> #4  QTimer::timeout (this=0x5fda75824150, _t1=...) at /usr/src/debug/qt6-base/build/src/corelib/Core_autogen/include/moc_qtimer.cpp:182
> #5  QTimer::timerEvent (e=<optimized out>, this=0x5fda75824150) at /usr/src/debug/qt6-base/qtbase/src/corelib/kernel/qtimer.cpp:285
> #6  QTimer::timerEvent (this=0x5fda75824150, e=<optimized out>) at /usr/src/debug/qt6-base/qtbase/src/corelib/kernel/qtimer.cpp:279
> #7  0x00007ebdfffa5459 in QObject::event (this=0x5fda75824150, e=0x7ffeacb73020) at /usr/src/debug/qt6-base/qtbase/src/corelib/kernel/qobject.cpp:1406
> #8  0x00007ebe010fed9e in QApplicationPrivate::notify_helper (this=<optimized out>, receiver=0x5fda75824150, e=0x7ffeacb73020) at /usr/src/debug/qt6-base/qtbase/src/widgets/kernel/qapplication.cpp:3301
> #9  0x00007ebdfff5a018 in QCoreApplication::notifyInternal2 (receiver=0x5fda75824150, event=0x7ffeacb73020) at /usr/src/debug/qt6-base/qtbase/src/corelib/kernel/qcoreapplication.cpp:1106
> #10 0x00007ebe000de200 in QCoreApplication::sendEvent (receiver=<optimized out>, event=0x7ffeacb73020) at /usr/src/debug/qt6-base/qtbase/src/corelib/kernel/qcoreapplication.cpp:1546
> #11 QTimerInfoList::activateTimers (this=<optimized out>) at /usr/src/debug/qt6-base/qtbase/src/corelib/kernel/qtimerinfo_unix.cpp:426
> #12 0x00007ebe001cfe61 in timerSourceDispatch (source=<optimized out>) at /usr/src/debug/qt6-base/qtbase/src/corelib/kernel/qeventdispatcher_glib.cpp:152
> #13 idleTimerSourceDispatch (source=source@entry=0x5fda72c26ab0) at /usr/src/debug/qt6-base/qtbase/src/corelib/kernel/qeventdispatcher_glib.cpp:199
> #14 0x00007ebdfcacd1e4 in g_main_dispatch (context=0x7ebdd4000f00) at ../glib/glib/gmain.c:3398
> #15 0x00007ebdfcb30e97 in g_main_context_dispatch_unlocked (context=0x7ebdd4000f00) at ../glib/glib/gmain.c:4249
> #16 g_main_context_iterate_unlocked.isra.0 (context=context@entry=0x7ebdd4000f00, block=block@entry=1, dispatch=dispatch@entry=1, self=<optimized out>) at ../glib/glib/gmain.c:4314
> #17 0x00007ebdfcacc615 in g_main_context_iteration (context=0x7ebdd4000f00, may_block=1) at ../glib/glib/gmain.c:4379
> #18 0x00007ebe001cd59d in QEventDispatcherGlib::processEvents (this=0x5fda72b880b0, flags=...) at /usr/src/debug/qt6-base/qtbase/src/corelib/kernel/qeventdispatcher_glib.cpp:399
> #19 0x00007ebdfff65376 in QEventLoop::processEvents (this=0x7ffeacb73300, flags=...) at /usr/src/debug/qt6-base/qtbase/src/corelib/kernel/qeventloop.cpp:104
> #20 QEventLoop::exec (this=0x7ffeacb73300, flags=...) at /usr/src/debug/qt6-base/qtbase/src/corelib/kernel/qeventloop.cpp:186
> #21 0x00007ebdfff5d159 in QCoreApplication::exec () at /usr/src/debug/qt6-base/qtbase/src/corelib/global/qflags.h:77
> #22 0x00005fda4c22d1f6 in ?? ()
> #23 0x00007ebdff835488 in __libc_start_call_main (main=main@entry=0x5fda4c226180, argc=argc@entry=1, argv=argv@entry=0x7ffeacb738c8) at ../sysdeps/nptl/libc_start_call_main.h:58
> #24 0x00007ebdff83554c in __libc_start_main_impl (main=0x5fda4c226180, argc=1, argv=0x7ffeacb738c8, init=<optimized out>, fini=<optimized out>, rtld_fini=<optimized out>, stack_end=0x7ffeacb738b8) at ../csu/libc-start.c:360
> #25 0x00005fda4c22dbb5 in ?? ()

And another time

> Thread 1 (Thread 0x7ebd7ada66c0 (LWP 336849) "kdevelop"):
> #0  __GI_fdatasync (fd=18) at ../sysdeps/unix/sysv/linux/fdatasync.c:27
> #1  0x00007ebdfff1b8a6 in QFSFileEnginePrivate::nativeSyncToDisk (this=0x5fda844c4530) at /usr/src/debug/qt6-base/qtbase/src/corelib/io/qfsfileengine_unix.cpp:163
> #2  QFSFileEngine::syncToDisk (this=<optimized out>) at /usr/src/debug/qt6-base/qtbase/src/corelib/io/qfsfileengine.cpp:427
> #3  0x00007ebdfff322d2 in QSaveFile::commit (this=<optimized out>) at /usr/src/debug/qt6-base/qtbase/src/corelib/io/qsavefile.cpp:304
> #4  0x00007ebe00fc2740 in ?? () from /usr/lib/libKF6ConfigCore.so.6
> #5  0x00007ebe00fabb9a in KConfig::sync() () from /usr/lib/libKF6ConfigCore.so.6
> #6  0x00007ebe01a370c7 in ?? () from /usr/lib/libKDevPlatformShell.so.61
> #7  0x00007ebe01a3741f in ?? () from /usr/lib/libKDevPlatformShell.so.61
> #8  0x00007ebe01a374ef in ?? () from /usr/lib/libKDevPlatformShell.so.61
> #9  0x00007ebdfffb6cc9 in QtPrivate::QSlotObjectBase::call (this=<optimized out>, r=<optimized out>, a=<optimized out>, this=<optimized out>, r=<optimized out>, a=<optimized out>) at /usr/src/debug/qt6-base/qtbase/src/corelib/kernel/qobjectdefs_impl.h:461
> #10 doActivate<false> (sender=<optimized out>, signal_index=<optimized out>, argv=<optimized out>) at /usr/src/debug/qt6-base/qtbase/src/corelib/kernel/qobject.cpp:4138
> #11 0x00007ebdff6a52b8 in Sublime::Area::viewAdded(Sublime::AreaIndex*, Sublime::View*) () from /usr/lib/libKDevPlatformSublime.so.61
> #12 0x00007ebe01994353 in ?? () from /usr/lib/libKDevPlatformShell.so.61
> #13 0x00007ebe01995830 in ?? () from /usr/lib/libKDevPlatformShell.so.61
> #14 0x00007ebe01996518 in KDevelop::DocumentController::openDocument(QUrl const&, KTextEditor::Range const&, QFlags<KDevelop::IDocumentController::DocumentActivation>, QString const&, KDevelop::IDocument*) () from /usr/lib/libKDevPlatformShell.so.61
> #15 0x00007ebda00a2f47 in ?? () from /usr/lib/qt6/plugins/kdevplatform/61/kdevopenwith.so
> #16 0x00007ebda0524d40 in ?? () from /usr/lib/qt6/plugins/kdevplatform/61/kdevquickopen.so
> #17 0x00007ebda051660d in ?? () from /usr/lib/qt6/plugins/kdevplatform/61/kdevquickopen.so
> #18 0x00007ebda051ccbc in ?? () from /usr/lib/qt6/plugins/kdevplatform/61/kdevquickopen.so
> #19 0x00007ebdfff59358 in QCoreApplicationPrivate::sendThroughObjectEventFilters (receiver=receiver@entry=0x5fda74a60fd0, event=event@entry=0x7ffeacb72d40) at /usr/src/debug/qt6-base/qtbase/src/corelib/kernel/qcoreapplication.cpp:1243
> #20 0x00007ebe010fed8e in QApplicationPrivate::notify_helper (this=this@entry=0x5fda72b99600, receiver=receiver@entry=0x5fda74a60fd0, e=e@entry=0x7ffeacb72d40) at /usr/src/debug/qt6-base/qtbase/src/widgets/kernel/qapplication.cpp:3295
> #21 0x00007ebe01103182 in QApplication::notify (this=<optimized out>, receiver=0x5fda74a60fd0, e=<optimized out>) at /usr/src/debug/qt6-base/qtbase/src/widgets/kernel/qapplication.cpp:2719
> #22 0x00007ebdfff5a018 in QCoreApplication::notifyInternal2 (receiver=0x5fda74a60fd0, event=0x7ffeacb72d40) at /usr/src/debug/qt6-base/qtbase/src/corelib/kernel/qcoreapplication.cpp:1106
> #23 0x00007ebdfff5a04a in QCoreApplication::forwardEvent (receiver=<optimized out>, event=<optimized out>, originatingEvent=<optimized out>) at /usr/src/debug/qt6-base/qtbase/src/corelib/kernel/qcoreapplication.cpp:1121
> #24 0x00007ebe0116dbff in QWidgetWindow::handleDragLeaveEvent (this=<optimized out>, event=<optimized out>) at /usr/src/debug/qt6-base/qtbase/src/widgets/kernel/qwidgetwindow.cpp:1020
> #25 QWidgetWindow::event (this=0x5fda74753900, event=0x7ffeacb72d40) at /usr/src/debug/qt6-base/qtbase/src/widgets/kernel/qwidgetwindow.cpp:331
> #26 0x00007ebe010fed9e in QApplicationPrivate::notify_helper (this=<optimized out>, receiver=0x5fda74753900, e=0x7ffeacb72d40) at /usr/src/debug/qt6-base/qtbase/src/widgets/kernel/qapplication.cpp:3301
> #27 0x00007ebdfff5a018 in QCoreApplication::notifyInternal2 (receiver=0x5fda74753900, event=0x7ffeacb72d40) at /usr/src/debug/qt6-base/qtbase/src/corelib/kernel/qcoreapplication.cpp:1106
> #28 0x00007ebdfff5a06d in QCoreApplication::sendSpontaneousEvent (receiver=<optimized out>, event=<optimized out>) at /usr/src/debug/qt6-base/qtbase/src/corelib/kernel/qcoreapplication.cpp:1560
> #29 0x00007ebe0078df7c in QGuiApplicationPrivate::processKeyEvent (e=0x5fda7a280bf0) at /usr/src/debug/qt6-base/qtbase/src/gui/kernel/qguiapplication.cpp:2622
> #30 0x00007ebe0080d0c4 in QWindowSystemInterface::sendWindowSystemEvents (flags=flags@entry=...) at /usr/src/debug/qt6-base/qtbase/src/gui/kernel/qwindowsysteminterface.cpp:1113
> #31 0x00007ebe0080d2b7 in QWindowSystemInterface::flushWindowSystemEvents (flags=...) at /usr/src/debug/qt6-base/qtbase/src/gui/kernel/qwindowsysteminterface.cpp:1082
> #32 0x00007ebdfffa54aa in QObject::event (this=0x5fda72bba940, e=0x7ebdcc043b40) at /usr/src/debug/qt6-base/qtbase/src/corelib/kernel/qobject.cpp:1431
> #33 0x00007ebe010fed9e in QApplicationPrivate::notify_helper (this=<optimized out>, receiver=0x5fda72bba940, e=0x7ebdcc043b40) at /usr/src/debug/qt6-base/qtbase/src/widgets/kernel/qapplication.cpp:3301
> #34 0x00007ebdfff5a018 in QCoreApplication::notifyInternal2 (receiver=0x5fda72bba940, event=event@entry=0x7ebdcc043b40) at /usr/src/debug/qt6-base/qtbase/src/corelib/kernel/qcoreapplication.cpp:1106
> #35 0x00007ebdfff5a3f2 in QCoreApplication::sendEvent (receiver=<optimized out>, event=0x7ebdcc043b40) at /usr/src/debug/qt6-base/qtbase/src/corelib/kernel/qcoreapplication.cpp:1546
> #36 QCoreApplicationPrivate::sendPostedEvents (receiver=0x0, event_type=0, data=0x5fda72bab5b0) at /usr/src/debug/qt6-base/qtbase/src/corelib/kernel/qcoreapplication.cpp:1879
> #37 0x00007ebe001cfea8 in QCoreApplication::sendPostedEvents (receiver=0x0, event_type=0) at /usr/src/debug/qt6-base/qtbase/src/corelib/kernel/qcoreapplication.cpp:1733
> #38 postEventSourceDispatch (s=s@entry=0x5fda72bb7fe0) at /usr/src/debug/qt6-base/qtbase/src/corelib/kernel/qeventdispatcher_glib.cpp:246
> #39 0x00007ebdfcacd1e4 in g_main_dispatch (context=0x7ebdd4000f00) at ../glib/glib/gmain.c:3398
> #40 0x00007ebdfcb30e97 in g_main_context_dispatch_unlocked (context=0x7ebdd4000f00) at ../glib/glib/gmain.c:4249
> #41 g_main_context_iterate_unlocked.isra.0 (context=context@entry=0x7ebdd4000f00, block=block@entry=1, dispatch=dispatch@entry=1, self=<optimized out>) at ../glib/glib/gmain.c:4314
> #42 0x00007ebdfcacc615 in g_main_context_iteration (context=0x7ebdd4000f00, may_block=1) at ../glib/glib/gmain.c:4379
> #43 0x00007ebe001cd59d in QEventDispatcherGlib::processEvents (this=0x5fda72b880b0, flags=...) at /usr/src/debug/qt6-base/qtbase/src/corelib/kernel/qeventdispatcher_glib.cpp:399
> #44 0x00007ebdfff65376 in QEventLoop::processEvents (this=0x7ffeacb73300, flags=...) at /usr/src/debug/qt6-base/qtbase/src/corelib/kernel/qeventloop.cpp:104
> #45 QEventLoop::exec (this=0x7ffeacb73300, flags=...) at /usr/src/debug/qt6-base/qtbase/src/corelib/kernel/qeventloop.cpp:186
> #46 0x00007ebdfff5d159 in QCoreApplication::exec () at /usr/src/debug/qt6-base/qtbase/src/corelib/global/qflags.h:77
> #47 0x00005fda4c22d1f6 in ?? ()
> #48 0x00007ebdff835488 in __libc_start_call_main (main=main@entry=0x5fda4c226180, argc=argc@entry=1, argv=argv@entry=0x7ffeacb738c8) at ../sysdeps/nptl/libc_start_call_main.h:58
> #49 0x00007ebdff83554c in __libc_start_main_impl (main=0x5fda4c226180, argc=1, argv=0x7ffeacb738c8, init=<optimized out>, fini=<optimized out>, rtld_fini=<optimized out>, stack_end=0x7ffeacb738b8) at ../csu/libc-start.c:360
> #50 0x00005fda4c22dbb5 in ?? ()
Comment 1 Igor Kushnir 2025-04-26 09:01:38 UTC
> One when `.kate-swp` file is synced
If the same freeze happens in Kate, please report a separate bug against KTextEditor.

> And another time
> #6  0x00007ebe01a370c7 in ?? () from /usr/lib/libKDevPlatformShell.so.61
Unclear where the problem is without debug symbols.

If the behavior that is desired and correct for local files causes freezes on slow disks, I guess KNetworkMounts can be used to fix it. KDevelop does not use this class at all right now.