File Coverage

lib/Schedule/Chronic/Constraint/Loadavg.pm
Criterion Covered Total %
statement 9 42 21.4
branch 0 20 0.0
condition 0 2 0.0
subroutine 3 8 37.5
pod 0 5 0.0
total 12 77 15.5


line stmt bran cond sub pod time code
1             ##
2             ## Load Average Constraint
3             ## Author: Vipul Ved Prakash .
4             ## $Id: Loadavg.pm,v 1.6 2004/08/15 21:03:35 hackworth Exp $
5             ##
6              
7             package Schedule::Chronic::Constraint::Loadavg;
8 1     1   572 use Schedule::Chronic::Base;
  1         2  
  1         28  
9 1     1   5 use Schedule::Chronic::Timer;
  1         2  
  1         33  
10 1     1   5 use base qw(Schedule::Chronic::Base);
  1         16  
  1         556  
11              
12              
13             sub new {
14            
15 0     0 0   my ($class) = @_;
16              
17 0           return bless {
18             active => 60,
19             load_avg => 0.00,
20             timer => new Schedule::Chronic::Timer ('down'),
21             }, $class;
22              
23             }
24              
25              
26             sub init {
27              
28 0     0 0   my ($self, $schedule, $task, $logger, $active, $load_avg) = @_;
29 0 0         return unless ref $self;
30            
31 0           $$self{schedule} = $schedule;
32 0           $$self{task} = $task;
33 0 0         $$self{active} = $active if $active;
34 0 0         $$self{load_avg} = $load_avg if $load_avg;
35 0           $$self{logger} = $logger;
36              
37 0           return $self;
38              
39             }
40              
41              
42             sub met {
43              
44 0     0 0   my ($self) = @_;
45              
46 0           my $load_avg = $self->state();
47              
48 0           $self->debug(" load average = $load_avg ($$self{load_avg})");
49              
50 0 0         if ($load_avg <= $$self{load_avg}) {
51              
52 0 0         $$self{timer}->set($$self{active}) unless
53             $$self{timer}->running();
54              
55 0 0         if ($$self{timer}->get() <= 0) {
56 0           return 1;
57             } else {
58 0           return 0;
59             }
60              
61             }
62              
63 0           $$self{timer}->stop();
64              
65             # Compute wait as a factor of the current load_avg and the required
66             # load_avg. The wait should be bound between 5 and 120 seconds.
67             # There ought to be a better algorithm to derive the wait... FIX.
68              
69 0 0         my $divisor = $$self{load_avg} == 0 ? 0.01 : $$self{load_avg};
70 0           my $wait = int($load_avg/$divisor);
71 0 0         $wait = 5 if $wait < 5;
72 0 0         $wait = 120 if $wait > 120;
73              
74 0           $$self{wait} = $wait;
75              
76 0           return 0;
77              
78             }
79              
80              
81             sub state {
82              
83 0     0 0   my ($self) = @_;
84 0 0         open LOADAVG, "/proc/loadavg" or die $!;
85 0           my $load_avg = ;
86 0           close LOADAVG;
87            
88 0           my @undef;
89 0           ($load_avg, @undef) = split /\s/, $load_avg;
90 0           return $load_avg;
91              
92             }
93              
94              
95             sub wait {
96              
97 0   0 0 0   return $_[0]->{wait} || 0;
98             }
99              
100              
101             1;
102