fixed perl event loop
[urisagit/Stem.git] / lib / Stem / Load / Driver.pm
CommitLineData
4536f655 1
2package Stem::Load::Driver ;
3
4use strict ;
5
6use Time::HiRes qw( gettimeofday tv_interval ) ;
7
8my $attr_spec = [
9
10
11 {
12 'name' => 'reg_name',
13 'help' => <<HELP,
14Name this Cell was registered with.
15HELP
16 },
17 {
18 'name' => 'load_addr',
19 'help' => <<HELP,
20Address to send the load messages
21HELP
22 },
23 {
24 'name' => 'load_data',
25 'help' => <<HELP,
26Data string to send.
27HELP
28 },
29 {
30 'name' => 'data_sizes',
31 'help' => <<HELP,
32Range of data sizes to select from randomly
33HELP
34 },
35 {
36 'name' => 'max_msg_cnt',
37 'default' => 1000,
38 'help' => <<HELP,
39Maximum number of messages to send
40HELP
41 },
42 {
43 'name' => 'max_duration',
44 'default' => 10,
45 'help' => <<HELP,
46Maximum number of seconds to run
47HELP
48 },
49] ;
50
51sub 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
61sub 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
76sub 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,
92sent $self->{'echo_cnt'} messages in $time_delta seconds
93$msgs_per_second messages per second
94DATA
95 ) ;
96
97 $done_msg->dispatch() ;
98
99 return ;
100 }
101
102 $self->send_load_msg() ;
103
104 return ;
105}
106
107
108sub 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
1241 ;