[Interest] Behavioural change in QFile/QDir rename

Elvis Stansvik elvstone at gmail.com
Mon Jun 17 08:47:53 CEST 2019


Den mån 17 juni 2019 07:47Elvis Stansvik <elvstone at gmail.com> skrev:

> Den mån 17 juni 2019 kl 01:29 skrev Federico Buti <fed.buti at 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.
>

To be completely correct, it may support the syscall, just not the
RENAME_NOREPLACE flag.

Elvis


> 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.macieira at 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 at qt-project.org
> >> https://lists.qt-project.org/listinfo/interest
> >
> > _______________________________________________
> > Interest mailing list
> > Interest at qt-project.org
> > https://lists.qt-project.org/listinfo/interest
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.qt-project.org/pipermail/interest/attachments/20190617/af30f311/attachment.html>


More information about the Interest mailing list