Bug 412724 - [KDevelop] UI freeze because of symlink to stale NFS mountpoint in $HOME
Summary: [KDevelop] UI freeze because of symlink to stale NFS mountpoint in $HOME
Status: REPORTED
Alias: None
Product: kdevelop
Classification: Applications
Component: general (other bugs)
Version First Reported In: 5.4.2
Platform: Other Linux
: NOR normal
Target Milestone: ---
Assignee: kdevelop-bugs-null
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2019-10-08 09:37 UTC by RJVB
Modified: 2019-10-08 09:37 UTC (History)
0 users

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


Attachments
full backtrace (28.04 KB, text/plain)
2019-10-08 09:37 UTC, RJVB
Details

Note You need to log in before you can comment on or make changes to this bug.
Description RJVB 2019-10-08 09:37:58 UTC
Created attachment 123086 [details]
full backtrace

SUMMARY
I have a symlink in my home directory that points to the mountpoint for an NFS share. Having that share mounted but the remote server offline (suspended) causes seemingly random application-wide freezes in KDevelop while it somehow attempts to get the mime type for the symlink. I noticed the 1st freeze in a session that was up and running but it is easier to reproduce during session load.

NB: the symlink is unrelated to any of the projects in the session in question, i.e. KDevelop is threspassing.

STEPS TO REPRODUCE
1. mount an NFS share
2. create a symlink to the mountpoint under $HOME (or mount the share under $HOME, presumably)
3. take the server offline (put it to sleep, possibly while the test computer is suspended too)
4. open a KDevelop session with one or more projects that take some time to load
5. observe and use the session.

OBSERVED RESULT
From time to time KDevelop will freeze for more than a few seconds while an attempt is made to obtain information from a file it has no business with

EXPECTED RESULT
No freezing, no messing with irrelevant files.

SOFTWARE/OS VERSIONS
Windows: 
macOS: 
Linux: 4.14
KDE Frameworks Version: 5.60.0
Qt Version: 5.9.8

ADDITIONAL INFORMATION
Force-unmounting the mount unblocked KDevelop

Partial backtrace:
  * frame #0: 0x00007f90d663acf5 libc.so.6`__GI___xstat(vers=69773768, name="/Users/bertin/WinBertin@Debian", buf=0x00007ffe793d2f28) at xstat.c:35
    frame #1: 0x00007f90d746175f libQt5Core.so.5`QMimeDatabase::mimeTypeForFile(QFileInfo const&, QMimeDatabase::MatchMode) const [inlined] stat64(__path=<unavailable>, __statbuf=0x0000000004094060) at stat.h:504:10
    frame #2: 0x00007f90d746175a libQt5Core.so.5`QMimeDatabase::mimeTypeForFile(this=0x00007ffe793d3048, fileInfo=0x00007ffe793d3000, mode=MatchDefault) const at qmimedatabase.cpp:372
    frame #3: 0x00007f90d746243f libQt5Core.so.5`QMimeDatabase::mimeTypeForUrl(QUrl const&) const at qmimedatabase.cpp:427:16
    frame #4: 0x00007f90d7462425 libQt5Core.so.5`QMimeDatabase::mimeTypeForUrl(this=0x00007ffe793d3048, url="/Users/bertin/WinBertin@Debian") const at qmimedatabase.cpp:523
    frame #5: 0x00007f90da7ed374 libKF5KIOCore.so.5`KFileItemPrivate::determineMimeTypeHelper(this=0x00000000047ecab0, url="/Users/bertin/WinBertin@Debian") const at kfileitem.cpp:504:25
    frame #6: 0x00007f90da7f09c9 libKF5KIOCore.so.5`KFileItem::determineMimeType(this=0x00007ffe793d3160) const at kfileitem.cpp:804:16
    frame #7: 0x00007f90d59d5f23 libKF5KIOFileWidgets.so.5`KFilePreviewGenerator::Private::resolveMimeType(this=<unavailable>) at kfilepreviewgenerator.cpp:879:18
    frame #8: 0x00007f90d74114a1 libQt5Core.so.5`QObject::event(this=0x0000000002cecc90, e=<unavailable>) at qobject.cpp:1252:18
    frame #9: 0x00007f90d90379a7 libQt5Widgets.so.5`QApplicationPrivate::notify_helper(this=0x0000000001180110, receiver=0x0000000002cecc90, e=0x0000000004853fb0) at qapplication.cpp:3722:31
    frame #10: 0x00007f90d9034d58 libQt5Widgets.so.5`QApplication::notify(this=0x00007ffe793d3b00, receiver=<unavailable>, e=0x0000000004853fb0) at qapplication.cpp:0:9
    frame #11: 0x00007f90d73e9426 libQt5Core.so.5`QCoreApplication::notifyInternal2(receiver=0x0000000002cecc90, event=0x0000000004853fb0) at qcoreapplication.cpp:1031:18
    frame #12: 0x00007f90d73ea2af libQt5Core.so.5`QCoreApplicationPrivate::sendPostedEvents(QObject*, int, QThreadData*) [inlined] QCoreApplication::sendEvent(receiver=<unavailable>, event=<unavailable>) at qcoreapplication.h:233:44
    frame #13: 0x00007f90d73ea29b libQt5Core.so.5`QCoreApplicationPrivate::sendPostedEvents(receiver=0x0000000000000000, event_type=0, data=0x000000000117c340) at qcoreapplication.cpp:1706
    frame #14: 0x00007f90d7439963 libQt5Core.so.5`postEventSourceDispatch(s=0x00000000012f2130, (null)=<unavailable>, (null)=<unavailable>)(void*), void*) at qeventdispatcher_glib.cpp:276:5
    frame #15: 0x00007f90cd0ed0e5 libglib-2.0.so.0`g_main_context_dispatch at gmain.c:3170:27
    frame #16: 0x00007f90cd0ecf57 libglib-2.0.so.0`g_main_context_dispatch(context=<unavailable>) at gmain.c:3835
    frame #17: 0x00007f90cd0ed7b5 libglib-2.0.so.0`g_main_context_iterate(context=<unavailable>, block=<unavailable>, dispatch=<unavailable>, self=<unavailable>) at gmain.c:3908:5
    frame #18: 0x00007f90cd0eda21 libglib-2.0.so.0`g_main_context_iteration(context=0x00007f90bc003030, may_block=1) at gmain.c:3969:12
    frame #19: 0x00007f90d743941b libQt5Core.so.5`QEventDispatcherGlib::processEvents(this=0x000000000138a7c0, flags=<unavailable>) at qeventdispatcher_glib.cpp:425:18
    frame #20: 0x00007f90d73e52b2 libQt5Core.so.5`QEventLoop::exec(QFlags<QEventLoop::ProcessEventsFlag>) [inlined] QEventLoop::processEvents(this=<unavailable>, flags=<unavailable>) at qeventloop.cpp:134:51
    frame #21: 0x00007f90d73e5295 libQt5Core.so.5`QEventLoop::exec(this=0x00007ffe793d38d0, flags=<unavailable>) at qeventloop.cpp:212
    frame #22: 0x00007f90d73e9aed libQt5Core.so.5`QCoreApplication::exec() at qcoreapplication.cpp:1304:32
    frame #23: 0x000000000041382c kdevelop`main(argc=<unavailable>, argv=<unavailable>) at main.cpp:1002:12
    frame #24: 0x00007f90d656df45 libc.so.6`__libc_start_main(main=(kdevelop`main at main.cpp:440), argc=2, argv=0x00007ffe793d3c58, init=<unavailable>, fini=<unavailable>, rtld_fini=<unavailable>, stack_end=0x00007ffe793d3c48) at libc-start.c:287
    frame #25: 0x0000000000406864 kdevelop`_start + 41
