Den mån 17 juni 2019 kl 09:37 skrev Federico Buti <fed.b...@gmail.com>:
>
> Thanks all.
>
> My bad, I referred the crosscompilation for Windows as a reference point from 
> where we started the Qt bump, mostly because that was the major showstopper. 
> But on Linux we use vanilla Qt from qt.io installers. Hence I think any 
> compilation issue in Qt can be ruled out; or at least it feels quite unlikely 
> to be the real problem.

The official binaries I think are built on CentOS 7 (?). It seems to
have glibc 2.17, so those binaries would not use renameat2.

(I could be wrong because I don't know exactly how the build machines
are set up).

Elvis

> The meld screenshot, from the first mail, is a comparison between vanilla Qt 
> 5.6.2 and vanilla Qt 5.12.2, both from the Qt installer.
>
> As a secondary note, we do not use QTemporaryFile isntances in the test but 
> plain QFile intances, created inside a "source" QTemporaryDir from which 
> files are moved.
>
> Bests,
> F.
>
>
> On Mon, 17 Jun 2019 at 08:48, Elvis Stansvik <elvst...@gmail.com> wrote:
>>
>> Den mån 17 juni 2019 07:47Elvis Stansvik <elvst...@gmail.com> skrev:
>>>
>>> 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.
>>
>>
>> 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.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

Reply via email to