diff --git a/src/bin/pg_upgrade/t/002_pg_upgrade.pl b/src/bin/pg_upgrade/t/002_pg_upgrade.pl index 3457b31cf0f..311391d7acd 100644 --- a/src/bin/pg_upgrade/t/002_pg_upgrade.pl +++ b/src/bin/pg_upgrade/t/002_pg_upgrade.pl @@ -83,10 +83,9 @@ sub get_dump_for_comparison open(my $dh, '>', $dump_adjusted) || die "could not open $dump_adjusted for writing $!"; - # Don't dump statistics, because there are still some bugs. $node->run_log( [ - 'pg_dump', '--no-sync', '--no-statistics', + 'pg_dump', '--no-sync', '-d' => $node->connstr($db), '-f' => $dumpfile ]); @@ -301,64 +300,9 @@ else is($rc, 0, 'regression tests pass'); } -# Test that dump/restore of the regression database roundtrips cleanly. This -# doesn't work well when the nodes are different versions, so skip it in that -# case. Note that this isn't a pg_restore test, but it's convenient to do it -# here because we've gone to the trouble of creating the regression database. -# -# Do this while the old cluster is running before it is shut down by the -# upgrade test. -SKIP: -{ - my $dstnode = PostgreSQL::Test::Cluster->new('dst_node'); - - skip "different Postgres versions" - if ($oldnode->pg_version != $dstnode->pg_version); - skip "source node not using default install" - if (defined $oldnode->install_path); - - # Dump the original database for comparison later. - my $src_dump = - get_dump_for_comparison($oldnode, 'regression', 'src_dump', 1); - - # Setup destination database cluster - $dstnode->init(%old_node_params); - # Stabilize stats for comparison. - $dstnode->append_conf('postgresql.conf', 'autovacuum = off'); - $dstnode->start; - - my $dump_file = "$tempdir/regression.dump"; - - # Use --create in dump and restore commands so that the restored - # database has the same configurable variable settings as the original - # database so that the dumps taken from both databases taken do not - # differ because of locale changes. Additionally this provides test - # coverage for --create option. - # - # Use directory format so that we can use parallel dump/restore. - $oldnode->command_ok( - [ - 'pg_dump', '-Fd', '-j2', '--no-sync', - '-d' => $oldnode->connstr('regression'), - '--create', '-f' => $dump_file - ], - 'pg_dump on source instance'); - - $dstnode->command_ok( - [ 'pg_restore', '--create', '-j2', '-d' => 'postgres', $dump_file ], - 'pg_restore to destination instance'); - - my $dst_dump = - get_dump_for_comparison($dstnode, 'regression', 'dest_dump', 0); - - compare_files($src_dump, $dst_dump, - 'dump outputs from original and restored regression databases match'); -} - # Initialize a new node for the upgrade. my $newnode = PostgreSQL::Test::Cluster->new('new_node'); - # The new cluster will be initialized with different locale settings, # but these settings will be overwritten with those of the original # cluster. @@ -409,10 +353,66 @@ if (defined($ENV{oldinstall})) } } -# Stabilize stats before pg_dumpall. +# Stabilize stats before pg_dump / pg_dumpall. Doing it after initializing +# the new node gives enough time for autovacuum to update statistics on the +# old node. $oldnode->append_conf('postgresql.conf', 'autovacuum = off'); $oldnode->restart; +# Test that dump/restore of the regression database roundtrips cleanly. This +# doesn't work well when the nodes are different versions, so skip it in that +# case. Note that this isn't a pg_upgrade test, but it's convenient to do it +# here because we've gone to the trouble of creating the regression database. +# +# Do this while the old cluster is running before it is shut down by the +# upgrade test but after turning its autovacuum off for stable statistics. +SKIP: +{ + my $dstnode = PostgreSQL::Test::Cluster->new('dst_node'); + + skip "different Postgres versions" + if ($oldnode->pg_version != $dstnode->pg_version); + skip "source node not using default install" + if (defined $oldnode->install_path); + + # Setup destination database cluster with the same configuration as the + # source cluster to avoid any differences between dumps taken from both the + # clusters caused by differences in their configurations. + $dstnode->init(%old_node_params); + # Stabilize stats for comparison. + $dstnode->append_conf('postgresql.conf', 'autovacuum = off'); + $dstnode->start; + + # Use --create in dump and restore commands so that the restored + # database has the same configurable variable settings as the original + # database so that the dumps taken from both databases taken do not + # differ because of locale changes. Additionally this provides test + # coverage for --create option. + # + # Use directory format so that we can use parallel dump/restore. + my $dump_file = "$tempdir/regression.dump"; + $oldnode->command_ok( + [ + 'pg_dump', '-Fd', '-j2', '--no-sync', + '-d' => $oldnode->connstr('regression'), + '--create', '-f' => $dump_file + ], + 'pg_dump on source instance'); + + $dstnode->command_ok( + [ 'pg_restore', '--create', '-j2', '-d' => 'postgres', $dump_file ], + 'pg_restore to destination instance'); + + # Dump original and restored database for comparison. + my $src_dump = + get_dump_for_comparison($oldnode, 'regression', 'src_dump', 1); + my $dst_dump = + get_dump_for_comparison($dstnode, 'regression', 'dest_dump', 0); + + compare_files($src_dump, $dst_dump, + 'dump outputs from original and restored regression databases match'); +} + # Take a dump before performing the upgrade as a base comparison. Note # that we need to use pg_dumpall from the new node here. my @dump_command = (