diff --git a/doc/src/sgml/ref/pg_receivewal.sgml b/doc/src/sgml/ref/pg_receivewal.sgml index 4d13c57ffa..35992dc63b 100644 --- a/doc/src/sgml/ref/pg_receivewal.sgml +++ b/doc/src/sgml/ref/pg_receivewal.sgml @@ -135,6 +135,23 @@ PostgreSQL documentation + + + + + This option causes pg_receivewal to not flush WAL + data, which is faster, but means that a subsequent operating system + crash can leave the WAL segments corrupt. Generally, this option is + useful for testing but should not be used when doing WAL archiving on + a production deployment. + + + + This option is incompatible with --synchronous. + + + + diff --git a/src/bin/pg_basebackup/pg_receivewal.c b/src/bin/pg_basebackup/pg_receivewal.c index 888ae6c571..d801ea07fc 100644 --- a/src/bin/pg_basebackup/pg_receivewal.c +++ b/src/bin/pg_basebackup/pg_receivewal.c @@ -40,6 +40,7 @@ static volatile bool time_to_stop = false; static bool do_create_slot = false; static bool slot_exists_ok = false; static bool do_drop_slot = false; +static bool do_sync = true; static bool synchronous = false; static char *replication_slot = NULL; static XLogRecPtr endpos = InvalidXLogRecPtr; @@ -81,6 +82,7 @@ usage(void) printf(_(" -E, --endpos=LSN exit after receiving the specified LSN\n")); printf(_(" --if-not-exists do not error if slot already exists when creating a slot\n")); printf(_(" -n, --no-loop do not loop on connection lost\n")); + printf(_(" --no-sync do not wait for changes to be written safely to disk\n")); printf(_(" -s, --status-interval=SECS\n" " time between status packets sent to server (default: %d)\n"), (standby_message_timeout / 1000)); printf(_(" -S, --slot=SLOTNAME replication slot to use\n")); @@ -425,7 +427,7 @@ StreamLog(void) stream.stop_socket = PGINVALID_SOCKET; stream.standby_message_timeout = standby_message_timeout; stream.synchronous = synchronous; - stream.do_sync = true; + stream.do_sync = do_sync; stream.mark_done = false; stream.walmethod = CreateWalDirectoryMethod(basedir, compresslevel, stream.do_sync); @@ -487,6 +489,7 @@ main(int argc, char **argv) {"drop-slot", no_argument, NULL, 2}, {"if-not-exists", no_argument, NULL, 3}, {"synchronous", no_argument, NULL, 4}, + {"no-sync", no_argument, NULL, 5}, {NULL, 0, NULL, 0} }; @@ -595,6 +598,9 @@ main(int argc, char **argv) case 4: synchronous = true; break; + case 5: + do_sync = false; + break; default: /* @@ -637,6 +643,14 @@ main(int argc, char **argv) exit(1); } + if (synchronous && !do_sync) + { + fprintf(stderr, _("%s: cannot use --synchronous together with --no-sync\n"), progname); + fprintf(stderr, _("Try \"%s --help\" for more information.\n"), + progname); + exit(1); + } + /* * Required arguments */ diff --git a/src/bin/pg_basebackup/t/020_pg_receivewal.pl b/src/bin/pg_basebackup/t/020_pg_receivewal.pl index f9f7bf75ab..64e3a35a87 100644 --- a/src/bin/pg_basebackup/t/020_pg_receivewal.pl +++ b/src/bin/pg_basebackup/t/020_pg_receivewal.pl @@ -2,7 +2,7 @@ use strict; use warnings; use TestLib; use PostgresNode; -use Test::More tests => 17; +use Test::More tests => 18; program_help_ok('pg_receivewal'); program_version_ok('pg_receivewal'); @@ -24,6 +24,9 @@ $primary->command_fails( $primary->command_fails( [ 'pg_receivewal', '-D', $stream_dir, '--create-slot' ], 'failure if --create-slot specified without --slot'); +$primary->command_fails( + [ 'pg_receivewal', '-D', $stream_dir, '--synchronous', '--no-sync' ], + 'failure if --synchronous specified with --no-sync'); # Slot creation and drop my $slot_name = 'test';