Hi, On Wed, 8 May 2024 at 14:16, Ranier Vilela <ranier...@gmail.com> wrote: > > > Em qua., 8 de mai. de 2024 às 04:37, Nazir Bilal Yavuz <byavu...@gmail.com> > escreveu: >> >> Hi Ranier, >> >> Thanks for looking into this! >> >> I am not sure why but your reply does not show up in the thread, so I >> copied your reply and answered it in the thread for visibility. >> >> On Tue, 7 May 2024 at 16:28, Ranier Vilela <ranier...@gmail.com> wrote: >> > >> > I know it's coming from copy-and-paste, but >> > I believe the flags could be: >> > - dstfd = OpenTransientFile(tofile, O_RDWR | O_CREAT | O_EXCL | PG_BINARY); >> > + dstfd = OpenTransientFile(tofile, O_CREAT | O_WRONLY | O_TRUNC | O_EXCL >> > | PG_BINARY); >> > >> > The flags: >> > O_WRONLY | O_TRUNC >> > >> > Allow the OS to make some optimizations, if you deem it possible. >> > >> > The flag O_RDWR indicates that the file can be read, which is not true in >> > this case. >> > The destination file will just be written. >> >> You may be right about the O_WRONLY flag but I am not sure about the >> O_TRUNC flag. >> >> O_TRUNC from the linux man page [1]: If the file already exists and is >> a regular file and the access mode allows writing (i.e., is O_RDWR or >> O_WRONLY) it will be truncated to length 0. If the file is a FIFO or >> terminal device file, the O_TRUNC flag is ignored. Otherwise, the >> effect of O_TRUNC is unspecified. > > O_TRUNC is usually used in conjunction with O_WRONLY. > See the example at: > open.html > > O_TRUNC signals the OS to forget the current contents of the file, if it > happens to exist. > In other words, there will be no seeks, only and exclusively writes.
You are right; the O_TRUNC flag truncates the file, if it happens to exist. But it should not exist in the first place because the code at [2] should check this before the OpenTransientFile() call. Even if we assume somehow the check at [2] does not work, I do not think the correct operation is to truncate the contents of the existing file. >> >> But it should be already checked if the destination directory already >> exists in dbcommands.c file in createdb() function [2], so this should >> not happen. > > I'm not sure what you're referring to here. Sorry, I meant that the destination directory / file should not exist because the code at [2] confirms it does not exist, otherwise it errors out. -- Regards, Nazir Bilal Yavuz Microsoft