From: Peter Rabbitson Date: Thu, 29 Jan 2009 20:54:32 +0000 (+0000) Subject: retire startup rh bug testing and bring in 99rh_perl_perf_bug.t from trunk X-Git-Tag: v0.08011~14 X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=commitdiff_plain;h=b953fd8c4731196fd3e4c61c5e69910c4f4aff04;p=dbsrgits%2FDBIx-Class.git retire startup rh bug testing and bring in 99rh_perl_perf_bug.t from trunk --- diff --git a/lib/DBIx/Class/StartupCheck.pm b/lib/DBIx/Class/StartupCheck.pm index 4710192..6a34606 100644 --- a/lib/DBIx/Class/StartupCheck.pm +++ b/lib/DBIx/Class/StartupCheck.pm @@ -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 and further information about the bug has been +put in L + +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 index 0000000..4b275fb --- /dev/null +++ b/t/99rh_perl_perf_bug.t @@ -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 + +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 + # 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", + ); +}