File Coverage

blib/lib/ResourcePool/LoadBalancer/LeastUsage.pm
Criterion Covered Total %
statement 30 33 90.9
branch 13 14 92.8
condition n/a
subroutine 3 3 100.0
pod 0 1 0.0
total 46 51 90.2


line stmt bran cond sub pod time code
1             #*********************************************************************
2             #*** ResourcePool::LoadBalancer::LeastUsage
3             #*** Copyright (c) 2002,2003 by Markus Winand
4             #*** $Id: LeastUsage.pm,v 1.10 2013-04-16 10:14:44 mws Exp $
5             #*********************************************************************
6              
7             package ResourcePool::LoadBalancer::LeastUsage;
8              
9 3     3   19 use vars qw($VERSION @ISA);
  3         5  
  3         264  
10 3     3   19 use ResourcePool::LoadBalancer;
  3         5  
  3         1060  
11              
12             $VERSION = "1.0107";
13             push @ISA, "ResourcePool::LoadBalancer";
14              
15             sub get_once($) {
16 62     62 0 75 my ($self) = @_;
17 62         73 my ($rec, $pool);
18 0         0 my ($least_val, $least_r_pool);
19 0         0 my $r_pool;
20 0         0 my $val;
21              
22 62         89 foreach $r_pool (@{$self->{PoolArray}}) {
  62         137  
23 113 100       437 if ($self->chk_suspend($r_pool)) {
24 3         9 next; # skip suspended
25             }
26 110 100       213 if (! defined $least_val) {
27 59         174 $least_val = $r_pool->{pool}->get_stat_used() *
28             $r_pool->{Weight};
29 59         115 $least_r_pool = $r_pool;
30             } else {
31 51         196 $val = $r_pool->{pool}->get_stat_used() *
32             $r_pool->{Weight};
33 51 100       201 if ($val < $least_val) {
    50          
34 21         27 $least_val = $val;
35 21         47 $least_r_pool = $r_pool;
36             } elsif ($val == $least_val) {
37 30 100       101 if ($r_pool->{UsageCount} <
38             $least_r_pool->{UsageCount}) {
39 9         16 $least_val = $val;
40 9         24 $least_r_pool = $r_pool;
41             }
42             }
43             }
44             }
45 62 100       152 if (defined $least_r_pool) {
46 59         163 $rec = $least_r_pool->{pool}->get();
47 59 100       110 if (! defined $rec) {
48 1         11 $self->suspend($least_r_pool);
49 1         1 undef $rec;
50 1         2 undef $r_pool;
51             } else {
52 58         106 $least_r_pool->{UsageCount} += $least_r_pool->{Weight};
53             }
54             }
55 62         543 return ($rec, $least_r_pool);
56             }
57              
58             1;