stella 0.7.0.019 → 0.7.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,7 +1,7 @@
1
1
  STELLA, CHANGES
2
2
 
3
3
 
4
- #### 0.7.0 (2009-10-??) ###############################
4
+ #### 0.7.1 (2009-10-21) ###############################
5
5
 
6
6
  NOTE: Complete rewrite. Features include:
7
7
 
@@ -1,6 +1,6 @@
1
1
  = Stella - 0.7 PREVIEW
2
2
 
3
- <b>Perform load tests on your web applications with beauty and brute strength.</b>
3
+ <b>Blame Stella for breaking your web applications.</b>
4
4
 
5
5
  == Features
6
6
 
@@ -24,8 +24,8 @@ This is an early preview of Stella. The following features are still under devel
24
24
  # by running a single user functional test.
25
25
  $ stella verify -p examples/basic/plan.rb http://stellaaahhhh.com/
26
26
 
27
- # Generate requests using the same test plan.
28
- $ stella generate -p examples/basic/plan.rb http://stellaaahhhh.com/
27
+ # Generate load using the same test plan.
28
+ $ stella generate -p examples/basic/plan.rb -c 50 http://stellaaahhhh.com/
29
29
 
30
30
 
31
31
  == Test Plan Example
@@ -47,8 +47,8 @@ Test plans are defined in the Ruby programming language. This makes it possible
47
47
 
48
48
  get "/search", "Search Results" do
49
49
  wait 2..5
50
- param :what => 'Big Al'
51
- param :where => 'Toronto'
50
+ param :what => 'Sarsaparilla'
51
+ param :where => 'Lexington'
52
52
  response 200 do
53
53
  listing = doc.css('div.listing').first
54
54
  set :lid, listing['id'].match(/(\d+)/)[0]
@@ -99,7 +99,6 @@ Get it in one of the following ways:
99
99
  == Credits
100
100
 
