8.4 does FSM differently: handle that.
authorGreg Sabino Mullane <[email protected]>
Fri, 24 Apr 2009 23:26:10 +0000 (19:26 -0400)
committerGreg Sabino Mullane <[email protected]>
Fri, 24 Apr 2009 23:26:10 +0000 (19:26 -0400)
check_postgres.pl
t/02_fsm_pages.t
t/02_fsm_relations.t

index 94f9d522f44f2e34d79bc6cb38d9818d5451adfe..0fad690d6e03876f8d56a3e9b350e0ce04de58c2 100755 (executable)
@@ -121,7 +121,9 @@ our %msg = (
        'diskspace-nodir'    => q{Could not find data directory "$1"},
        'file-noclose'       => q{Could not close $1: $2},
        'fsm-page-msg'       => q{fsm page slots used: $1 of $2 ($3%)},
+       'fsm-page-highver'   => q{Cannot check on fsm_pages on servers version 8.4 or greater},
        'fsm-rel-msg'        => q{fsm relations used: $1 of $2 ($3%)},
+       'fsm-rel-highver'    => q{Cannot check on fsm_relations on servers version 8.4 or greater},
        'invalid-option'     => q{Invalid option},
        'invalid-query'      => q{Invalid query returned: $1},
        'listener-count'     => q{ listening=$1}, ## needs leading space
@@ -305,7 +307,9 @@ our %msg = (
        'diskspace-nodir'    => q{N'a pas pu trouver le répertoire des données « $1 »},
        'file-noclose'       => q{N'a pas pu fermer $1 : $2},
        'fsm-page-msg'       => q{emplacements de pages utilisés par la FSM : $1 sur $2 ($3%)},
+'fsm-page-highver'   => q{Cannot check on fsm_pages on servers version 8.4 or greater},
        'fsm-rel-msg'        => q{relations tracées par la FSM : $1 sur $2 ($3%)},
+'fsm-rel-highver'    => q{Cannot check on fsm_relations on servers version 8.4 or greater},
        'invalid-option'     => q{Option invalide},
        'invalid-query'      => q{Une requête invalide a renvoyé : $1},
        'listener-count'     => q{ listening=$1}, ## needs leading space
@@ -988,8 +992,8 @@ our %testaction = (
                                  txn_idle         => 'ON: stats_command_string(<8.3) VERSION: 8.0',
                                  txn_time         => 'VERSION: 8.3',
                                  wal_files        => 'VERSION: 8.1',
-                                 fsm_pages        => 'VERSION: 8.2',
-                                 fsm_relations    => 'VERSION: 8.2',
+                                 fsm_pages        => 'VERSION: 8.2 MAX: 8.3',
+                                 fsm_relations    => 'VERSION: 8.2 MAX: 8.3',
 );
 if ($opt{test}) {
        print msgn('testmode-start');
@@ -1028,6 +1032,21 @@ if ($opt{test}) {
                        }
                }
 
+               if ($limit =~ /MAX: ((\d+)\.(\d+))/) {
+                       my ($rver,$rmaj,$rmin) = ($1,$2,$3);
+                       for my $db (@{$info->{db}}) {
+                               next unless exists $db->{ok};
+                               if ($set{$db->{pname}}{server_version} !~ /((\d+)\.(\d+))/) {
+                                       print msgn('testmode-nover', $db->{pname});
+                                       next;
+                               }
+                               my ($sver,$smaj,$smin) = ($1,$2,$3);
+                               if ($smaj > $rmaj) {
+                                       print msgn('testmode-norun', $ac, $db->{pname}, $rver, $sver);
+                               }
+                       }
+               }
+
                while ($limit =~ /\bON: (\w+)(?:\(([<>=])(\d+\.\d+)\))?/g) {
                        my ($setting,$op,$ver) = ($1,$2||'',$3||0);
                        for my $db (@{$info->{db}}) {
@@ -2816,10 +2835,15 @@ sub check_fsm_pages {
                          qq{ ELSE interestingpages/16 END) AS sumrequests,\n}.
                          qq{ COUNT(relfilenode) AS numrels, 16 AS chunkpages FROM pg_freespacemap_relations) AS foo) AS foo2,\n}.
                          q{ (SELECT setting::NUMERIC AS maxx FROM pg_settings WHERE name = 'max_fsm_pages') AS foo3};
+       my $SQLNOOP = qq{SELECT 'FAIL'};
 
-       my $info = run_command($SQL, {regex => qr[\d+] } );
+       my $info = run_command($SQL, { version => [ ">8.3 $SQLNOOP" ] } );
 
        for $db (@{$info->{db}}) {
+               if ($db->{slurp} =~ /\s*FAIL/) {
+                       add_unknown msg('fsm-page-highver');
+                       return;
+               }
          SLURP: while ($db->{slurp} =~ /\s*(\d*) \|\s+(\d+) \|\s+(\d*)$/gsm) {
                        my ($pages,$max,$percent) = ($1||0,$2,$3||0);
 
@@ -2871,10 +2895,15 @@ sub check_fsm_relations {
                          qq{FROM (SELECT\n}.
                          qq{ (SELECT COUNT(*) FROM pg_freespacemap_relations) AS cur,\n}.
                          qq{ (SELECT setting::NUMERIC FROM pg_settings WHERE name='max_fsm_relations') AS maxx) x\n};
+       my $SQLNOOP = qq{SELECT 'FAIL'};
 
-       my $info = run_command($SQL, {regex => qr[\w+] } );
+       my $info = run_command($SQL, { version => [ ">8.3 $SQLNOOP" ] } );
 
        for $db (@{$info->{db}}) {
+               if ($db->{slurp} =~ /\s*FAIL/) {
+                       add_unknown msg('fsm-rel-highver');
+                       return;
+               }
          SLURP: while ($db->{slurp} =~ /\s*(\d+) \|\s+(\d+) \|\s+(\d+)$/gsm) {
                        my ($max,$cur,$percent) = ($1,$2,$3);
 
@@ -6008,7 +6037,8 @@ Items not specifically attributed are by Greg Sabino Mullane.
   French translations (Guillaume Lelarge)
   Make the backends search return ok if no matches due to inclusion rules,
     per report by Guillaume Lelarge (Greg)
-  Begin adding comprehensive unit tests (Greg)
+  Added comprehensive unit tests (Greg, Jeff Boes, Selena Decklemann)
+  Make fsm_pages and fsm_relatins handle 8.4 servers smoothly. (Greg)
   Fix missing 'upd' field in show_dbstats (Andras Fabian)
   Fix incorrect regex in txn_wraparound (Greg)
   For txn_wraparound: consistent ordering and fix duplicates in perf output (Andras Fabian)
index fd2a54253de447c80d8f0d77365606333444325f..8ad70ca14185c174a1cb44b5fab67e508a8e7e52 100644 (file)
@@ -5,7 +5,6 @@
 use strict;
 use warnings;
 use Data::Dumper;
-use DBI;
 use Test::More tests => 7;
 use lib 't','.';
 use CP_Testing;
@@ -17,6 +16,7 @@ my $cp = CP_Testing->new( {default_action => 'fsm_pages'} );
 $dbh = $cp->test_database_handle();
 
 my $S = q{Action 'fsm_pages'};
+my $label = 'POSTGRES_FSM_PAGES';
 
 $t=qq{$S fails when called with an invalid option};
 like ($cp->run('foobar=12'), qr{^\s*Usage:}, $t);
@@ -57,18 +57,31 @@ CREATE TABLE $schema.pg_freespacemap_relations (
 });
 $dbh->commit();
 
+my $ver = $dbh->{pg_server_version};
+if ($ver >= 80400) {
+  SKIP: {
+               skip 'Cannot test fsm_pages completely on Postgres 8.4 or higher', 3;
+       }
+
+       $t=qq{$S gives an unknown when running against a 8.4 or higher version};
+       like ($cp->run('--warning=10%'), qr{^$label UNKNOWN.*Cannot check on fsm_pages}, $t);
+
+       exit;
+}
+
+
 $t=qq{$S gives normal output for empty tables};
-like ($cp->run('--warning=10%'), qr{^POSTGRES_FSM_PAGES OK: .+fsm page slots used: 0 of \d+}, $t);
+like ($cp->run('--warning=10%'), qr{^$label OK: .+fsm page slots used: 0 of \d+}, $t);
 
 $dbh->do("INSERT INTO $schema.pg_freespacemap_pages VALUES (1663,16389,16911,34,764)");
 $dbh->do("INSERT INTO $schema.pg_freespacemap_relations VALUES (1663,16389,16911,1077,52283,52283,37176)");
 $dbh->commit();
 
 $t=qq{$S gives normal warning output};
-like ($cp->run('--warning=10%'), qr{^POSTGRES_FSM_PAGES WARNING: .+fsm page slots used: 52288 of \d+}, $t);
+like ($cp->run('--warning=10%'), qr{^$label WARNING: .+fsm page slots used: 52288 of \d+}, $t);
 
 $t=qq{$S gives normal critical output};
-like ($cp->run('--critical=5%'), qr{^POSTGRES_FSM_PAGES CRITICAL: .+fsm page slots used: 52288 of \d+}, $t);
+like ($cp->run('--critical=5%'), qr{^$label CRITICAL: .+fsm page slots used: 52288 of \d+}, $t);
 
 $t=qq{$S gives normal output for MRTG};
 is ($cp->run('--critical=5% --output=MRTG'), qq{34\n52288\n\n\n}, $t);
index aacdaf3c79bfec1306234764248074c63f04f53c..c0afe375903b6cff1f972af77ce7396549fc3d0a 100644 (file)
@@ -5,7 +5,6 @@
 use strict;
 use warnings;
 use Data::Dumper;
-use DBI;
 use Test::More tests => 7;
 use lib 't','.';
 use CP_Testing;
@@ -17,6 +16,7 @@ my $cp = CP_Testing->new( {default_action => 'fsm_relations'} );
 $dbh = $cp->test_database_handle();
 
 my $S = q{Action 'fsm_relations'};
+my $label = 'POSTGRES_FSM_RELATIONS';
 
 $t=qq{$S fails when called with an invalid option};
 like ($cp->run('foobar=12'), qr{^\s*Usage:}, $t);
@@ -57,8 +57,20 @@ CREATE TABLE $schema.pg_freespacemap_relations (
 });
 $dbh->commit();
 
+my $ver = $dbh->{pg_server_version};
+if ($ver >= 80400) {
+  SKIP: {
+               skip 'Cannot test fsm_relations completely on Postgres 8.4 or higher', 3;
+       }
+
+       $t=qq{$S gives an unknown when running against a 8.4 or higher version};
+       like ($cp->run('--warning=10%'), qr{^$label UNKNOWN.*Cannot check on fsm_relations}, $t);
+
+       exit;
+}
+
 $t=qq{$S gives normal output for empty tables};
-like ($cp->run('--warning=10%'), qr{^POSTGRES_FSM_RELATIONS OK: .+fsm relations used: 0 of \d+}, $t);
+like ($cp->run('--warning=10%'), qr{^$label OK: .+fsm relations used: 0 of \d+}, $t);
 
 $dbh->do("INSERT INTO $schema.pg_freespacemap_pages VALUES (1663,16389,16911,34,764)");
 my $sth = $dbh->prepare("INSERT INTO $schema.pg_freespacemap_relations VALUES (?,?,?,?,?,?,?)");
@@ -68,10 +80,10 @@ for (1..999) {
 $dbh->commit();
 
 $t=qq{$S gives normal warning output};
-like ($cp->run('--warning=10%'), qr{^POSTGRES_FSM_RELATIONS WARNING: .+fsm relations used: 999 of \d+}, $t);
+like ($cp->run('--warning=10%'), qr{^$label WARNING: .+fsm relations used: 999 of \d+}, $t);
 
 $t=qq{$S gives normal critical output};
-like ($cp->run('--critical=5%'), qr{^POSTGRES_FSM_RELATIONS CRITICAL: .+fsm relations used: 999 of \d+}, $t);
+like ($cp->run('--critical=5%'), qr{^$label CRITICAL: .+fsm relations used: 999 of \d+}, $t);
 
 $t=qq{$S gives normal output for MRTG};
 is ($cp->run('--critical=5% --output=MRTG'), qq{100\n999\n\n\n}, $t);