X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FDBIx%2FClass%2FStorage%2FDBI%2FReplicated%2FBalancer.pm;h=186e4832d24d6f687c971f00329420a1a9652e22;hb=bbafcf262b74716a37f4265512ba5c1ecd92e15b;hp=ed7007d3d52f8db9d91a9b928734490199022d76;hpb=17b05c131035f73964c434c1a9c8b28e46aebeeb;p=dbsrgits%2FDBIx-Class.git diff --git a/lib/DBIx/Class/Storage/DBI/Replicated/Balancer.pm b/lib/DBIx/Class/Storage/DBI/Replicated/Balancer.pm index ed7007d..186e483 100644 --- a/lib/DBIx/Class/Storage/DBI/Replicated/Balancer.pm +++ b/lib/DBIx/Class/Storage/DBI/Replicated/Balancer.pm @@ -30,9 +30,9 @@ validating every query. =cut has 'auto_validate_every' => ( - is=>'rw', - isa=>'Int', - predicate=>'has_auto_validate_every', + is=>'rw', + isa=>'Int', + predicate=>'has_auto_validate_every', ); =head2 master @@ -44,9 +44,9 @@ ultimate fallback. =cut has 'master' => ( - is=>'ro', - isa=>'DBIx::Class::Storage::DBI', - required=>1, + is=>'ro', + isa=>'DBIx::Class::Storage::DBI', + required=>1, ); =head2 pool @@ -57,9 +57,9 @@ balance. =cut has 'pool' => ( - is=>'ro', - isa=>'DBIx::Class::Storage::DBI::Replicated::Pool', - required=>1, + is=>'ro', + isa=>'DBIx::Class::Storage::DBI::Replicated::Pool', + required=>1, ); =head2 current_replicant @@ -76,14 +76,14 @@ via it's balancer object. =cut has 'current_replicant' => ( - is=> 'rw', - isa=>'DBIx::Class::Storage::DBI', - lazy_build=>1, - handles=>[qw/ - select - select_single - columns_info_for - /], + is=> 'rw', + isa=>'DBIx::Class::Storage::DBI', + lazy_build=>1, + handles=>[qw/ + select + select_single + columns_info_for + /], ); =head1 METHODS @@ -97,8 +97,8 @@ Lazy builder for the L attribute. =cut sub _build_current_replicant { - my $self = shift @_; - $self->next_storage; + my $self = shift @_; + $self->next_storage; } =head2 next_storage @@ -124,23 +124,35 @@ or just just forgot to create them :) =cut around 'next_storage' => sub { - my ($next_storage, $self, @args) = @_; - my $now = time; - - ## Do we need to validate the replicants? - if( - $self->has_auto_validate_every && - ($self->auto_validate_every + $self->pool->last_validated) <= $now - ) { - $self->pool->validate_replicants; - } + my ($next_storage, $self, @args) = @_; + my $now = time; - ## Get a replicant, or the master if none - my $next = $self->$next_storage(@args); - return $next ? $next:$self->master; + ## Do we need to validate the replicants? + if( + $self->has_auto_validate_every && + ($self->auto_validate_every + $self->pool->last_validated) <= $now + ) { + $self->pool->validate_replicants; + } + + ## Get a replicant, or the master if none + my $next = $self->$next_storage(@args); + return $next ? $next:$self->master; }; -=head2 before: select +=head2 increment_storage + +Rolls the Storage to whatever is next in the queue, as defined by the Balancer. + +=cut + +sub increment_storage { + my $self = shift @_; + my $next_replicant = $self->next_storage; + $self->current_replicant($next_replicant); +} + +=head2 around: select Advice on the select attribute. Each time we use a replicant we need to change it via the storage pool algorithm. That way we are spreading @@ -148,13 +160,18 @@ the load evenly (hopefully) across existing capacity. =cut -before 'select' => sub { - my $self = shift @_; - my $next_replicant = $self->next_storage; - $self->current_replicant($next_replicant); +around 'select' => sub { + my ($select, $self, @args) = @_; + + if ($args[-1]->{execute_reliably}) { + return $self->master->select(@args); + } else { + $self->increment_storage; + return $self->$select(@args); + } }; -=head2 before: select_single +=head2 around: select_single Advice on the select_single attribute. Each time we use a replicant we need to change it via the storage pool algorithm. That way we are spreading @@ -162,10 +179,15 @@ the load evenly (hopefully) across existing capacity. =cut -before 'select_single' => sub { - my $self = shift @_; - my $next_replicant = $self->next_storage; - $self->current_replicant($next_replicant); +around 'select_single' => sub { + my ($select_single, $self, @args) = @_; + + if ($args[-1]->{execute_reliably}) { + return $self->master->select_single(@args); + } else { + $self->increment_storage; + return $self->$select_single(@args); + } }; =head2 before: columns_info_for @@ -177,9 +199,8 @@ the load evenly (hopefully) across existing capacity. =cut before 'columns_info_for' => sub { - my $self = shift @_; - my $next_replicant = $self->next_storage; - $self->current_replicant($next_replicant); + my $self = shift @_; + $self->increment_storage; }; =head1 AUTHOR