101
101
  * Delano Mandelbaum (http://solutious.com)
102
- * Threadify (C) Ara T Howard (http://codeforpeople.com/)
103
102
 
104
103
 
105
104
  == Thanks
data/Rudyfile CHANGED
@@ -11,16 +11,19 @@ machines do
11
11
 
12
12
  env :stage do
13
13
 
14
- role :app do
14
+ role :app do
15
+ positions 2
15
16
  user :root
16
- size 'm1.small'
17
+ size 'm1.small'
17
18
  end
18
-
19
+
19
20
  role :gen do
20
- size 'm1.small'
21
- end
22
-
21
+ user :root
22
+ size 'm1.large'
23
+ ami 'ami-f0f61599'
24
+ end
23
25
  end
26
+
24
27
 
25
28
  end
26
29
 
@@ -36,6 +39,8 @@ commands do
36
39
  allow :thin
37
40
  allow :stella
38
41
  allow :rm
42
+ allow :ulimit
43
+
39
44
  allow :rackup_path do
40
45
  "/usr/lib/ruby/gems/1.8/gems/stella-#{Stella::VERSION}/support/sample_webapp/config.ru"
41
46
  end
@@ -48,7 +53,11 @@ routines do
48
53
  # rudy -r app -v start
49
54
  start do
50
55
  remote do
51
- thin :d, :l, 'thin.log', :p, 3114, :R, rackup_path, 'start'
56
+ ulimit :n, '30000'
57
+ ulimit :n
58
+ rm 'thin.log'
59
+ mkdir :p, 'stats'
60
+ thin :d, :l, 'thin.log', :p, 3114, :R, rackup_path, '--stats', './stats', '--max-conns', 8192, 'start'
52
61
  end
53
62
  end
54
63
 
@@ -61,10 +70,6 @@ routines do
61
70
  end
62
71
  end
63
72
 
64
- end
65
-
66
- role :gen do
67
-
68
73
  # rudy -v -r gen verify ip-10-251-27-245.ec2.internal:3114
69
74
  verify do
70
75
  remote do |arg|
@@ -75,13 +80,16 @@ routines do
75
80
  # rudy -v -r gen generate ip-10-251-27-245.ec2.internal:3114
76
81
  generate do
77
82
  remote do |arg|
78
- stella :v, 'generate', :c, 200, :d, '30m', "#{arg.first}"
83
+ ulimit :n, '30000'
84
+ ulimit :n
85
+ stella :v, 'generate', :c, 200, :d, '10m', :W, "#{arg.first}"
79
86
  end
80
87
  end
81
88
 
82
89
  end
83
-
84
- setup do
90
+
91
+ setup do
92
+ before :startup
85
93
  after :sysupdate, :installdeps, :install_gem
86
94
  end
87
95
 
@@ -90,7 +98,11 @@ routines do
90
98
 
91
99
  reboot do
92
100
  end
93
-
101
+
102
+ install_netperf do
103
+ #ftp://ftp.netperf.org/netperf/netperf-2.4.5.tar.bz2
104
+ end
105
+
94
106
  install_rubyforge do
95
107
  remote :root do
96
108
  gem_install 'stella', :V
@@ -127,7 +139,6 @@ routines do
127
139
 
128
140
  end
129
141
 
130
-
131
142
  installdeps do
132
143
  remote :root do
133
144
  gem_install "test-spec", "rspec", "camping", "fcgi", "memcache-client"
@@ -148,13 +159,14 @@ routines do
148
159
  end
149
160
  end
150
161
 
151
- sysupdate do
152
- remote :root do
162
+ sysupdate {
163
+ remote {
153
164
  apt_get "update"
154
165
  apt_get "install", "libxml2-dev", "libxslt-dev"
155
166
  apt_get "install", "build-essential", "git-core"
156
167
  apt_get "install", "ruby1.8-dev", "rdoc", "libzlib-ruby", "rubygems"
157
168
  apt_get "install", "libfcgi-dev", "libfcgi-ruby1.8"
169
+ apt_get "install", "joe", "siege", "httperf"
158
170
  gem_sources :a, "http://gems.github.com"
159
171
  mkdir :p, "/var/lib/gems/1.8/bin" # Doesn't get created, but causes Rubygems to fail
160
172
  gem_install "builder", "session"
@@ -162,8 +174,8 @@ routines do
162
174
  gem_install 'rubygems-update', "-v=1.3.4"
163
175
  update_rubygems
164
176
  gem_install 'hoe'
165
- end
166
- end
177
+ }
178
+ }
167
179
 
168
180
 
169
181
  end
data/bin/stella CHANGED
@@ -39,6 +39,7 @@ class Stella::CLI::Definition
39
39
  #global :A, :apikey, String, "API Key"
40
40
  #global :S, :secret, String, "Secret Key"
41
41
  global :p, :pause, Integer, "Seconds to pause before starting test"
42
+ global :E, :engine, String, "Specify a load engine (experimental)"
42
43
  global :n, :nocolor, "Disable output colors" do
43
44
  String.disable_color
44
45
  end
@@ -100,8 +101,6 @@ class Stella::CLI::Definition
100
101
  option :w, :wait, Float, "Wait time (in seconds) between client requests (ignored if testplan supplied)"
101
102
  option :p, :testplan, String, "Path to testplan"
102
103
  command :generate => Stella::CLI
103
- # command_alias :generate, :load
104
- # command_alias :generate, :stress
105
104
 
106
105
  about "Initialize Stella configuration"
107
106
  command :init do
@@ -77,7 +77,7 @@
77
77
  # Delano (@solutious.com)
78
78
  #
79
79
 
80
- desc "Business Finder Testplan"
80
+ desc "Product Finder"
81
81
 
82
82
  usecase 65, "Simple search" do
83
83
 
@@ -9,7 +9,7 @@ usecase "Exception Handling" do
9
9
 
10
10
  get "/search", "Search Results" do
11
11
  param :what => 'No Such Listing'
12
- param :where => random('Toronto', 'Montreal', 'Vancouver')
12
+ param :where => random(['Toronto', 'Montreal', 'Vancouver'])
13
13
  response 404 do
14
14
  raise NoSearchResults
15
15
  end
@@ -14,10 +14,6 @@ autoload :Gibbler, 'gibbler/aliases'
14
14
  autoload :Attic, 'attic'
15
15
 
16
16
  require 'benelux'
17
- require 'threadify'
18
- require 'tracer'
19
-
20
-
21
17
 
22
18
  module Stella
23
19
  extend self
@@ -29,7 +29,15 @@ class Stella::CLI < Drydock::Command
29
29
  [:nowait, :clients, :repetitions, :duration].each do |opt|
30
30
  opts[opt] = @option.send(opt) unless @option.send(opt).nil?
31
31
  end
32
- ret = Stella::Engine::Load.run @testplan, opts
32
+
33
+ case @global.engine
34
+ when "package"
35
+ ret = Stella::Engine::LoadPackage.run @testplan, opts
36
+ when "create"
37
+ ret = Stella::Engine::LoadCreate.run @testplan, opts
38
+ else
39
+ ret = Stella::Engine::LoadQueue.run @testplan, opts
40
+ end
33
41
  @exit_code = (ret ? 0 : 1)
34
42
  end
35
43
 
@@ -60,15 +60,19 @@ module Stella::Engine
60
60
  def update_request_error(*args) raise end
61
61
 
62
62
  end
63
-
64
- Stella::Utils.require_glob(STELLA_LIB_HOME, 'stella', 'engine', '*.rb')
65
-
66
-
63
+
64
+ autoload :Functional, 'stella/engine/functional'
65
+ autoload :Load, 'stella/engine/loadbase'
66
+ autoload :LoadPackage, 'stella/engine/load_package'
67
+ autoload :LoadCreate, 'stella/engine/load_create'
68
+ autoload :LoadQueue, 'stella/engine/load_queue'
69
+
67
70
  # These timers are interesting from a reporting perspective.
68
71
  Benelux.add_counter Stella::Client, :execute_response_handler
69
72
  Benelux.add_timer HTTPClient, :do_request
70
- Benelux.add_timer HTTPClient::Session, :create_socket
71
- Benelux.add_timer HTTPClient::Session, :create_ssl_socket
73
+ ## These are contained in connect
74
+ #Benelux.add_timer HTTPClient::Session, :create_socket
75
+ #Benelux.add_timer HTTPClient::Session, :create_ssl_socket
72
76
  Benelux.add_timer HTTPClient::Session, :connect
73
77
  Benelux.add_timer HTTPClient::Session, :query
74
78
  Benelux.add_timer HTTPClient::Session, :socket_gets_first_byte
@@ -44,7 +44,9 @@ module Stella::Engine
44
44
  end
45
45
 
46
46
  def update_receive_response(client_id, usecase, uri, req, params, counter, container)
47
- Stella.li ' %-59s %3d' % [uri, container.status]
47
+ msg = ' %-59s ' % [uri]
48
+ msg << container.status.to_s if Stella.loglev == 1
49
+ Stella.li msg
48
50
 
49
51
  Stella.li2 ' ' << container.response.request.header.send(:request_line)
50
52
 
@@ -58,6 +60,8 @@ module Stella::Engine
58
60
  Stella.li2 " %s: %s" % pair
59
61
  end
60
62
 
63
+ Stella.li2 $/, " Response-Status: %3d" % [container.status]
64
+
61
65
  Stella.li2 $/, " Response-Headers:"
62
66
  container.headers.all.each do |pair|
63
67
  Stella.li2 " %s: %s" % pair
@@ -0,0 +1,84 @@
1
+
2
+ module Stella::Engine
3
+ module LoadCreate
4
+ extend Stella::Engine::Base
5
+ extend Stella::Engine::Load
6
+ extend self
7
+
8
+
9
+ def execute_test_plan(packages, reps=1, duration=0)
10
+ time_started = Time.now
11
+
12
+ (1..reps).to_a.each { |rep|
13
+ @real_reps += 1 # Increments when duration is specified.
14
+ Stella.li3 "*** REPETITION #{@real_reps} of #{reps} ***"
15
+ packages.each { |package|
16
+ if running_threads.size <= packages.size
17
+ @threads << Thread.new do
18
+ c, uc = package.client, package.usecase
19
+ msg = "THREAD START: client %s: " % [c.digest.short]
20
+ msg << "%s:%s (rep: %d)" % [uc.desc, uc.digest.short, @real_reps]
21
+ Stella.li4 $/, "======== " << msg
22
+ # This thread will stay on this one track.
23
+ Benelux.current_track c.digest
24
+ Benelux.add_thread_tags :usecase => uc.digest_cache
25
+
26
+ Benelux.add_thread_tags :rep => @real_reps
27
+ Stella::Engine::Load.rescue(c.digest_cache) {
28
+ break if Stella.abort?
29
+ print '.' if Stella.loglev == 2
30
+ stats = c.execute uc
31
+ }
32
+ Benelux.remove_thread_tags :rep
33
+ Benelux.remove_thread_tags :usecase
34
+
35
+ end
36
+ Stella.sleep :create_thread
37
+ end
38
+
39
+ if running_threads.size > @max_clients
40
+ @max_clients = running_threads.size
41
+ end
42
+
43
+ if @mode == :rolling
44
+ tries = 0
45
+ while (reps > 1 || duration > 0) && running_threads.size >= packages.size
46
+ Stella.sleep :check_threads
47
+ msg = "#{running_threads.size} (max: #{@max_clients})"
48
+ Stella.li3 "*** RUNNING THREADS: #{msg} ***"
49
+ (tries += 1)
50
+ end
51
+ end
52
+ }
53
+
54
+ if @mode != :rolling && running_threads.size > 0
55
+ args = [running_threads.size, @max_clients]
56
+ Stella.li3 "*** WAITING FOR %d THREADS TO FINISH (max: %d) ***" % args
57
+ @threads.each { |t| t.join } # wait
58
+ end
59
+
60
+ # If a duration was given, we make sure
61
+ # to run for only that amount of time.
62
+ # TODO: do not redo if
63
+ # time_elapsed + usecase.mean > duration
64
+ if duration > 0
65
+ time_elapsed = (Time.now - time_started).to_i
66
+ msg = "#{time_elapsed} of #{duration} (threads: %d)" % running_threads.size
67
+ Stella.li3 "*** TIME ELAPSED: #{msg} ***"
68
+ redo if time_elapsed <= duration
69
+ break if time_elapsed >= duration
70
+ end
71
+
72
+ }
73
+
74
+ if @mode == :rolling && running_threads.size > 0
75
+ Stella.li3 "*** WAITING FOR THREADS TO FINISH ***"
76
+ @threads.each { |t| t.join } # wait
77
+ end
78
+ Stella.li2 $/, $/
79
+ end
80
+
81
+ Benelux.add_timer Stella::Engine::LoadCreate, :execute_test_plan
82
+
83
+ end
84
+ end
@@ -0,0 +1,39 @@
1
+
2
+ module Stella::Engine
3
+ module LoadPackage
4
+ extend Stella::Engine::Base
5
+ extend Stella::Engine::Load
6
+ extend self
7
+
8
+
9
+ def execute_test_plan(packages, reps=1,duration=0)
10
+ require 'threadify'
11
+
12
+ Thread.ify packages, :threads => packages.size do |package|
13
+ Thread.current[:real_reps] = 0
14
+ # This thread will stay on this one track.
15
+ Benelux.current_track package.client.gibbler
16
+ Benelux.add_thread_tags :usecase => package.usecase.digest_cache
17
+ (1..reps).to_a.each do |rep|
18
+ Thread.current[:real_reps] += 1
19
+ Benelux.add_thread_tags :rep => rep
20
+ Stella::Engine::Load.rescue(package.client.digest_cache) {
21
+ break if Stella.abort?
22
+ print '.' if Stella.loglev == 2
23
+ stats = package.client.execute package.usecase
24
+ }
25
+ Benelux.remove_thread_tags :rep
26
+ Stella.sleep :check_threads
27
+ end
28
+
29
+ Benelux.remove_thread_tags :usecase
30
+
31
+ end
32
+
33
+ Stella.li2 $/, $/
34
+ end
35
+
36
+ Benelux.add_timer Stella::Engine::LoadPackage, :execute_test_plan
37
+
38
+ end
39
+ end
@@ -0,0 +1,85 @@
1
+
2
+ module Stella::Engine
3
+ module LoadQueue
4
+ extend Stella::Engine::Base
5
+ extend Stella::Engine::Load
6
+ extend self
7
+
8
+ def execute_test_plan(packages, reps=1,duration=0)
9
+ time_started = Time.now
10
+
11
+ pqueue = Queue.new
12
+ packages.each { |p| pqueue << p }
13
+
14
+ @real_reps += 1 # Increments when duration is specified.
15
+ @threads = []
16
+ packages.size.times {
17
+ @max_clients += 1
18
+ @threads << Thread.new do
19
+ package = pqueue.pop
20
+ Thread.current[:real_reps] = 0
21
+ Thread.current[:real_uctime] = Benelux::Stats::Calculator.new
22
+ c, uc = package.client, package.usecase
23
+ Stella.li4 $/, "======== THREAD %s: START" % [c.digest.short]
24
+
25
+ # This thread will stay on this one track.
26
+ Benelux.current_track c.digest
27
+ Benelux.add_thread_tags :usecase => uc.digest_cache
28
+
29
+ Thread.current[:real_uctime].first_tick
30
+ prev_ptime ||= Time.now
31
+ reps.times { |rep|
32
+ break if Stella.abort?
33
+ Thread.current[:real_reps] += 1
34
+ args = [c.digest.short, uc.desc, uc.digest.short, Thread.current[:real_reps]]
35
+ Stella.li4 $/, "======== THREAD %s: %s:%s (rep: %d)" % args
36
+
37
+ Benelux.add_thread_tags :rep => rep
38
+ #Stella.li [package.client.gibbler.shorter, package.usecase.gibbler.shorter, rep].inspect
39
+ Stella::Engine::Load.rescue(c.digest_cache) {
40
+ break if Stella.abort?
41
+ print '.' if Stella.loglev == 2
42
+ stats = c.execute uc
43
+ }
44
+ Benelux.remove_thread_tags :rep
45
+
46
+ Thread.current[:real_uctime].tick
47
+ time_elapsed = (Time.now - time_started).to_i
48
+
49
+ if Stella.loglev >= 2 &&
50
+ Thread.current == @threads.first &&
51
+ (Time.now - prev_ptime).to_i >= 5
52
+ prev_ptime, ruct = Time.now, Thread.current[:real_uctime]
53
+ args = [time_elapsed.to_i, ruct.n, ruct.mean, ruct.sd]
54
+ Stella.li2 $/, "REAL UC TIME: %ds (reps: %d): %.4fs %.4f(SD)" % args
55
+ Stella.lflush
56
+ end
57
+
58
+ # If a duration was given, we make sure
59
+ # to run for only that amount of time.
60
+ if duration > 0
61
+ break if (time_elapsed+Thread.current[:real_uctime].mean) >= duration
62
+ redo if (time_elapsed+Thread.current[:real_uctime].mean) <= duration
63
+ end
64
+ }
65
+
66
+ Benelux.remove_thread_tags :usecase
67
+
68
+ pqueue << package # return the package to the queue
69
+ end
70
+ }
71
+
72
+ repscalc = Benelux::Stats::Calculator.new
73
+ @threads.each { |t| t.join } # wait
74
+ @threads.each { |t| repscalc.sample(t[:real_reps]) }
75
+ @real_reps = repscalc.mean.to_i
76
+
77
+ #Stella.li "*** REPETITION #{@real_reps} of #{reps} ***"
78
+
79
+ Stella.li2 $/, $/
80
+ end
81
+
82
+ Benelux.add_timer Stella::Engine::LoadQueue, :execute_test_plan
83
+
84
+ end
85
+ end
@@ -13,9 +13,10 @@ module Stella::Engine
13
13
 
14
14
  def run(plan, opts={})
15
15
  opts = process_options! plan, opts
16
+ @threads, @max_clients, @real_reps = [], 0, 0
16
17
 
17
18
  if Stella.loglev > 1
18
- Load.timers += [:connect, :create_socket, :query, :socket_gets_first_byte, :get_body]
19
+ Load.timers += [:query, :connect, :socket_gets_first_byte, :get_body]
19
20
  Load.counts = [:request_header_size, :request_content_size]
20
21
  Load.counts += [:response_headers_size, :response_content_size]
21
22
  end
@@ -42,35 +43,37 @@ module Stella::Engine
42
43
  rescue Interrupt
43
44
  Stella.li "Stopping test...", $/
44
45
  Stella.abort!
46
+ @threads.each { |t| t.join } unless @threads.nil? || @threads.empty? # wait
45
47
  ensure
46
48
  Stella.li "Processing statistics...", $/
47
49
  Stella.lflush
48
50
 
49
- wait_for_reporter
50
-
51
+ Benelux.update_global_timeline
52
+
53
+ bt = Benelux.timeline
51
54
  tt = Benelux.thread_timeline
52
- test_time = tt.stats.group(:execute_test_plan).mean
53
55
 
56
+ test_time = tt.stats.group(:execute_test_plan).mean
54
57
  generate_report plan, test_time
58
+ report_time = tt.stats.group(:generate_report).mean
55
59
 
56
- #p Benelux.timeline
60
+ # Here is the calcualtion for the number of
61
+ # Benelux assets created for each request:
62
+ #
63
+ # [5*2*REQ+6, 5*1*REQ+3, 13*REQ]
64
+ #
57
65
 
58
66
  Stella.li "Summary: "
59
67
  Stella.li " max clients: %d" % @max_clients
60
68
  Stella.li " repetitions: %d" % @real_reps
61
69
  Stella.li " test time: %10.2fs" % test_time
62
- Stella.li " wait time: %10.2fs" % tt.stats.group(:wait_for_reporter).mean
63
- Stella.li " post time: %10.2fs" % tt.stats.group(:generate_report).mean
70
+ Stella.li " post time: %10.2fs" % report_time
64
71
  Stella.li $/
65
72
  end
66
73
 
67
74
  # errors?
68
75
  end
69
76
 
70
- def wait_for_reporter
71
- Benelux.reporter.force_update
72
- end
73
-
74
77
  protected
75
78
  class ThreadPackage
76
79
  attr_accessor :index
@@ -119,78 +122,10 @@ module Stella::Engine
119
122
  packages.compact # TODO: Why one nil element sometimes?
120
123
  end
121
124
 
122
- def execute_test_plan(packages, reps=1, duration=0)
123
- time_started = Time.now
124
-
125
- @threads, @max_clients, @real_reps = [], 0, 0
126
- (1..reps).to_a.each { |rep|
127
- @real_reps += 1 # Increments when duration is specified.
128
- Stella.li3 "*** REPETITION #{@real_reps} of #{reps} ***"
129
- packages.each { |package|
130
- if running_threads.size <= packages.size
131
- @threads << Thread.new do
132
- c, uc = package.client, package.usecase
133
- msg = "THREAD START: client %s: " % [c.digest.short]
134
- msg << "%s:%s (rep: %d)" % [uc.desc, uc.digest.short, @real_reps]
135
- Stella.li4 $/, "======== " << msg
136
- # This thread will stay on this one track.
137
- Benelux.current_track c.digest
138
- Benelux.add_thread_tags :usecase => uc.digest_cache
139
-
140
- Benelux.add_thread_tags :rep => @real_reps
141
- Stella::Engine::Load.rescue(c.digest_cache) {
142
- break if Stella.abort?
143
- print '.' if Stella.loglev == 2
144
- stats = c.execute uc
145
- }
146
- Benelux.remove_thread_tags :rep
147
- Benelux.remove_thread_tags :usecase
148
-
149
- end
150
- Stella.sleep :create_thread
151
- end
152
-
153
- if running_threads.size > @max_clients
154
- @max_clients = running_threads.size
155
- end
156
-
157
- if @mode == :rolling
158
- tries = 0
159
- while (reps > 1 || duration > 0) && running_threads.size >= packages.size
160
- Stella.sleep :check_threads
161
- msg = "#{running_threads.size} (max: #{@max_clients})"
162
- Stella.li3 "*** RUNNING THREADS: #{msg} ***"
163
- (tries += 1)
164
- end
165
- end
166
- }
167
-
168
- if @mode != :rolling && running_threads.size > 0
169
- args = [running_threads.size, @max_clients]
170
- Stella.li3 "*** WAITING FOR %d THREADS TO FINISH (max: %d) ***" % args
171
- @threads.each { |t| t.join } # wait
172
- end
173
-
174
- # If a duration was given, we make sure
175
- # to run for only that amount of time.
176
- # TODO: do not redo if
177
- # time_elapsed + usecase.mean > duration
178
- if duration > 0
179
- time_elapsed = (Time.now - time_started).to_i
180
- msg = "#{time_elapsed} of #{duration} (threads: %d)" % running_threads.size
181
- Stella.li3 "*** TIME ELAPSED: #{msg} ***"
182
- redo if time_elapsed <= duration
183
- break if time_elapsed >= duration
184
- end
185
-
186
- }
187
-
188
- if @mode == :rolling && running_threads.size > 0
189
- Stella.li3 "*** WAITING FOR THREADS TO FINISH ***"
190
- @threads.each { |t| t.join } # wait
191
- end
192
- Stella.li2 $/, $/
125
+ def execute_test_plan(*args)
126
+ raise "Override execute_test_plan method in #{self}"
193
127
  end
128
+
194
129
  def running_threads
195
130
  @threads.select { |t| t.status } # non-false status are still running
196
131
  end
@@ -330,12 +265,9 @@ module Stella::Engine
330
265
  Stella.li3 ex.backtrace
331
266
  end
332
267
 
333
-
334
268
  Benelux.add_timer Stella::Engine::Load, :build_thread_package
335
- Benelux.add_timer Stella::Engine::Load, :execute_test_plan
336
269
  Benelux.add_timer Stella::Engine::Load, :generate_report
337
- Benelux.add_timer Stella::Engine::Load, :wait_for_reporter
338
-
270
+
339
271
  end
340
272
  end
341
273
 
@@ -4,9 +4,11 @@ require 'stella/testplan/stats'
4
4
  module Stella
5
5
  class Testplan
6
6
  include Gibbler::Complex
7
+ extend Attic
8
+
9
+ attic :base_path
7
10
 
8
11
  attr_accessor :usecases
9
- attr_accessor :base_path
10
12
  attr_accessor :desc
11
13
  attr_reader :stats
12
14
 
@@ -67,7 +69,7 @@ class Testplan
67
69
  ratio, name = args[0], args[1] if args[0].is_a?(Numeric)
68
70
  ratio, name = args[1], args[0] if args[0].is_a?(String)
69
71
  uc = Stella::Testplan::Usecase.new
70
- uc.base_path = @base_path
72
+ uc.base_path = self.base_path
71
73
  uc.instance_eval &blk
72
74
  uc.ratio, uc.desc = (ratio || -1).to_f, name
73
75
  @testplan_current_ratio += uc.ratio if uc.ratio > 0
@@ -5,8 +5,8 @@ module Stella
5
5
  unless defined?(MAJOR)
6
6
  MAJOR = 0.freeze
7
7
  MINOR = 7.freeze
8
- TINY = 0.freeze
9
- PATCH = '019'.freeze
8
+ TINY = 1.freeze
9
+ PATCH = '001'.freeze
10
10
  end
11
11
  def self.to_s; [MAJOR, MINOR, TINY, PATCH].join('.'); end
12
12
  def self.to_f; self.to_s.to_f; end
@@ -1,8 +1,8 @@
1
1
  @spec = Gem::Specification.new do |s|
2
2
  s.name = "stella"
3
3
  s.rubyforge_project = 'stella'
4
- s.version = "0.7.0.019"
5
- s.summary = "Stella: Perform load tests on your web applications with beauty and brute strength."
4
+ s.version = "0.7.1"
5
+ s.summary = "Blame Stella for breaking your web applications."
6
6
  s.description = s.summary
7
7
  s.author = "Delano Mandelbaum"
8
8
  s.email = "delano@solutious.com"
@@ -15,9 +15,9 @@
15
15
 
16
16
  s.executables = %w[stella]
17
17
 
18
- s.add_dependency 'benelux', '>= 0.4.3'
18
+ s.add_dependency 'benelux', '>= 0.5.0'
19
19
  s.add_dependency 'drydock', '>= 0.6.8'
20
- s.add_dependency 'gibbler', '>= 0.7.0'
20
+ s.add_dependency 'gibbler', '>= 0.7.1'
21
21
  s.add_dependency 'sysinfo', '>= 0.7.0'
22
22
  s.add_dependency 'storable', '>= 0.5.8'
23
23
  s.add_dependency 'nokogiri'
@@ -51,7 +51,10 @@
51
51
  lib/stella/data/http/response.rb
52
52
  lib/stella/engine.rb
53
53
  lib/stella/engine/functional.rb
54
- lib/stella/engine/load.rb
54
+ lib/stella/engine/load_create.rb
55
+ lib/stella/engine/load_package.rb
56
+ lib/stella/engine/load_queue.rb
57
+ lib/stella/engine/loadbase.rb
55
58
  lib/stella/exceptions.rb
56
59
  lib/stella/guidelines.rb
57
60
  lib/stella/mixins.rb
@@ -73,6 +76,7 @@
73
76
  support/useragents.txt
74
77
  tryouts/01_numeric_mixins_tryouts.rb
75
78
  tryouts/12_digest_tryouts.rb
79
+ tryouts/proofs/thread_queue.rb
76
80
  vendor/httpclient-2.1.5.2/httpclient.rb
77
81
  vendor/httpclient-2.1.5.2/httpclient/auth.rb
78
82
  vendor/httpclient-2.1.5.2/httpclient/cacert.p7s
@@ -24,14 +24,15 @@ set :reload => true
24
24
  set :max_listings => 1000
25
25
 
26
26
  LISTINGS = [
27
- { :id => 1000, :name => 'John West Smoked Oysters', :city => 'Toronto' },
28
- { :id => 1001, :name => 'Fire Town Lightning Rods', :city => 'Toronto' },
29
- { :id => 1002, :name => 'Oversized Pen and Ink Co', :city => 'Toronto' },
30
- { :id => 1003, :name => 'The Rathzenburg Brothers', :city => 'Toronto' },
31
- { :id => 1004, :name => 'Forever and Always Beads', :city => 'Montreal' },
32
- { :id => 1005, :name => "Big Al's Flavour Country", :city => 'Montreal' },
33
- { :id => 1006, :name => 'Big Time Furniture World', :city => 'Montreal' },
34
- { :id => 1007, :name => 'High-End Keyboard Makers', :city => 'Montreal' }
27
+ { :id => 1000, :name => 'John West Smoked Oysters', :city => 'Toronto' },
28
+ { :id => 1001, :name => 'Fire Town Lightning Rods', :city => 'Toronto' },
29
+ { :id => 1002, :name => 'Oversized Pen and Ink Co', :city => 'Toronto' },
30
+ { :id => 1003, :name => 'The Rathzenburg Brothers', :city => 'Toronto' },
31
+ { :id => 1004, :name => 'Forever and Always Beads', :city => 'Montreal' },
32
+ { :id => 1005, :name => "Big Al's Flavour Country", :city => 'Montreal' },
33
+ { :id => 1006, :name => 'Big Time Furniture World', :city => 'Montreal' },
34
+ { :id => 1007, :name => 'High-End Keyboard Makers', :city => 'Montreal' },
35
+ { :id => 1009, :name => 'Sarsaparilla Making Bros', :city => 'Lexington' }
35
36
  ]
36
37
 
37
38
  set :listings => LISTINGS.clone
@@ -50,6 +51,7 @@ end
50
51
 
51
52
  get '/' do
52
53
  @title << " - Search"
54
+ #sleep 0.05
53
55
  erb :search_form
54
56
  end
55
57
 
@@ -141,6 +143,7 @@ before do
141
143
  @cookie[:location] = ''
142
144
  set :listings => LISTINGS.clone
143
145
  end
146
+ sleep 0.05 if params[:enablesleep]
144
147
  @cookie[:history].delete params[:what]
145
148
  @cookie[:history].unshift params[:what] unless blank?(params[:what])
146
149
  @cookie[:history].pop if @cookie[:history].size > 5
@@ -0,0 +1,21 @@
1
+ require 'thread'
2
+
3
+ queue = Queue.new
4
+
5
+ producer = Thread.new do
6
+ 5.times do |i|
7
+ sleep rand(i) # simulate expense
8
+ queue << i
9
+ puts "#{i} produced"
10
+ end
11
+ end
12
+
13
+ consumer = Thread.new do
14
+ 5.times do |i|
15
+ value = queue.pop
16
+ sleep rand(i/2) # simulate expense
17
+ puts "consumed #{value}"
18
+ end
19
+ end
20
+
21
+ consumer.join
@@ -1005,6 +1005,8 @@ private
1005
1005
 
1006
1006
  def do_get_header(req, res, sess)
1007
1007
  res.version, res.status, res.reason, headers = sess.get_header
1008
+ ## NOTE: If you re-enable, investigate whether it
1009
+ ## should call Benelux.timeline.add_count instead
1008
1010
  #Benelux.thread_timeline.add_count :response_header_size, res.header
1009
1011
  headers.each do |key, value|
1010
1012
  res.header.add(key, value)
@@ -456,8 +456,10 @@ module HTTP
456
456
  dev << header
457
457
  end
458
458
 
459
- #Benelux.thread_timeline.add_count :data_sent, header_size, :type => :header
460
- #Benelux.thread_timeline.add_count :data_sent, body_size, :type => :body
459
+ ## NOTE: If you re-enable, investigate whether it
460
+ ## should call Benelux.timeline.add_count instead
461
+ ##Benelux.thread_timeline.add_count :data_sent, header_size, :type => :header
462
+ ##Benelux.thread_timeline.add_count :data_sent, body_size, :type => :body
461
463
 
462
464
  dev
463
465
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: stella
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.7.0.019
4
+ version: 0.7.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Delano Mandelbaum
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2009-10-13 00:00:00 -04:00
12
+ date: 2009-10-21 00:00:00 -04:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
@@ -20,7 +20,7 @@ dependencies:
20
20
  requirements:
21
21
  - - ">="
22
22
  - !ruby/object:Gem::Version
23
- version: 0.4.3
23
+ version: 0.5.0
24
24
  version:
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: drydock
@@ -40,7 +40,7 @@ dependencies:
40
40
  requirements:
41
41
  - - ">="
42
42
  - !ruby/object:Gem::Version
43
- version: 0.7.0
43
+ version: 0.7.1
44
44
  version:
45
45
  - !ruby/object:Gem::Dependency
46
46
  name: sysinfo
@@ -72,7 +72,7 @@ dependencies:
72
72
  - !ruby/object:Gem::Version
73
73
  version: "0"
74
74
  version:
75
- description: "Stella: Perform load tests on your web applications with beauty and brute strength."
75
+ description: Blame Stella for breaking your web applications.
76
76
  email: delano@solutious.com
77
77
  executables:
78
78
  - stella
@@ -109,7 +109,10 @@ files:
109
109
  - lib/stella/data/http/response.rb
110
110
  - lib/stella/engine.rb
111
111
  - lib/stella/engine/functional.rb
112
- - lib/stella/engine/load.rb
112
+ - lib/stella/engine/load_create.rb
113
+ - lib/stella/engine/load_package.rb
114
+ - lib/stella/engine/load_queue.rb
115
+ - lib/stella/engine/loadbase.rb
113
116
  - lib/stella/exceptions.rb
114
117
  - lib/stella/guidelines.rb
115
118
  - lib/stella/mixins.rb
@@ -131,6 +134,7 @@ files:
131
134
  - support/useragents.txt
132
135
  - tryouts/01_numeric_mixins_tryouts.rb
133
136
  - tryouts/12_digest_tryouts.rb
137
+ - tryouts/proofs/thread_queue.rb
134
138
  - vendor/httpclient-2.1.5.2/httpclient.rb
135
139
  - vendor/httpclient-2.1.5.2/httpclient/auth.rb
136
140
  - vendor/httpclient-2.1.5.2/httpclient/cacert.p7s
@@ -150,7 +154,7 @@ post_install_message:
150
154
  rdoc_options:
151
155
  - --line-numbers
152
156
  - --title
153
- - "Stella: Perform load tests on your web applications with beauty and brute strength."
157
+ - Blame Stella for breaking your web applications.
154
158
  - --main
155
159
  - README.rdoc
156
160
  require_paths:
@@ -173,6 +177,6 @@ rubyforge_project: stella
173
177
  rubygems_version: 1.3.2
174
178
  signing_key:
175
179
  specification_version: 3
176
- summary: "Stella: Perform load tests on your web applications with beauty and brute strength."
180
+ summary: Blame Stella for breaking your web applications.
177
181
  test_files: []
178
182