pg_amcheck: Minor test speedups
authorAndres Freund
Sat, 11 Mar 2023 23:41:47 +0000 (15:41 -0800)
committerAndres Freund
Sat, 11 Mar 2023 23:41:47 +0000 (15:41 -0800)
Freezing the relation N times and fetching the tuples one-by-one isn't that
cheap. On my machine this reduces test times by a bit less than one second, on
windows CI it's a few seconds.

Reviewed-by: Mark Dilger
Discussion: https://postgr.es/m/20230309001558[email protected]

src/bin/pg_amcheck/t/004_verify_heapam.pl

index 9984d0d9f87effe13e97060e2ff34c2b682d7a3a..e5ae7e6aadaa986a465ebba59f1608411a2615ef 100644 (file)
@@ -217,17 +217,17 @@ my $rel = $node->safe_psql('postgres',
 my $relpath = "$pgdata/$rel";
 
 # Insert data and freeze public.test
-use constant ROWCOUNT => 17;
+my $ROWCOUNT = 17;
 $node->safe_psql(
    'postgres', qq(
    INSERT INTO public.test (a, b, c)
-       VALUES (
+       SELECT
            x'DEADF9F9DEADF9F9'::bigint,
            'abcdefg',
            repeat('w', 10000)
-       );
-   VACUUM FREEZE public.test
-   )) for (1 .. ROWCOUNT);
+        FROM generate_series(1, $ROWCOUNT);
+   VACUUM FREEZE public.test;)
+);
 
 my $relfrozenxid = $node->safe_psql('postgres',
    q(select relfrozenxid from pg_class where relname = 'test'));
@@ -246,16 +246,13 @@ if ($datfrozenxid <= 3 || $datfrozenxid >= $relfrozenxid)
 }
 
 # Find where each of the tuples is located on the page.
-my @lp_off;
-for my $tup (0 .. ROWCOUNT - 1)
-{
-   push(
-       @lp_off,
-       $node->safe_psql(
-           'postgres', qq(
-select lp_off from heap_page_items(get_raw_page('test', 'main', 0))
-   offset $tup limit 1)));
-}
+my @lp_off = split '\n', $node->safe_psql(
+   'postgres', qq(
+       select lp_off from heap_page_items(get_raw_page('test', 'main', 0))
+       where lp <= $ROWCOUNT
+    )
+);
+is(scalar @lp_off, $ROWCOUNT, "acquired row offsets");
 
 # Sanity check that our 'test' table on disk layout matches expectations.  If
 # this is not so, we will have to skip the test until somebody updates the test
@@ -267,7 +264,7 @@ open($file, '+<', $relpath)
 binmode $file;
 
 my $ENDIANNESS;
-for (my $tupidx = 0; $tupidx < ROWCOUNT; $tupidx++)
+for (my $tupidx = 0; $tupidx < $ROWCOUNT; $tupidx++)
 {
    my $offnum = $tupidx + 1;        # offnum is 1-based, not zero-based
    my $offset = $lp_off[$tupidx];
@@ -345,7 +342,7 @@ open($file, '+<', $relpath)
   or BAIL_OUT("open failed: $!");
 binmode $file;
 
-for (my $tupidx = 0; $tupidx < ROWCOUNT; $tupidx++)
+for (my $tupidx = 0; $tupidx < $ROWCOUNT; $tupidx++)
 {
    my $offnum = $tupidx + 1;        # offnum is 1-based, not zero-based
    my $offset = $lp_off[$tupidx];
@@ -522,7 +519,7 @@ for (my $tupidx = 0; $tupidx < ROWCOUNT; $tupidx++)
        $tup->{t_infomask} &= ~HEAP_XMIN_INVALID;
 
        push @expected,
-          qr/${$header}xmin ${xmin} equals or exceeds next valid transaction ID 0:\d+/;
+         qr/${$header}xmin ${xmin} equals or exceeds next valid transaction ID 0:\d+/;
    }
    write_tuple($file, $offset, $tup);
 }