retire startup rh bug testing and bring in 99rh_perl_perf_bug.t from trunk
Peter Rabbitson [Thu, 29 Jan 2009 20:54:32 +0000 (20:54 +0000)]
lib/DBIx/Class/StartupCheck.pm
t/99rh_perl_perf_bug.t [new file with mode: 0644]

index 4710192..6a34606 100644 (file)
@@ -1,34 +1,5 @@
 package DBIx::Class::StartupCheck;
 
-BEGIN {
-
-    { package TestRHBug; use overload bool => sub { 0 } }
-
-    sub _has_bug_34925 {
-       my %thing;
-       my $r1 = \%thing;
-       my $r2 = \%thing;
-       bless $r1 => 'TestRHBug';
-       return !!$r2;
-    }
-
-    sub _possibly_has_bad_overload_performance {
-       return $] < 5.008009 && ! _has_bug_34925();
-    }
-
-    unless ($ENV{DBIC_NO_WARN_BAD_PERL}) {
-       if (_possibly_has_bad_overload_performance()) {
-           print STDERR "\n\nWARNING: " . __PACKAGE__ . ": This version of Perl is likely to exhibit\n" .
-               "extremely slow performance for certain critical operations.\n" .
-               "Please consider recompiling Perl.  For more information, see\n" .
-               "https://bugzilla.redhat.com/show_bug.cgi?id=196836 and/or\n" .
-               "http://lists.scsys.co.uk/pipermail/dbix-class/2007-October/005119.html.\n" .
-               "You can suppress this message by setting DBIC_NO_WARN_BAD_PERL=1 in your\n" .
-               "environment.\n\n";
-       }
-    }
-}
-
 =head1 NAME
 
 DBIx::Class::StartupCheck - Run environment checks on startup
@@ -39,15 +10,22 @@ DBIx::Class::StartupCheck - Run environment checks on startup
   
 =head1 DESCRIPTION
 
-Currently this module checks for, and if necessary issues a warning for, a
-particular bug found on RedHat systems from perl-5.8.8-10 and up.  Other checks
-may be added from time to time.
+This module used to check for, and if necessary issue a warning for, a
+particular bug found on Red Hat and Fedora systems using their system
+perl build. As of September 2008 there are fixed versions of perl for
+all current Red Hat and Fedora distributions, but the old check still
+triggers, incorrectly flagging those versions of perl to be buggy. A
+more comprehensive check has been moved into the test suite in
+C<t/99rh_perl_perf_bug.t> and further information about the bug has been
+put in L<DBIx::Class::Manual::Troubleshooting>
+
+Other checks may be added from time to time.
 
 Any checks herein can be disabled by setting an appropriate environment
-variable.  If your system suffers from a particular bug, you will get a warning
-message on startup sent to STDERR, explaining what to do about it and how to
-suppress the message.  If you don't see any messages, you have nothing to worry
-about.
+variable. If your system suffers from a particular bug, you will get a
+warning message on startup sent to STDERR, explaining what to do about
+it and how to suppress the message. If you don't see any messages, you
+have nothing to worry about.
 
 =head1 CONTRIBUTORS
 
diff --git a/t/99rh_perl_perf_bug.t b/t/99rh_perl_perf_bug.t
new file mode 100644 (file)
index 0000000..4b275fb
--- /dev/null
@@ -0,0 +1,113 @@
+#!/usr/bin/perl
+use strict;
+use warnings;
+use Test::More;
+use lib qw(t/lib);
+
+# This is a rather unusual test.
+# It does not test any aspect of DBIx::Class, but instead tests the
+# perl installation this is being run under to see if it is:-
+#  1. Potentially affected by a RH perl build bug
+#  2. If so we do a performance test for the effect of
+#     that bug.
+#
+# You can skip these tests by setting the DBIC_NO_WARN_BAD_PERL env
+# variable
+#
+# If these tests fail then please read the section titled
+# Perl Performance Issues on Red Hat Systems in
+# L<DBIx::Class::Manual::Troubleshooting>
+
+plan skip_all =>
+  'Skipping RH perl performance bug tests as DBIC_NO_WARN_BAD_PERL set'
+  if ( $ENV{DBIC_NO_WARN_BAD_PERL} );
+
+plan skip_all => 'Skipping as AUTOMATED_TESTING is set'
+  if ( $ENV{AUTOMATED_TESTING} );
+
+eval "use Benchmark ':all'";
+plan skip_all => 'needs Benchmark for testing' if $@;
+
+plan tests => 3;
+
+ok( 1, 'Dummy - prevents next test timing out' );
+
+# we do a benchmark test filling an array with blessed/overloaded references,
+# against an array filled with array refs.
+# On a sane system the ratio between these operation sets is 1 - 1.5,
+# whereas a bugged system gives a ratio of around 8
+# we therefore consider there to be a problem if the ratio is >= 2
+
+my $results = timethese(
+    -1,    # run for 1 CPU second each
+    {
+        no_bless => sub {
+            my %h;
+            for ( my $i = 0 ; $i < 10000 ; $i++ ) {
+                $h{$i} = [];
+            }
+        },
+        bless_overload => sub {
+            use overload q(<) => sub { };
+            my %h;
+            for ( my $i = 0 ; $i < 10000 ; $i++ ) {
+                $h{$i} = bless [] => 'main';
+            }
+        },
+    },
+);
+
+my $ratio = $results->{no_bless}->iters / $results->{bless_overload}->iters;
+
+ok( ( $ratio < 2 ), 'Overload/bless performance acceptable' )
+  || diag(
+    "This perl has a substantial slow down when handling large numbers\n",
+    "of blessed/overloaded objects.  This can severely adversely affect\n",
+    "the performance of DBIx::Class programs.  Please read the section\n",
+    "in the Troubleshooting POD documentation entitled\n",
+    "'Perl Performance Issues on Red Hat Systems'\n",
+  );
+
+# We will only check for the difference in bless handling (whether the
+# bless applies to the reference or the referent) if we have seen a
+# performance issue...
+
+SKIP: {
+    skip "Not checking for bless handling as performance is OK", 1
+      if ( $ratio < 2 );
+
+    {
+        package    # don't want this in PAUSE
+          TestRHBug;
+        use overload bool => sub { 0 }
+    }
+
+    sub _has_bug_34925 {
+        my %thing;
+        my $r1 = \%thing;
+        my $r2 = \%thing;
+        bless $r1 => 'TestRHBug';
+        return !!$r2;
+    }
+
+    sub _possibly_has_bad_overload_performance {
+        return $] < 5.008009 && !_has_bug_34925();
+    }
+
+    # If this next one fails then you almost certainly have a RH derived
+    # perl with the performance bug
+    # if this test fails, look at the section titled
+    # "Perl Performance Issues on Red Hat Systems" in
+    # L<DBIx::Class::Manual::Troubleshooting>
+    # Basically you may suffer severe performance issues when running
+    # DBIx::Class (and many other) modules.  Look at getting a fixed
+    # version of the perl interpreter for your system.
+    #
+    ok( !_possibly_has_bad_overload_performance(),
+        'Checking whether bless applies to reference not object' )
+      || diag(
+        "This perl is probably derived from a buggy Red Hat perl build\n",
+        "Please read the section in the Troubleshooting POD documentation\n",
+        "entitled 'Perl Performance Issues on Red Hat Systems'\n",
+      );
+}