Den mån 17 juni 2019 kl 01:29 skrev Federico Buti <fed.b...@gmail.com>: > > Hi Thiago. > > Thanks for the feedback. > I'm on Fedora 29 so definitely not on an old kernel as that. My colleague is > on Ubuntu but I'm pretty sure it is a 16.xx release. I guess the usage of > renameat2() is failing for some other reason. What could that be? Any idea?
Apart from what Thiago said (you need a Qt built on a kernel that supports the syscall), another reason could be the file system that does not support renameat2. For example non-local file systems (e.g. Samba/NFS/...) and eCryptfs do not support it. (I once made a bugreport against QTemporaryFile::rename about this, https://bugreports.qt.io/browse/QTBUG-64008 , and Thiago fixed it by making QFileSystemEngine fall back to link/unlink if renameat2 fails with EINVAL) Elvis Elvis > > Just in case, here is the code of the test. It basically create two temporary > directories, starts watching on one of them via our FileEventsGatherer class > and once the files are moved via QFile::rename, it compares the number of > registered move/renames with the expect ones. "mkFile" just creates the file > via QFile. No more, no less. > > void <---->::testMoveFile() > { > QFETCH(QStringList, > fileNames); > QFETCH(qint32, > expectedResult); > QFETCH(bool, > rename); > > QTemporaryDir monitoredDir; > QTemporaryDir externalDir; > FileEventsGatherer feg; > feg.setPath(monitoredDir.path(), > FileEventsGatherer::FILE_EVENT__ALL, > OUTBOX_FILE_NAME_FILTER); > QSet<QString> overallMoved; > connect(&feg, > &FileEventsGatherer::filesMoved, > this, > [&overallMoved](QSet<QString> const &movedFiles) > { > overallMoved.unite(movedFiles); > }); > > for (auto const &file : fileNames) > { > QString const choosenPath {rename > ? monitoredDir.path() > : externalDir.path()}; > auto const sourcePath = > QString("%1/%2").arg(choosenPath).arg("TempName"); > auto const destPath = > QString("%1/%2").arg(monitoredDir.path()).arg(file); > mkFile(sourcePath); > QFile mover(sourcePath); > mover.rename(destPath); > } > > QTest::qWait(SIGNALS_TIMEOUT_MS); > QCOMPARE(overallMoved.count(), > expectedResult); > } > > Thanks, > F. > > > On Sat, 15 Jun 2019 at 20:50, Thiago Macieira <thiago.macie...@intel.com> > wrote: >> >> On Saturday, 15 June 2019 08:58:31 PDT Federico Buti wrote: >> > We gave strace a go and we noticed that 5.12 runtime acts differently for >> > rename/move operations (see attached compare screenshot). In particular, on >> > 5.6 we have an actual rename whereas a link/unlink sequence happens on >> > 5.12. That sequence is not detected by our code, generating the failure. >> >> Alternative: upgrade your system to a version that supports the renameat2() >> system call. You need a 3.16 Linux kernel and glibc 2.28. >> >> The link()/unlink() sequence is used on Unix filesystems to prevent rename() >> clobbering existing files, as promised in our API, but they're only attempted >> if renameat2() fails. >> >> -- >> Thiago Macieira - thiago.macieira (AT) intel.com >> Software Architect - Intel System Software Products >> >> >> >> _______________________________________________ >> Interest mailing list >> Interest@qt-project.org >> https://lists.qt-project.org/listinfo/interest > > _______________________________________________ > Interest mailing list > Interest@qt-project.org > https://lists.qt-project.org/listinfo/interest _______________________________________________ Interest mailing list Interest@qt-project.org https://lists.qt-project.org/listinfo/interest