blob: 34d92737280c5ae41cc308627b3c006fd02095e6 (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
|
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;
|