blob: 34d92737280c5ae41cc308627b3c006fd02095e6 (
plain) (
tree)
|
|
package Net::Riak::Role::Hosts;
use Moose::Role;
use Moose::Util::TypeConstraints;
subtype 'RiakHost' => as 'ArrayRef[HashRef]';
coerce 'RiakHost' => from 'Str' => via {
[{node => $_, weight => 1}];
};
coerce 'RiakHost' => from 'ArrayRef' => via {
my $backends = $_;
my $weight = 1 / @$backends;
[map { {node => $_, weight => $weight} } @$backends];
};
coerce 'RiakHost' => from 'HashRef' => via {
my $backends = $_;
my $total = 0;
$total += $_ for values %$backends;
[map { {node => $_, weight => $backends->{$_} / $total} }
keys %$backends];
};
has host => (
is => 'rw',
isa => 'RiakHost',
coerce => 1,
default => 'http://127.0.0.1:8098',
);
sub get_host {
my $self = shift;
my $choice;
my $rand = rand;
for (@{$self->host}) {
$choice = $_->{node};
($rand -= $_->{weight}) <= 0 and last;
}
$choice;
}
1;
|