(lldb) up
frame #1: 0x00007f90d746175f libQt5Core.so.5`QMimeDatabase::mimeTypeForFile(QFileInfo const&, QMimeDatabase::MatchMode) const [inlined] stat64(__path=<unavailable>, __statbuf=0x0000000004094060) at stat.h:504:10
   501  __extern_inline int
   502  __NTH (stat64 (const char *__path, struct stat64 *__statbuf))
   503  {
-> 504    return __xstat64 (_STAT_VER, __path, __statbuf);
   505  }
   506 
   507  #  if defined __USE_BSD || defined __USE_XOPEN_EXTENDED
(lldb) 
frame #2: 0x00007f90d746175a libQt5Core.so.5`QMimeDatabase::mimeTypeForFile(this=0x00007ffe793d3048, fileInfo=0x00007ffe793d3000, mode=MatchDefault) const at qmimedatabase.cpp:372
   369      // In addition we want to follow symlinks.
   370      const QByteArray nativeFilePath = QFile::encodeName(file.fileName());
   371      QT_STATBUF statBuffer;
-> 372      if (QT_STAT(nativeFilePath.constData(), &statBuffer) == 0) {
   373          if (S_ISCHR(statBuffer.st_mode))
   374              return d->mimeTypeForName(QLatin1String("inode/chardevice"));
   375          if (S_ISBLK(statBuffer.st_mode))
(lldb) up
frame #3: 0x00007f90d746243f libQt5Core.so.5`QMimeDatabase::mimeTypeForUrl(QUrl const&) const at qmimedatabase.cpp:427:16
   424      } else {
   425          // Implemented as a wrapper around mimeTypeForFile(QFileInfo), so no mutex.
   426          QFileInfo fileInfo(fileName);
-> 427          return mimeTypeForFile(fileInfo, mode);
   428      }
   429  }
   430 
(lldb) up
frame #4: 0x00007f90d7462425 libQt5Core.so.5`QMimeDatabase::mimeTypeForUrl(this=0x00007ffe793d3048, url="/Users/bertin/WinBertin@Debian") const at qmimedatabase.cpp:523
   520  QMimeType QMimeDatabase::mimeTypeForUrl(const QUrl &url) const
   521  {
   522      if (url.isLocalFile())
-> 523          return mimeTypeForFile(url.toLocalFile());
   524 
   525      const QString scheme = url.scheme();
   526      if (scheme.startsWith(QLatin1String("http")) || scheme == QLatin1String("mailto"))
(lldb) p url
(const QUrl) $1 = "/Users/bertin/WinBertin@Debian" {
  port = -1
  scheme = <Invalid>
  userName = <Invalid>
  password = <Invalid>
  host = <Invalid>
  path = "/Users/bertin/WinBertin@Debian"
  query = <Invalid>
  fragment = <Invalid>
}