[check_postgres] [commit] 8.4 does FSM differently: handle that.

check_postgres at bucardo.org check_postgres at bucardo.org
Fri Apr 24 23:27:18 UTC 2009


Committed by Greg Sabino Mullane <greg at endpoint.com>

8.4 does FSM differently: handle that.

---
 check_postgres.pl    |   40 +++++++++++++++++++++++++++++++++++-----
 t/02_fsm_pages.t     |   21 +++++++++++++++++----
 t/02_fsm_relations.t |   20 ++++++++++++++++----
 3 files changed, 68 insertions(+), 13 deletions(-)

diff --git a/check_postgres.pl b/check_postgres.pl
index 94f9d52..0fad690 100755
--- a/check_postgres.pl
+++ b/check_postgres.pl
@@ -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)
diff --git a/t/02_fsm_pages.t b/t/02_fsm_pages.t
index fd2a542..8ad70ca 100644
--- a/t/02_fsm_pages.t
+++ b/t/02_fsm_pages.t
@@ -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);
diff --git a/t/02_fsm_relations.t b/t/02_fsm_relations.t
index aacdaf3..c0afe37 100644
--- a/t/02_fsm_relations.t
+++ b/t/02_fsm_relations.t
@@ -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);
-- 
1.6.0.5



More information about the Check_postgres mailing list