gulrak / filesystem

An implementation of C++17 std::filesystem for C++11 /C++14/C++17/C++20 on Windows, macOS, Linux and FreeBSD.
MIT License
1.31k stars 168 forks source link

Throw filesystemerror (errno EINTR) in CIFS mounted disk. #146

Closed bxwllzz closed 1 year ago

bxwllzz commented 2 years ago

Describe the bug Throw unexpected filesystemerror (errno EINTR) in CIFS mounted disk.

terminate called after throwing an instance of 'ghc::filesystem::filesystem_error'
  what():  Interrupted system call: '/mnt/nas_xxx'

strace shows:

...
openat(AT_FDCWD, "/mnt/nas_xxx", O_RDONLY|O_NONBLOCK|O_CLOEXEC|O_DIRECTORY) = 8
fstat(8, {st_mode=S_IFDIR|0777, st_size=0, ...}) = 0
getdents64(8, 0x5637c220a1c0, 1048576)  = -1 EINTR (Interrupted system call)
close(8)                                = 0
...

To Reproduce Use ghc::filesystem::recursive_directory_iterator in disk mounted by CIFS

Expected behavior Retry syscall if errno is EINTR (in my case ::opendir)

Additional context std::filesystem in gcc 9.4 (Ubuntu 20.04) has same problem.

terminate called after throwing an instance of 'std::filesystem::__cxx11::filesystem_error'
  what():  filesystem error: cannot increment recursive directory iterator: Interrupted system call

boost::filesystem 1.71.0 has same problem.

terminate called after throwing an instance of 'boost::filesystem::filesystem_error'
  what():  filesystem::recursive_directory_iterator directory error: Interrupted system call

boost::filesystem >= 1.74.0 seems fix this problem by retry syscall in EINTR ? https://www.boost.org/doc/libs/1_74_0/libs/filesystem/src/operations.cpp

gulrak commented 2 years ago

Thanks for the details, I need to setup some test env to check this, might take a bit of time, but I'll look into it.

gulrak commented 1 year ago

Released with v1.5.14.