On Wed, May 3, 2017 at 10:44 PM, Ashutosh Sharma <ashu.coe...@gmail.com>
wrote:

> Hi Craig,
>
> On Wed, May 3, 2017 at 10:50 AM, Craig Ringer <cr...@2ndquadrant.com>
> wrote:
> > On 3 May 2017 at 12:32, Haribabu Kommi <kommi.harib...@gmail.com> wrote:
> >> [Adding -hackers mailing list]
> >>
> >> On Fri, Apr 28, 2017 at 6:28 PM, <henry_boehl...@agilent.com> wrote:
> >>>
> >>> The following bug has been logged on the website:
> >>>
> >>> Bug reference:      14634
> >>> Logged by:          Henry Boehlert
> >>> Email address:      henry_boehl...@agilent.com
> >>> PostgreSQL version: 9.6.2
> >>> Operating system:   Windows Server 2012 R2 6.3.9600
> >>> Description:
> >>>
> >>> Executing command pg_basebackup -D -F t writes its output to stdout,
> which
> >>> is open in text mode, causing LF to be converted to CR LF thus
> corrupting
> >>> the resulting archive.
> >>>
> >>> To write the tar to stdout, on Windows stdout's mode should be
> temporarily
> >>> switched to binary.
> >>>
> >>> https://msdn.microsoft.com/en-us/library/tw4k6df8.aspx
> >>
> >>
> >> Thanks for reporting the issue.
> >> With the attached patch, I was able to extract the tar file that gets
> >> generated when the tar file is written into stdout. I tested the
> >> the compressed tar also.
> >>
> >> This bug needs to be fixed in back branches also.
> >
> > We should do the same for pg_dump in -Fc mode.
>
> Did you meant -Fp mode. I think we are already setting stdout file to
> binary mode if the output format is custom. Please refer to the
> following code in parseArchiveFormat() and _allocAH() respectively
>
> static ArchiveFormat
> parseArchiveFormat(const char *format, ArchiveMode *mode)
> {
>     ...............
>     ...............
>     else if (pg_strcasecmp(format, "c") == 0)
>         archiveFormat = archCustom;
>     else if (pg_strcasecmp(format, "custom") == 0)
>         archiveFormat = archCustom;
>
>     else if (pg_strcasecmp(format, "p") == 0)
>         archiveFormat = archNull;
>     else if (pg_strcasecmp(format, "plain") == 0)
>         archiveFormat = archNull;
>     ...............
>     ...............
> }
>
> static ArchiveHandle *
> _allocAH(const char *FileSpec, const ArchiveFormat fmt,
>          const int compression, bool dosync, ArchiveMode mode,
>          SetupWorkerPtrType setupWorkerPtr)
> {
>
>     ...............
>     ...............
> #ifdef WIN32
>     if (fmt != archNull &&
>         (AH->fSpec == NULL || strcmp(AH->fSpec, "") == 0))
>     {
>         if (mode == archModeWrite)
>             setmode(fileno(stdout), O_BINARY);
>         else
>             setmode(fileno(stdin), O_BINARY);
>     }
> #endif
>     ..................
>     ..................
> }
>
> Please confirm.
>

I also think it is the plain text mode. There is no problem with text
mode file that contains the CR LF characters.

Meanwhile, I have unit tested the patch submitted by Hari upthread on
> postgresql v10 and it works fine. Below are the steps that i have
> followed to test Hari's patch.
>
> Without patch:
> ==============
> C:\Users\ashu\postgresql\TMP\test\bin>.\pg_basebackup.exe -D - -F t -X
> none > base.tar
> NOTICE:  WAL archiving is not enabled; you must ensure that all required
> WAL seg
> ments are copied through other means to complete the backup
>
> C:\Users\ashu\postgresql\TMP\test\bin>tar -xf base.tar
> tar: Skipping to next header
> tar: Exiting with failure status due to previous errors
>
>
> With patch:
> ===========
> C:\Users\ashu\git-clone-postgresql\postgresql\TMP\
> test\bin>.\pg_basebackup.exe
> -D - -F t -X none > base.tar
> NOTICE:  WAL archiving is not enabled; you must ensure that all required
> WAL seg
> ments are copied through other means to complete the backup
>
> C:\Users\ashu\postgresql\TMP\test\bin>cp base.tar ..\basebakup
>
> C:\Users\ashu\postgresql\TMP\test\basebakup>tar -xf base.tar
>
> C:\Users\ashu\postgresql\TMP\test\basebakup>ls
> PG_VERSION    pg_commit_ts   pg_multixact  pg_stat      pg_wal
> backup_label  pg_dynshmem    pg_notify     pg_stat_tmp  pg_xact
> base          pg_hba.conf    pg_replslot   pg_subtrans
> postgresql.auto.conf
> base.tar      pg_ident.conf  pg_serial     pg_tblspc    postgresql.conf
> global        pg_logical     pg_snapshots  pg_twophase  tablespace_map
>
>
Thanks for the tests to verify the patch.


Regards,
Hari Babu
Fujitsu Australia

Reply via email to