]> granicus.if.org Git - postgresql/commitdiff
pg_receivewal: Add --no-sync option.
authorRobert Haas <rhaas@postgresql.org>
Sun, 29 Oct 2017 07:16:55 +0000 (12:46 +0530)
committerRobert Haas <rhaas@postgresql.org>
Sun, 29 Oct 2017 07:16:55 +0000 (12:46 +0530)
Michael Paquier, reviewed by Kuntal Ghosh and by me.  I did a little
wordsmithing on the documentation, too.

Discussion: http://postgr.es/m/CAB7nPqTuXuyEoVKcWcExh_b0uAjgWd_14KfGLrCTccBZ=VA0KA@mail.gmail.com

doc/src/sgml/ref/pg_receivewal.sgml
src/bin/pg_basebackup/pg_receivewal.c
src/bin/pg_basebackup/t/020_pg_receivewal.pl

index 4d13c57ffa0c3f4678a848331ac5c5a66580131a..4e2e0cb44c2bcb97d5c7ae68a98f7878bdf38b15 100644 (file)
@@ -135,6 +135,23 @@ PostgreSQL documentation
       </listitem>
      </varlistentry>
 
+     <varlistentry>
+      <term><option>--no-sync</option></term>
+      <listitem>
+       <para>
+        This option causes <command>pg_receivewal</command> to not force WAL
+        data to be flushed to disk.  This 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.
+       </para>
+
+       <para>
+        This option is incompatible with <literal>--synchronous</literal>.
+       </para>
+      </listitem>
+     </varlistentry>
+
      <varlistentry>
       <term><option>-s <replaceable class="parameter">interval</replaceable></option></term>
       <term><option>--status-interval=<replaceable class="parameter">interval</replaceable></option></term>
index 888ae6c571902be4c9f91fec1587aee8acafc87c..d801ea07fc8e421f88a0de31ee400fb5b7d880d0 100644 (file)
@@ -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
         */
index f9f7bf75abd4c354939e5305d177b6a94126390e..64e3a35a87b8b1e0e0039a50140deaac34acd1c6 100644 (file)
@@ -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';