X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FDBIx%2FClass%2FStorage%2FDBI%2FReplicated%2FBalancer%2FRandom.pm;h=6b430f4666740220bc6c4a872f43b872b94138ad;hb=a2bd379666d729133d65c85dc775627937084b18;hp=086ee136e108c52a2c2207d0875ef7e05e9e838f;hpb=64cdad22d9b4022de379ae43174c15ce8dc81b59;p=dbsrgits%2FDBIx-Class.git diff --git a/lib/DBIx/Class/Storage/DBI/Replicated/Balancer/Random.pm b/lib/DBIx/Class/Storage/DBI/Replicated/Balancer/Random.pm index 086ee13..6b430f4 100644 --- a/lib/DBIx/Class/Storage/DBI/Replicated/Balancer/Random.pm +++ b/lib/DBIx/Class/Storage/DBI/Replicated/Balancer/Random.pm @@ -1,18 +1,19 @@ package DBIx::Class::Storage::DBI::Replicated::Balancer::Random; -use List::Util qw(shuffle); use Moose; with 'DBIx::Class::Storage::DBI::Replicated::Balancer'; +use DBIx::Class::Storage::DBI::Replicated::Types 'Weight'; +use namespace::clean -except => 'meta'; =head1 NAME -DBIx::Class::Storage::DBI::Replicated::Balancer::Random; A 'random' Balancer +DBIx::Class::Storage::DBI::Replicated::Balancer::Random - A 'random' Balancer =head1 SYNOPSIS This class is used internally by L. You shouldn't need to create instances of this class. - + =head1 DESCRIPTION Given a pool (L) of replicated @@ -27,6 +28,23 @@ you, patches welcome. This class defines the following attributes. +=head2 master_read_weight + +A number greater than 0 that specifies what weight to give the master when +choosing which backend to execute a read query on. A value of 0, which is the +default, does no reads from master, while a value of 1 gives it the same +priority as any single replicant. + +For example: if you have 2 replicants, and a L of C<0.5>, +the chance of reading from master will be C<20%>. + +You can set it to a value higher than 1, making master have higher weight than +any single replicant, if for example you have a very powerful master. + +=cut + +has master_read_weight => (is => 'rw', isa => Weight, default => sub { 0 }); + =head1 METHODS This class defines the following methods. @@ -40,17 +58,39 @@ be requested several times in a row. =cut sub next_storage { - return (shuffle(shift->pool->active_replicants))[0]; + 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); + + return $rnd >= @replicants ? $master : $replicants[int $rnd]; +} + +sub _random_number { + rand($_[1]) } -=head1 AUTHOR +=head1 FURTHER QUESTIONS? -John Napiorkowski +Check the list of L. -=head1 LICENSE +=head1 COPYRIGHT AND LICENSE -You may distribute this code under the same terms as Perl itself. +This module is free software L +by the L. You can +redistribute it and/or modify it under the same terms as the +L. =cut -1; \ No newline at end of file +__PACKAGE__->meta->make_immutable; + +1;