From: Rafael Kitover Date: Sat, 9 May 2009 10:50:25 +0000 (+0000) Subject: ::DBI::Replicated - fix fallback to master, test for the warning, other cleanups X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=commitdiff_plain;h=f404f53c20c515693dcee08cd6fa7cb69696d67c;p=dbsrgits%2FDBIx-Class-Historic.git ::DBI::Replicated - fix fallback to master, test for the warning, other cleanups --- diff --git a/lib/DBIx/Class/Storage/DBI/Replicated/Balancer/Random.pm b/lib/DBIx/Class/Storage/DBI/Replicated/Balancer/Random.pm index 2b0aef9..d3959d0 100644 --- a/lib/DBIx/Class/Storage/DBI/Replicated/Balancer/Random.pm +++ b/lib/DBIx/Class/Storage/DBI/Replicated/Balancer/Random.pm @@ -55,21 +55,20 @@ sub next_storage { my $self = shift @_; my @replicants = $self->pool->active_replicants; + + if (not @replicants) { + # will fall back to master anyway + return; + } + my $master = $self->master; - my $rnd = $self->random_number(@replicants + $self->master_read_weight); + my $rnd = $self->_random_number(@replicants + $self->master_read_weight); return $rnd >= @replicants ? $master : $replicants[int $rnd]; } -=head2 random_number - -Returns a random number from 0 to x, not including x. Uses perl's -L by default. - -=cut - -sub random_number { +sub _random_number { rand($_[1]) } diff --git a/t/93storage_replication.t b/t/93storage_replication.t index 40c24a5..b85da4a 100644 --- a/t/93storage_replication.t +++ b/t/93storage_replication.t @@ -6,12 +6,13 @@ use Test::Exception; use DBICTest; use List::Util 'first'; use Scalar::Util 'reftype'; +use IO::Handle; BEGIN { eval "use DBIx::Class::Storage::DBI::Replicated; use Test::Moose"; plan $@ ? ( skip_all => "Deps not installed: $@" ) - : ( tests => 89 ); + : ( tests => 90 ); } use_ok 'DBIx::Class::Storage::DBI::Replicated::Pool'; @@ -366,7 +367,7 @@ is $artist1->name, 'Ozric Tentacles' local $SIG{__WARN__} = sub {}; local - *DBIx::Class::Storage::DBI::Replicated::Balancer::Random::random_number = + *DBIx::Class::Storage::DBI::Replicated::Balancer::Random::_random_number = sub { 999 }; $replicated->schema->storage->balancer->increment_storage; @@ -469,13 +470,20 @@ ok $replicated->schema->resultset('Artist')->find(2) $replicated->schema->storage->replicants->{$replicant_names[0]}->active(0); $replicated->schema->storage->replicants->{$replicant_names[1]}->active(0); -## Silence warning about falling back to master. -$replicated->schema->storage->debugobj->silence(1); - -ok $replicated->schema->resultset('Artist')->find(2) - => 'Fallback to master'; +{ + ## catch the fallback to master warning + open my $debugfh, '>', \my $fallback_warning; + my $oldfh = $replicated->schema->storage->debugfh; + $replicated->schema->storage->debugfh($debugfh); -$replicated->schema->storage->debugobj->silence(0); + ok $replicated->schema->resultset('Artist')->find(2) + => 'Fallback to master'; + + like $fallback_warning, qr/falling back to master/ + => 'emits falling back to master warning'; + + $replicated->schema->storage->debugfh($oldfh); +} $replicated->schema->storage->replicants->{$replicant_names[0]}->active(1); $replicated->schema->storage->replicants->{$replicant_names[1]}->active(1);