Add option -N/--no-sync to pg_upgrade
This is an option consistent with what the other tools of src/bin/ (pg_checksums, pg_dump, pg_rewind and pg_basebackup) provide which is useful for leveraging the I/O effort when testing things. This is not to be used in a production environment. All the regression tests of pg_upgrade are updated to use this new option. This happens to cut at most a couple of seconds in environments constrained on I/O, by avoiding a flush of data folder for the new cluster upgraded. Author: Michael Paquier Reviewed-by: Peter Eisentraut Discussion: https://postgr.es/m/YbrhzuBmBxS/DkfX@paquier.xyz
This commit is contained in:
parent
944dc45d1b
commit
3d5ffccb6d
@ -130,6 +130,22 @@ PostgreSQL documentation
|
|||||||
cluster</para></listitem>
|
cluster</para></listitem>
|
||||||
</varlistentry>
|
</varlistentry>
|
||||||
|
|
||||||
|
<varlistentry>
|
||||||
|
<term><option>-N</option></term>
|
||||||
|
<term><option>--no-sync</option></term>
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
By default, <command>pg_upgrade</command> will wait for all files
|
||||||
|
of the upgraded cluster to be written safely to disk. This option
|
||||||
|
causes <command>pg_upgrade</command> to return without waiting, which
|
||||||
|
is faster, but means that a subsequent operating system crash can leave
|
||||||
|
the synchronized data directory corrupt. Generally, this option is
|
||||||
|
useful for testing but should not be used on a production
|
||||||
|
installation.
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
|
||||||
<varlistentry>
|
<varlistentry>
|
||||||
<term><option>-o</option> <replaceable class="parameter">options</replaceable></term>
|
<term><option>-o</option> <replaceable class="parameter">options</replaceable></term>
|
||||||
<term><option>--old-options</option> <replaceable class="parameter">options</replaceable></term>
|
<term><option>--old-options</option> <replaceable class="parameter">options</replaceable></term>
|
||||||
|
@ -43,6 +43,7 @@ parseCommandLine(int argc, char *argv[])
|
|||||||
{"new-datadir", required_argument, NULL, 'D'},
|
{"new-datadir", required_argument, NULL, 'D'},
|
||||||
{"old-bindir", required_argument, NULL, 'b'},
|
{"old-bindir", required_argument, NULL, 'b'},
|
||||||
{"new-bindir", required_argument, NULL, 'B'},
|
{"new-bindir", required_argument, NULL, 'B'},
|
||||||
|
{"no-sync", no_argument, NULL, 'N'},
|
||||||
{"old-options", required_argument, NULL, 'o'},
|
{"old-options", required_argument, NULL, 'o'},
|
||||||
{"new-options", required_argument, NULL, 'O'},
|
{"new-options", required_argument, NULL, 'O'},
|
||||||
{"old-port", required_argument, NULL, 'p'},
|
{"old-port", required_argument, NULL, 'p'},
|
||||||
@ -66,6 +67,7 @@ parseCommandLine(int argc, char *argv[])
|
|||||||
char **filename;
|
char **filename;
|
||||||
time_t run_time = time(NULL);
|
time_t run_time = time(NULL);
|
||||||
|
|
||||||
|
user_opts.do_sync = true;
|
||||||
user_opts.transfer_mode = TRANSFER_MODE_COPY;
|
user_opts.transfer_mode = TRANSFER_MODE_COPY;
|
||||||
|
|
||||||
os_info.progname = get_progname(argv[0]);
|
os_info.progname = get_progname(argv[0]);
|
||||||
@ -101,7 +103,7 @@ parseCommandLine(int argc, char *argv[])
|
|||||||
if (os_user_effective_id == 0)
|
if (os_user_effective_id == 0)
|
||||||
pg_fatal("%s: cannot be run as root\n", os_info.progname);
|
pg_fatal("%s: cannot be run as root\n", os_info.progname);
|
||||||
|
|
||||||
while ((option = getopt_long(argc, argv, "d:D:b:B:cj:ko:O:p:P:rs:U:v",
|
while ((option = getopt_long(argc, argv, "d:D:b:B:cj:kNo:O:p:P:rs:U:v",
|
||||||
long_options, &optindex)) != -1)
|
long_options, &optindex)) != -1)
|
||||||
{
|
{
|
||||||
switch (option)
|
switch (option)
|
||||||
@ -134,6 +136,10 @@ parseCommandLine(int argc, char *argv[])
|
|||||||
user_opts.transfer_mode = TRANSFER_MODE_LINK;
|
user_opts.transfer_mode = TRANSFER_MODE_LINK;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case 'N':
|
||||||
|
user_opts.do_sync = false;
|
||||||
|
break;
|
||||||
|
|
||||||
case 'o':
|
case 'o':
|
||||||
/* append option? */
|
/* append option? */
|
||||||
if (!old_cluster.pgopts)
|
if (!old_cluster.pgopts)
|
||||||
@ -286,6 +292,7 @@ usage(void)
|
|||||||
printf(_(" -D, --new-datadir=DATADIR new cluster data directory\n"));
|
printf(_(" -D, --new-datadir=DATADIR new cluster data directory\n"));
|
||||||
printf(_(" -j, --jobs=NUM number of simultaneous processes or threads to use\n"));
|
printf(_(" -j, --jobs=NUM number of simultaneous processes or threads to use\n"));
|
||||||
printf(_(" -k, --link link instead of copying files to new cluster\n"));
|
printf(_(" -k, --link link instead of copying files to new cluster\n"));
|
||||||
|
printf(_(" -N, --no-sync do not wait for changes to be written safely to disk\n"));
|
||||||
printf(_(" -o, --old-options=OPTIONS old cluster options to pass to the server\n"));
|
printf(_(" -o, --old-options=OPTIONS old cluster options to pass to the server\n"));
|
||||||
printf(_(" -O, --new-options=OPTIONS new cluster options to pass to the server\n"));
|
printf(_(" -O, --new-options=OPTIONS new cluster options to pass to the server\n"));
|
||||||
printf(_(" -p, --old-port=PORT old cluster port number (default %d)\n"), old_cluster.port);
|
printf(_(" -p, --old-port=PORT old cluster port number (default %d)\n"), old_cluster.port);
|
||||||
|
@ -169,11 +169,14 @@ main(int argc, char **argv)
|
|||||||
new_cluster.pgdata);
|
new_cluster.pgdata);
|
||||||
check_ok();
|
check_ok();
|
||||||
|
|
||||||
|
if (user_opts.do_sync)
|
||||||
|
{
|
||||||
prep_status("Sync data directory to disk");
|
prep_status("Sync data directory to disk");
|
||||||
exec_prog(UTILITY_LOG_FILE, NULL, true, true,
|
exec_prog(UTILITY_LOG_FILE, NULL, true, true,
|
||||||
"\"%s/initdb\" --sync-only \"%s\"", new_cluster.bindir,
|
"\"%s/initdb\" --sync-only \"%s\"", new_cluster.bindir,
|
||||||
new_cluster.pgdata);
|
new_cluster.pgdata);
|
||||||
check_ok();
|
check_ok();
|
||||||
|
}
|
||||||
|
|
||||||
create_script_for_old_cluster_deletion(&deletion_script_file_name);
|
create_script_for_old_cluster_deletion(&deletion_script_file_name);
|
||||||
|
|
||||||
|
@ -279,6 +279,7 @@ typedef struct
|
|||||||
{
|
{
|
||||||
bool check; /* true -> ask user for permission to make
|
bool check; /* true -> ask user for permission to make
|
||||||
* changes */
|
* changes */
|
||||||
|
bool do_sync; /* flush changes to disk */
|
||||||
transferMode transfer_mode; /* copy files or link them? */
|
transferMode transfer_mode; /* copy files or link them? */
|
||||||
int jobs; /* number of processes/threads to use */
|
int jobs; /* number of processes/threads to use */
|
||||||
char *socketdir; /* directory to use for Unix sockets */
|
char *socketdir; /* directory to use for Unix sockets */
|
||||||
|
@ -233,7 +233,7 @@ PGDATA="$BASE_PGDATA"
|
|||||||
|
|
||||||
standard_initdb 'initdb'
|
standard_initdb 'initdb'
|
||||||
|
|
||||||
pg_upgrade $PG_UPGRADE_OPTS -d "${PGDATA}.old" -D "$PGDATA" -b "$oldbindir" -p "$PGPORT" -P "$PGPORT"
|
pg_upgrade $PG_UPGRADE_OPTS --no-sync -d "${PGDATA}.old" -D "$PGDATA" -b "$oldbindir" -p "$PGPORT" -P "$PGPORT"
|
||||||
|
|
||||||
# make sure all directories and files have group permissions, on Unix hosts
|
# make sure all directories and files have group permissions, on Unix hosts
|
||||||
# Windows hosts don't support Unix-y permissions.
|
# Windows hosts don't support Unix-y permissions.
|
||||||
|
@ -648,7 +648,9 @@ sub upgradecheck
|
|||||||
print "\nSetting up new cluster\n\n";
|
print "\nSetting up new cluster\n\n";
|
||||||
standard_initdb() or exit 1;
|
standard_initdb() or exit 1;
|
||||||
print "\nRunning pg_upgrade\n\n";
|
print "\nRunning pg_upgrade\n\n";
|
||||||
@args = ('pg_upgrade', '-d', "$data.old", '-D', $data, '-b', $bindir);
|
@args = (
|
||||||
|
'pg_upgrade', '-d', "$data.old", '-D', $data, '-b', $bindir,
|
||||||
|
'--no-sync');
|
||||||
system(@args) == 0 or exit 1;
|
system(@args) == 0 or exit 1;
|
||||||
print "\nStarting new cluster\n\n";
|
print "\nStarting new cluster\n\n";
|
||||||
@args = ('pg_ctl', '-l', "$logdir/postmaster2.log", 'start');
|
@args = ('pg_ctl', '-l', "$logdir/postmaster2.log", 'start');
|
||||||
|
Loading…
x
Reference in New Issue
Block a user