This class defines the following attributes.
+=head2 master
+
+The L<DBIx::Class::Storage::DBI> object that is the master database all the
+replicants are trying to follow. The balancer needs to know it since it's the
+ultimate fallback.
+
+=cut
+
+has 'master' => (
+ is=>'ro',
+ isa=>'DBIx::Class::Storage::DBI',
+ required=>1,
+);
+
=head2 pool
The L<DBIx::Class::Storage::DBI::Replicated::Pool> object that we are trying to
sub _build_current_replicant {
my $self = shift @_;
- $self->next_storage($self->pool);
+ $self->next_storage;
}
=head2 next_storage
your own subclasses of L<DBIx::Class::Storage::DBI::Replicated::Balancer> to
support other balance systems.
+This returns from the pool of active replicants. If there are no active
+replicants, then you should have it return the master as an ultimate fallback.
+
=cut
sub next_storage {
my $self = shift @_;
- return ($self->pool->active_replicants)[0]
- if $self->pool->active_replicants;
+ my $next = ($self->pool->active_replicants)[0];
+ return $next ? $next:$self->master;
}
-=head2 after: select
+=head2 before: 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
=cut
-after 'select' => sub {
+before 'select' => sub {
my $self = shift @_;
my $next_replicant = $self->next_storage;
$self->current_replicant($next_replicant);
};
-=head2 after: select_single
+=head2 before: 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
=cut
-after 'select_single' => sub {
+before 'select_single' => sub {
my $self = shift @_;
my $next_replicant = $self->next_storage;
$self->current_replicant($next_replicant);
};
-=head2 after: columns_info_for
+=head2 before: columns_info_for
Advice on the current_replicant_storage attribute. Each time we use a replicant
we need to change it via the storage pool algorithm. That way we are spreading
=cut
-after 'columns_info_for' => sub {
+before 'columns_info_for' => sub {
my $self = shift @_;
my $next_replicant = $self->next_storage;
$self->current_replicant($next_replicant);