Merge branch 'master' of ssh://erxz.com/~/git_repo/stem
[urisagit/Stem.git] / lib / Stem / Load / Driver.pm
1
2 package Stem::Load::Driver ;
3
4 use strict ;
5
6 use Time::HiRes qw( gettimeofday tv_interval ) ;
7
8 my $attr_spec = [
9
10
11         {
12                 'name'          => 'reg_name',
13                 'help'          => <<HELP,
14 Name this Cell was registered with.
15 HELP
16         },
17         {
18                 'name'          => 'load_addr',
19                 'help'          => <<HELP,
20 Address to send the load messages
21 HELP
22         },
23         {
24                 'name'          => 'load_data',
25                 'help'          => <<HELP,
26 Data string to send.
27 HELP
28         },
29         {
30                 'name'          => 'data_sizes',
31                 'help'          => <<HELP,
32 Range of data sizes to select from randomly
33 HELP
34         },
35         {
36                 'name'          => 'max_msg_cnt',
37                 'default'       => 1000,
38                 'help'          => <<HELP,
39 Maximum number of messages to send
40 HELP
41         },
42         {
43                 'name'          => 'max_duration',
44                 'default'       => 10,
45                 'help'          => <<HELP,
46 Maximum number of seconds to run
47 HELP
48         },
49 ] ;
50
51 sub new {
52
53         my( $class ) = shift ;
54
55         my $self = Stem::Class::parse_args( $attr_spec, @_ ) ;
56         return $self unless ref $self ;
57
58         return $self ;
59 }
60
61 sub go_cmd {
62
63         my( $self, $msg ) = @_ ;
64
65         $self->{'echo_cnt'} = 0 ;
66
67         $self->{'start_time'} = gettimeofday() ;
68
69         $self->{'go_from_addr'} = $msg->from() ;
70
71         $self->send_load_msg() ;
72
73         return "Load Started\n" ;
74 }
75
76 sub response_in {
77
78         my( $self, $msg ) = @_ ;
79
80         my $time_delta = gettimeofday() - $self->{'start_time'} ;
81
82         if ( ++$self->{'echo_cnt'} >= $self->{'max_msg_cnt'} ||
83              $time_delta > $self->{'max_duration'} ) {
84
85                 my $msgs_per_second = $self->{'echo_cnt'} / $time_delta ;
86
87                 my $done_msg = Stem::Msg->new(
88                         'to'    => $self->{'go_from_addr'},
89                         'from'  => $self->{'reg_name'},
90                         'type'  => 'response',
91                         'data'  => <<DATA,
92 sent $self->{'echo_cnt'} messages in $time_delta seconds
93 $msgs_per_second messages per second
94 DATA
95                 ) ;
96
97                 $done_msg->dispatch() ;
98
99                 return ;
100         }
101
102         $self->send_load_msg() ;
103
104         return ;
105 }
106
107
108 sub send_load_msg {
109
110         my( $self ) = @_ ;
111
112         $self->{'echo_msg'} ||= Stem::Msg->new(
113                         'to'    => $self->{'load_addr'},
114                         'from'  => $self->{'reg_name'},
115                         'type'  => 'echo',
116                         'data'  => \'echo me',
117         ) ;
118
119         $self->{'echo_msg'}->dispatch() ;
120
121         return ;
122 }
123
124 1 ;