From e1d423ab4d835b8eea4e42444cc189bcdf79ec95 Mon Sep 17 00:00:00 2001 From: zedshaw Date: Fri, 22 Sep 2006 08:16:54 +0000 Subject: Mongrel 0.3.13.5 version bump. Final commit of changes from 0.3.13.4. I've been ultra bad about commits. git-svn-id: svn+ssh://rubyforge.org/var/svn/mongrel/trunk@349 19e92222-5c0b-0410-8929-a290d50e31e9 --- Rakefile | 2 +- bin/mongrel_rails | 335 ++++++++++++++++++++++---------------------- ext/http11/http11.c | 2 +- lib/mongrel.rb | 4 +- lib/mongrel/command.rb | 10 +- lib/mongrel/configurator.rb | 10 +- lib/mongrel/debug.rb | 2 +- lib/mongrel/handlers.rb | 10 +- lib/mongrel/rails.rb | 4 +- lib/mongrel/stats.rb | 118 ++++++++-------- test/test_stats.rb | 4 +- 11 files changed, 255 insertions(+), 246 deletions(-) diff --git a/Rakefile b/Rakefile index c89bb78..5e92988 100644 --- a/Rakefile +++ b/Rakefile @@ -53,7 +53,7 @@ task :site => [:site_webgen, :site_rdoc, :site_coverage, :site_projects_rdoc] setup_extension("http11", "http11") name="mongrel" -version="0.3.13.4" +version="0.3.13.5" setup_gem(name, version) do |spec| spec.summary = "A small fast HTTP library and server that runs Rails, Camping, and Nitro apps." diff --git a/bin/mongrel_rails b/bin/mongrel_rails index 9220000..e5b5248 100644 --- a/bin/mongrel_rails +++ b/bin/mongrel_rails @@ -10,216 +10,217 @@ require 'mongrel' require 'mongrel/rails' require 'etc' +module Mongrel + class Start < GemPlugin::Plugin "/commands" + include Mongrel::Command::Base + + def configure + options [ + ["-e", "--environment ENV", "Rails environment to run as", :@environment, ENV['RAILS_ENV'] || "development"], + ["-d", "--daemonize", "Whether to run in the background or not", :@daemon, false], + ['-p', '--port PORT', "Which port to bind to", :@port, 3000], + ['-a', '--address ADDR', "Address to bind to", :@address, "0.0.0.0"], + ['-l', '--log FILE', "Where to write log messages", :@log_file, "log/mongrel.log"], + ['-P', '--pid FILE', "Where to write the PID", :@pid_file, "log/mongrel.pid"], + ['-n', '--num-procs INT', "Number of processors active before clients denied", :@num_procs, 1024], + ['-t', '--timeout TIME', "Timeout all requests after 100th seconds time", :@timeout, 0], + ['-m', '--mime PATH', "A YAML file that lists additional MIME types", :@mime_map, nil], + ['-c', '--chdir PATH', "Change to dir before starting (will be expanded)", :@cwd, Dir.pwd], + ['-r', '--root PATH', "Set the document root (default 'public')", :@docroot, "public"], + ['-B', '--debug', "Enable debugging mode", :@debug, false], + ['-C', '--config PATH', "Use a config file", :@config_file, nil], + ['-S', '--script PATH', "Load the given file as an extra config script.", :@config_script, nil], + ['-G', '--generate CONFIG', "Generate a config file for -C", :@generate, nil], + ['', '--user USER', "User to run as", :@user, nil], + ['', '--group GROUP', "Group to run as", :@group, nil], + ['', '--prefix PATH', "URL prefix for Rails app", :@prefix, nil] + ] + end -class Start < GemPlugin::Plugin "/commands" - include Mongrel::Command::Base - - def configure - options [ - ["-e", "--environment ENV", "Rails environment to run as", :@environment, ENV['RAILS_ENV'] || "development"], - ["-d", "--daemonize", "Whether to run in the background or not", :@daemon, false], - ['-p', '--port PORT', "Which port to bind to", :@port, 3000], - ['-a', '--address ADDR', "Address to bind to", :@address, "0.0.0.0"], - ['-l', '--log FILE', "Where to write log messages", :@log_file, "log/mongrel.log"], - ['-P', '--pid FILE', "Where to write the PID", :@pid_file, "log/mongrel.pid"], - ['-n', '--num-procs INT', "Number of processors active before clients denied", :@num_procs, 1024], - ['-t', '--timeout TIME', "Timeout all requests after 100th seconds time", :@timeout, 0], - ['-m', '--mime PATH', "A YAML file that lists additional MIME types", :@mime_map, nil], - ['-c', '--chdir PATH', "Change to dir before starting (will be expanded)", :@cwd, Dir.pwd], - ['-r', '--root PATH', "Set the document root (default 'public')", :@docroot, "public"], - ['-B', '--debug', "Enable debugging mode", :@debug, false], - ['-C', '--config PATH', "Use a config file", :@config_file, nil], - ['-S', '--script PATH', "Load the given file as an extra config script.", :@config_script, nil], - ['-G', '--generate CONFIG', "Generate a config file for -C", :@generate, nil], - ['', '--user USER', "User to run as", :@user, nil], - ['', '--group GROUP', "Group to run as", :@group, nil], - ['', '--prefix PATH', "URL prefix for Rails app", :@prefix, nil] - ] - end - - def validate - @cwd = File.expand_path(@cwd) - valid_dir? @cwd, "Invalid path to change to during daemon mode: #@cwd" + def validate + @cwd = File.expand_path(@cwd) + valid_dir? @cwd, "Invalid path to change to during daemon mode: #@cwd" - # change there to start, then we'll have to come back after daemonize - Dir.chdir(@cwd) + # change there to start, then we'll have to come back after daemonize + Dir.chdir(@cwd) - valid?(@prefix[0].chr == "/" && @prefix[-1].chr != "/", "Prefix must begin with / and not end in /") if @prefix - valid_dir? File.dirname(@log_file), "Path to log file not valid: #@log_file" - valid_dir? File.dirname(@pid_file), "Path to pid file not valid: #@pid_file" - valid_dir? @docroot, "Path to docroot not valid: #@docroot" - valid_exists? @mime_map, "MIME mapping file does not exist: #@mime_map" if @mime_map - valid_exists? @config_file, "Config file not there: #@config_file" if @config_file - valid_dir? File.dirname(@generate), "Problem accessing directory to #@generate" if @generate - valid_user? @user if @user - valid_group? @group if @group + valid?(@prefix[0].chr == "/" && @prefix[-1].chr != "/", "Prefix must begin with / and not end in /") if @prefix + valid_dir? File.dirname(@log_file), "Path to log file not valid: #@log_file" + valid_dir? File.dirname(@pid_file), "Path to pid file not valid: #@pid_file" + valid_dir? @docroot, "Path to docroot not valid: #@docroot" + valid_exists? @mime_map, "MIME mapping file does not exist: #@mime_map" if @mime_map + valid_exists? @config_file, "Config file not there: #@config_file" if @config_file + valid_dir? File.dirname(@generate), "Problem accessing directory to #@generate" if @generate + valid_user? @user if @user + valid_group? @group if @group - return @valid - end - - - def run - - # command line setting override config file settings - settings = { :host => @address, :port => @port, :cwd => @cwd, - :log_file => @log_file, :pid_file => @pid_file, :environment => @environment, - :docroot => @docroot, :mime_map => @mime_map, :daemon => @daemon, - :debug => @debug, :includes => ["mongrel"], :config_script => @config_script, - :num_processors => @num_procs, :timeout => @timeout, - :user => @user, :group => @group, :prefix => @prefix, :config_file => @config_file - } - - if @generate - STDERR.puts "** Writing config to #@generate" - open(@generate, "w") {|f| f.write(settings.to_yaml) } - STDERR.puts "## Exiting. Re-run without -G and WITH -C using your new config file." - exit 0 + return @valid end - if @config_file - conf = YAML.load_file(@config_file) - settings = settings.merge! conf - STDERR.puts "** Loading settings from #{@config_file} (they override command line)." unless settings[:daemon] - end - config = Mongrel::Rails::RailsConfigurator.new(settings) do - if defaults[:daemon] - if File.exist? defaults[:pid_file] - log "!!! PID file #{defaults[:pid_file]} already exists. Mongrel could be running already. Check your #{defaults[:log_file]} for errors." - end + def run - daemonize - log "Daemonized, any open files are closed. Look at #{defaults[:pid_file]} and #{defaults[:log_file]} for info." - log "Settings loaded from #{@config_file} (they override command line)." if @config_file + # command line setting override config file settings + settings = { :host => @address, :port => @port, :cwd => @cwd, + :log_file => @log_file, :pid_file => @pid_file, :environment => @environment, + :docroot => @docroot, :mime_map => @mime_map, :daemon => @daemon, + :debug => @debug, :includes => ["mongrel"], :config_script => @config_script, + :num_processors => @num_procs, :timeout => @timeout, + :user => @user, :group => @group, :prefix => @prefix, :config_file => @config_file + } + + if @generate + STDERR.puts "** Writing config to #@generate" + open(@generate, "w") {|f| f.write(settings.to_yaml) } + STDERR.puts "## Exiting. Re-run without -G and WITH -C using your new config file." + exit 0 end - log "Starting Mongrel listening at #{defaults[:host]}:#{defaults[:port]}" + if @config_file + conf = YAML.load_file(@config_file) + settings = settings.merge! conf + STDERR.puts "** Loading settings from #{@config_file} (they override command line)." unless settings[:daemon] + end - listener do - mime = {} - if defaults[:mime_map] - log "Loading additional MIME types from #{defaults[:mime_map]}" - mime = load_mime_map(defaults[:mime_map], mime) - end + config = Mongrel::Rails::RailsConfigurator.new(settings) do + if defaults[:daemon] + if File.exist? defaults[:pid_file] + log "!!! PID file #{defaults[:pid_file]} already exists. Mongrel could be running already. Check your #{defaults[:log_file]} for errors." + end - if defaults[:debug] - log "Installing debugging prefixed filters. Look in log/mongrel_debug for the files." - debug "/" + daemonize + log "Daemonized, any open files are closed. Look at #{defaults[:pid_file]} and #{defaults[:log_file]} for info." + log "Settings loaded from #{@config_file} (they override command line)." if @config_file end - log "Starting Rails with #{defaults[:environment]} environment..." - log "Mounting Rails at #{defaults[:prefix]}..." if defaults[:prefix] - uri defaults[:prefix] || "/", :handler => rails(:mime => mime, :prefix => defaults[:prefix]) - log "Rails loaded." + log "Starting Mongrel listening at #{defaults[:host]}:#{defaults[:port]}" - log "Loading any Rails specific GemPlugins" - load_plugins + listener do + mime = {} + if defaults[:mime_map] + log "Loading additional MIME types from #{defaults[:mime_map]}" + mime = load_mime_map(defaults[:mime_map], mime) + end - if defaults[:config_script] - log "Loading #{defaults[:config_script]} external config script" - run_config(defaults[:config_script]) - end + if defaults[:debug] + log "Installing debugging prefixed filters. Look in log/mongrel_debug for the files." + debug "/" + end - setup_rails_signals - end - end + log "Starting Rails with #{defaults[:environment]} environment..." + log "Mounting Rails at #{defaults[:prefix]}..." if defaults[:prefix] + uri defaults[:prefix] || "/", :handler => rails(:mime => mime, :prefix => defaults[:prefix]) + log "Rails loaded." - config.run - config.log "Mongrel available at #{settings[:host]}:#{settings[:port]}" - - if config.defaults[:daemon] - config.write_pid_file - else - config.log "Use CTRL-C to stop." - end + log "Loading any Rails specific GemPlugins" + load_plugins + + if defaults[:config_script] + log "Loading #{defaults[:config_script]} external config script" + run_config(defaults[:config_script]) + end + + setup_rails_signals + end + end - config.join + config.run + config.log "Mongrel available at #{settings[:host]}:#{settings[:port]}" - if config.needs_restart - if RUBY_PLATFORM !~ /mswin/ - cmd = "ruby #{__FILE__} start #{original_args.join(' ')}" - config.log "Restarting with arguments: #{cmd}" - exec cmd + if config.defaults[:daemon] + config.write_pid_file else - config.log "Win32 does not support restarts. Exiting." + config.log "Use CTRL-C to stop." + end + + config.join + + if config.needs_restart + if RUBY_PLATFORM !~ /mswin/ + cmd = "ruby #{__FILE__} start #{original_args.join(' ')}" + config.log "Restarting with arguments: #{cmd}" + exec cmd + else + config.log "Win32 does not support restarts. Exiting." + end end end end -end -def send_signal(signal, pid_file) - pid = open(pid_file).read.to_i - print "Sending #{signal} to Mongrel at PID #{pid}..." - begin - Process.kill(signal, pid) - rescue Errno::ESRCH - puts "Process does not exist. Not running." - end + def Mongrel::send_signal(signal, pid_file) + pid = open(pid_file).read.to_i + print "Sending #{signal} to Mongrel at PID #{pid}..." + begin + Process.kill(signal, pid) + rescue Errno::ESRCH + puts "Process does not exist. Not running." + end - puts "Done." -end + puts "Done." + end -class Stop < GemPlugin::Plugin "/commands" - include Mongrel::Command::Base + class Stop < GemPlugin::Plugin "/commands" + include Mongrel::Command::Base - def configure - options [ - ['-c', '--chdir PATH', "Change to dir before starting (will be expanded)", :@cwd, "."], - ['-f', '--force', "Force the shutdown.", :@force, false], - ['-P', '--pid FILE', "Where the PID file is located", :@pid_file, "log/mongrel.pid"] - ] - end + def configure + options [ + ['-c', '--chdir PATH', "Change to dir before starting (will be expanded)", :@cwd, "."], + ['-f', '--force', "Force the shutdown.", :@force, false], + ['-P', '--pid FILE', "Where the PID file is located", :@pid_file, "log/mongrel.pid"] + ] + end - def validate - @cwd = File.expand_path(@cwd) - valid_dir? @cwd, "Invalid path to change to during daemon mode: #@cwd" + def validate + @cwd = File.expand_path(@cwd) + valid_dir? @cwd, "Invalid path to change to during daemon mode: #@cwd" - Dir.chdir @cwd + Dir.chdir @cwd - valid_exists? @pid_file, "PID file #@pid_file does not exist. Not running?" - return @valid - end + valid_exists? @pid_file, "PID file #@pid_file does not exist. Not running?" + return @valid + end - def run - if @force - send_signal("KILL", @pid_file) - else - send_signal("TERM", @pid_file) + def run + if @force + Mongrel::send_signal("KILL", @pid_file) + else + Mongrel::send_signal("TERM", @pid_file) + end end end -end -class Restart < GemPlugin::Plugin "/commands" - include Mongrel::Command::Base + class Restart < GemPlugin::Plugin "/commands" + include Mongrel::Command::Base - def configure - options [ - ['-c', '--chdir PATH', "Change to dir before starting (will be expanded)", :@cwd, '.'], - ['-s', '--soft', "Do a soft restart rather than a process exit restart", :@soft, false], - ['-P', '--pid FILE', "Where the PID file is located", :@pid_file, "log/mongrel.pid"] - ] - end + def configure + options [ + ['-c', '--chdir PATH', "Change to dir before starting (will be expanded)", :@cwd, '.'], + ['-s', '--soft', "Do a soft restart rather than a process exit restart", :@soft, false], + ['-P', '--pid FILE', "Where the PID file is located", :@pid_file, "log/mongrel.pid"] + ] + end - def validate - @cwd = File.expand_path(@cwd) - valid_dir? @cwd, "Invalid path to change to during daemon mode: #@cwd" + def validate + @cwd = File.expand_path(@cwd) + valid_dir? @cwd, "Invalid path to change to during daemon mode: #@cwd" - Dir.chdir @cwd + Dir.chdir @cwd - valid_exists? @pid_file, "PID file #@pid_file does not exist. Not running?" - return @valid - end + valid_exists? @pid_file, "PID file #@pid_file does not exist. Not running?" + return @valid + end - def run - if @soft - send_signal("HUP", @pid_file) - else - send_signal("USR2", @pid_file) + def run + if @soft + Mongrel::send_signal("HUP", @pid_file) + else + Mongrel::send_signal("USR2", @pid_file) + end end end end @@ -227,10 +228,6 @@ end GemPlugin::Manager.instance.load "mongrel" => GemPlugin::INCLUDE, "rails" => GemPlugin::EXCLUDE - if not Mongrel::Command::Registry.instance.run ARGV exit 1 end - - - diff --git a/ext/http11/http11.c b/ext/http11/http11.c index 46a47be..717c642 100644 --- a/ext/http11/http11.c +++ b/ext/http11/http11.c @@ -556,7 +556,7 @@ void Init_http11() DEF_GLOBAL(server_protocol, "SERVER_PROTOCOL"); DEF_GLOBAL(server_protocol_value, "HTTP/1.1"); DEF_GLOBAL(http_host, "HTTP_HOST"); - DEF_GLOBAL(mongrel_version, "Mongrel 0.3.13.4"); + DEF_GLOBAL(mongrel_version, "Mongrel 0.3.13.5"); DEF_GLOBAL(server_software, "SERVER_SOFTWARE"); DEF_GLOBAL(port_80, "80"); diff --git a/lib/mongrel.rb b/lib/mongrel.rb index c0f07ab..07729fc 100644 --- a/lib/mongrel.rb +++ b/lib/mongrel.rb @@ -117,7 +117,7 @@ module Mongrel REQUEST_URI='REQUEST_URI'.freeze REQUEST_PATH='REQUEST_PATH'.freeze - MONGREL_VERSION="0.3.13.4".freeze + MONGREL_VERSION="0.3.13.5".freeze # TODO: this use of a base for tempfiles needs to be looked at for security problems MONGREL_TMP_BASE="mongrel".freeze @@ -683,7 +683,7 @@ module Mongrel client.close rescue Object reap_dead_workers("max processors") else - thread = Thread.new { process_client(client) } + thread = Thread.new(client) {|c| process_client(c) } thread.abort_on_exception = true thread[:started_on] = Time.now @workers.add(thread) diff --git a/lib/mongrel/command.rb b/lib/mongrel/command.rb index 7790b64..8f65426 100644 --- a/lib/mongrel/command.rb +++ b/lib/mongrel/command.rb @@ -157,6 +157,10 @@ module Mongrel puts "#{Mongrel::Command::BANNER}\nAvailable commands are:\n\n" self.commands.each do |name| + if /mongrel::/ =~ name + name = name[9 .. -1] + end + puts " - #{name[1 .. -1]}\n" end @@ -179,8 +183,12 @@ module Mongrel return true end - # command exists, set it up and validate it begin + # quick hack so that existing commands will keep working but the Mongrel:: ones can be moved + if ["start", "stop", "restart"].include? cmd_name + cmd_name = "mongrel::" + cmd_name + end + command = GemPlugin::Manager.instance.create("/commands/#{cmd_name}", :argv => args) rescue OptionParser::InvalidOption STDERR.puts "#$! for command '#{cmd_name}'" diff --git a/lib/mongrel/configurator.rb b/lib/mongrel/configurator.rb index 5120ede..dd21e65 100644 --- a/lib/mongrel/configurator.rb +++ b/lib/mongrel/configurator.rb @@ -302,17 +302,17 @@ module Mongrel # debug "/", what = [:rails] # # And it will only produce the log/mongrel_debug/rails.log file. - # Available options are: :objects, :rails, :files, :threads, :params + # Available options are: :access, :files, :objects, :threads, :rails # # NOTE: Use [:files] to get accesses dumped to stderr like with WEBrick. - def debug(location, what = [:objects, :rails, :files, :threads, :params]) + def debug(location, what = [:access, :files, :objects, :threads, :rails]) require 'mongrel/debug' handlers = { - :files => "/handlers/requestlog::access", - :rails => "/handlers/requestlog::files", + :access => "/handlers/requestlog::access", + :files => "/handlers/requestlog::files", :objects => "/handlers/requestlog::objects", :threads => "/handlers/requestlog::threads", - :params => "/handlers/requestlog::params" + :rails => "/handlers/requestlog::params" } # turn on the debugging infrastructure, and ObjectTracker is a pig diff --git a/lib/mongrel/debug.rb b/lib/mongrel/debug.rb index 64a1a16..572696e 100644 --- a/lib/mongrel/debug.rb +++ b/lib/mongrel/debug.rb @@ -129,7 +129,7 @@ module RequestLog begin if o.respond_to? :length len = o.length - lengths[o.class] ||= Stats.new(o.class) + lengths[o.class] ||= Mongrel::Stats.new(o.class) lengths[o.class].sample(len) end rescue Object diff --git a/lib/mongrel/handlers.rb b/lib/mongrel/handlers.rb index 4d36e8b..b0a399b 100644 --- a/lib/mongrel/handlers.rb +++ b/lib/mongrel/handlers.rb @@ -324,11 +324,11 @@ module Mongrel def initialize(ops={}) @sample_rate = ops[:sample_rate] || 300 - @processors = Stats.new("processors") - @reqsize = Stats.new("request Kb") - @headcount = Stats.new("req param count") - @respsize = Stats.new("response Kb") - @interreq = Stats.new("inter-request time") + @processors = Mongrel::Stats.new("processors") + @reqsize = Mongrel::Stats.new("request Kb") + @headcount = Mongrel::Stats.new("req param count") + @respsize = Mongrel::Stats.new("response Kb") + @interreq = Mongrel::Stats.new("inter-request time") end diff --git a/lib/mongrel/rails.rb b/lib/mongrel/rails.rb index ca430d5..e351cec 100644 --- a/lib/mongrel/rails.rb +++ b/lib/mongrel/rails.rb @@ -78,10 +78,12 @@ module Mongrel # we don't want the output to be really final until we're out of the lock cgi.default_really_final = false - log_threads_waiting_for(request.params["PATH_INFO"]) if $mongrel_debug_client + log_threads_waiting_for(request.params["PATH_INFO"] || @active_request_path) if $mongrel_debug_client @guard.synchronize(:EX) { + @active_request_path = request.params["PATH_INFO"] Dispatcher.dispatch(cgi, ActionController::CgiRequest::DEFAULT_SESSION_OPTIONS, response.body) + @active_request_path = nil } # This finalizes the output using the proper HttpResponse way diff --git a/lib/mongrel/stats.rb b/lib/mongrel/stats.rb index eec6ff9..f6cf5ab 100644 --- a/lib/mongrel/stats.rb +++ b/lib/mongrel/stats.rb @@ -12,76 +12,78 @@ # # It does all of this very fast and doesn't take up any memory since the samples # are not stored but instead all the values are calculated on the fly. -class Stats - attr_reader :sum, :sumsq, :n, :min, :max +module Mongrel + class Stats + attr_reader :sum, :sumsq, :n, :min, :max - def initialize(name) - @name = name - reset - end + def initialize(name) + @name = name + reset + end - # Resets the internal counters so you can start sampling again. - def reset - @sum = 0.0 - @sumsq = 0.0 - @last_time = Time.new - @n = 0.0 - @min = 0.0 - @max = 0.0 - end + # Resets the internal counters so you can start sampling again. + def reset + @sum = 0.0 + @sumsq = 0.0 + @last_time = Time.new + @n = 0.0 + @min = 0.0 + @max = 0.0 + end - # Adds a sampling to the calculations. - def sample(s) - @sum += s - @sumsq += s * s - if @n == 0 - @min = @max = s - else - @min = s if @min > s - @max = s if @max < s + # Adds a sampling to the calculations. + def sample(s) + @sum += s + @sumsq += s * s + if @n == 0 + @min = @max = s + else + @min = s if @min > s + @max = s if @max < s + end + @n+=1 end - @n+=1 - end - # Dump this Stats object with an optional additional message. - def dump(msg = "", out=STDERR) - out.puts "#{msg}: #{self.to_s}" - end + # Dump this Stats object with an optional additional message. + def dump(msg = "", out=STDERR) + out.puts "#{msg}: #{self.to_s}" + end - # Returns a common display (used by dump) - def to_s + # Returns a common display (used by dump) + def to_s "[#{@name}]: SUM=%0.4f, SUMSQ=%0.4f, N=%0.4f, MEAN=%0.4f, SD=%0.4f, MIN=%0.4f, MAX=%0.4f" % [@sum, @sumsq, @n, mean, sd, @min, @max] - end + end - # Calculates and returns the mean for the data passed so far. - def mean - @sum / @n - end + # Calculates and returns the mean for the data passed so far. + def mean + @sum / @n + end - # Calculates the standard deviation of the data so far. - def sd - # (sqrt( ((s).sumsq - ( (s).sum * (s).sum / (s).n)) / ((s).n-1) )) - begin - return Math.sqrt( (@sumsq - ( @sum * @sum / @n)) / (@n-1) ) - rescue Errno::EDOM - return 0.0 + # Calculates the standard deviation of the data so far. + def sd + # (sqrt( ((s).sumsq - ( (s).sum * (s).sum / (s).n)) / ((s).n-1) )) + begin + return Math.sqrt( (@sumsq - ( @sum * @sum / @n)) / (@n-1) ) + rescue Errno::EDOM + return 0.0 + end end - end - # Adds a time delta between now and the last time you called this. This - # will give you the average time between two activities. - # - # An example is: - # - # t = Stats.new("do_stuff") - # 10000.times { do_stuff(); t.tick } - # t.dump("time") - # - def tick - now = Time.now - sample(now - @last_time) - @last_time = now + # Adds a time delta between now and the last time you called this. This + # will give you the average time between two activities. + # + # An example is: + # + # t = Stats.new("do_stuff") + # 10000.times { do_stuff(); t.tick } + # t.dump("time") + # + def tick + now = Time.now + sample(now - @last_time) + @last_time = now + end end end diff --git a/test/test_stats.rb b/test/test_stats.rb index a0f9c1b..e37f2e2 100644 --- a/test/test_stats.rb +++ b/test/test_stats.rb @@ -13,8 +13,8 @@ class StatsTest < Test::Unit::TestCase def test_sampling_speed out = StringIO.new - s = Stats.new("test") - t = Stats.new("time") + s = Mongrel::Stats.new("test") + t = Mongrel::Stats.new("time") 100.times { s.sample(rand(20)); t.tick } -- cgit v1.2.3-24-ge0c7