mongrel 0.3.12.2 → 0.3.12.3

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.
data/Rakefile CHANGED
@@ -32,7 +32,7 @@ end
32
32
  setup_extension("http11", "http11")
33
33
 
34
34
  name="mongrel"
35
- version="0.3.12.2"
35
+ version="0.3.12.3"
36
36
 
37
37
  setup_gem(name, version) do |spec|
38
38
  spec.summary = "A small fast HTTP library and server that runs Rails, Camping, and Nitro apps."
@@ -1,6 +1,7 @@
1
1
 
2
2
  require 'rubygems'
3
3
  require 'yaml'
4
+ require 'mongrel'
4
5
  require 'mongrel/rails'
5
6
 
6
7
 
@@ -135,7 +135,7 @@ void header_done(void *data, const char *at, size_t length)
135
135
 
136
136
  ctype = rb_hash_aref(req, global_http_content_type);
137
137
  if(ctype != Qnil) {
138
- rb_hash_aset(req, global_content_type, Qnil);
138
+ rb_hash_aset(req, global_content_type, ctype);
139
139
  }
140
140
 
141
141
  rb_hash_aset(req, global_gateway_interface, global_gateway_interface_value);
@@ -520,7 +520,7 @@ void Init_http11()
520
520
  DEF_GLOBAL(server_protocol, "SERVER_PROTOCOL");
521
521
  DEF_GLOBAL(server_protocol_value, "HTTP/1.1");
522
522
  DEF_GLOBAL(http_host, "HTTP_HOST");
523
- DEF_GLOBAL(mongrel_version, "Mongrel 0.3.12.2");
523
+ DEF_GLOBAL(mongrel_version, "Mongrel 0.3.12.3");
524
524
  DEF_GLOBAL(server_software, "SERVER_SOFTWARE");
525
525
  DEF_GLOBAL(port_80, "80");
526
526
 
@@ -99,7 +99,7 @@ module Mongrel
99
99
  # The original URI requested by the client. Passed to URIClassifier to build PATH_INFO and SCRIPT_NAME.
100
100
  REQUEST_URI='REQUEST_URI'.freeze
101
101
 
102
- MONGREL_VERSION="0.3.12.2".freeze
102
+ MONGREL_VERSION="0.3.12.3".freeze
103
103
 
104
104
  # The standard empty 404 response for bad requests. Use Error4040Handler for custom stuff.
105
105
  ERROR_404_RESPONSE="HTTP/1.1 404 Not Found\r\nConnection: close\r\nServer: #{MONGREL_VERSION}\r\n\r\nNOT FOUND".freeze
@@ -370,6 +370,8 @@ module Mongrel
370
370
  attr_reader :acceptor
371
371
  attr_reader :workers
372
372
  attr_reader :classifier
373
+ attr_reader :host
374
+ attr_reader :port
373
375
 
374
376
  # Creates a working server on host:port (strange things happen if port isn't a Number).
375
377
  # Use HttpServer::run to start the server and HttpServer.acceptor.join to
@@ -392,6 +394,7 @@ module Mongrel
392
394
  @workers = ThreadGroup.new
393
395
  @timeout = timeout
394
396
  @num_processors = num_processors
397
+ @death_time = 60
395
398
  end
396
399
 
397
400
 
@@ -417,6 +420,7 @@ module Mongrel
417
420
  params[Const::PATH_INFO] = path_info
418
421
  params[Const::SCRIPT_NAME] = script_name
419
422
  params[Const::REMOTE_ADDR] = params[Const::HTTP_X_FORWARDED_FOR] || client.peeraddr.last
423
+
420
424
  request = HttpRequest.new(params, data[nread ... data.length], client)
421
425
  response = HttpResponse.new(client)
422
426
 
@@ -464,7 +468,9 @@ module Mongrel
464
468
  def reap_dead_workers(worker_list)
465
469
  mark = Time.now
466
470
  worker_list.each do |w|
467
- if mark - w[:started_on] > 10 * @timeout
471
+ w[:started_on] = Time.now if not w[:started_on]
472
+
473
+ if mark - w[:started_on] > @death_time + @timeout
468
474
  STDERR.puts "Thread #{w.inspect} is too old, killing."
469
475
  w.raise(StopServer.new("Timed out thread."))
470
476
  end
@@ -482,6 +488,7 @@ module Mongrel
482
488
  begin
483
489
  client = @socket.accept
484
490
  worker_list = @workers.list
491
+
485
492
  if worker_list.length >= @num_processors
486
493
  STDERR.puts "Server overloaded with #{worker_list.length} processors (#@num_processors max). Dropping connection."
487
494
  client.close
@@ -510,10 +517,15 @@ module Mongrel
510
517
  # now that processing is done we feed enough false onto the request queue to get
511
518
  # each processor to exit and stop processing.
512
519
 
513
- # finally we wait until the queue is empty
520
+ # finally we wait until the queue is empty (but only about 10 seconds)
521
+ @death_time = 10
522
+ shutdown_start = Time.now
523
+
514
524
  while @workers.list.length > 0
515
- STDERR.puts "Shutdown waiting for #{@workers.list.length} requests" if @workers.list.length > 0
525
+ waited_for = (Time.now - shutdown_start).ceil
526
+ STDERR.print "Shutdown waited #{waited_for} for #{@workers.list.length} requests, could take #{@death_time + @timeout} seconds.\r" if @workers.list.length > 0
516
527
  sleep 1
528
+ reap_dead_workers(@workers.list)
517
529
  end
518
530
  end
519
531
 
@@ -802,11 +814,13 @@ module Mongrel
802
814
  MongrelDbg.begin_trace :objects
803
815
  MongrelDbg.begin_trace :rails
804
816
  MongrelDbg.begin_trace :files
817
+ MongrelDbg.begin_trace :threads
805
818
 
806
819
  uri location, :handler => plugin("/handlers/requestlog::access")
807
820
  uri location, :handler => plugin("/handlers/requestlog::files")
808
821
  uri location, :handler => plugin("/handlers/requestlog::objects")
809
822
  uri location, :handler => plugin("/handlers/requestlog::params")
823
+ uri location, :handler => plugin("/handlers/requestlog::threads")
810
824
  end
811
825
 
812
826
  # Used to allow you to let users specify their own configurations
@@ -148,7 +148,7 @@ module RequestLog
148
148
  include Mongrel::HttpHandlerPlugin
149
149
 
150
150
  def process(request, response)
151
- MongrelDbg::trace(:objects, "#{Time.now} OBJECT STATS BEFORE REQUEST #{request.params['PATH_INFO']}")
151
+ MongrelDbg::trace(:objects, "#{'-' * 10}\n#{Time.now} OBJECT STATS BEFORE REQUEST #{request.params['PATH_INFO']}")
152
152
  ObjectTracker.sample
153
153
  end
154
154
 
@@ -164,10 +164,30 @@ module RequestLog
164
164
  end
165
165
 
166
166
  end
167
+
168
+ class Threads < GemPlugin::Plugin "/handlers"
169
+ include Mongrel::HttpHandlerPlugin
170
+
171
+ def process(request, response)
172
+ MongrelDbg::trace(:threads, "#{Time.now} REQUEST #{request.params['PATH_INFO']}")
173
+ ObjectSpace.each_object do |obj|
174
+ if obj.class == Mongrel::HttpServer
175
+ worker_list = obj.workers.list
176
+
177
+ if worker_list.length > 0
178
+ keys = "-----\n\tKEYS:"
179
+ worker_list.each {|t| keys << "\n\t\t-- #{t}: #{t.keys.inspect}" }
180
+ end
181
+
182
+ MongrelDbg::trace(:threads, "#{obj.host}:#{obj.port} -- THREADS: #{worker_list.length} #{keys}")
183
+ end
184
+ end
185
+ end
186
+ end
167
187
  end
168
188
 
169
189
 
170
190
  END {
171
- MongrelDbg::trace(:files, "FILES OPEN AT EXIT")
172
- log_open_files
191
+ MongrelDbg::trace(:files, "FILES OPEN AT EXIT")
192
+ log_open_files
173
193
  }
metadata CHANGED
@@ -3,8 +3,8 @@ rubygems_version: 0.8.11
3
3
  specification_version: 1
4
4
  name: mongrel
5
5
  version: !ruby/object:Gem::Version
6
- version: 0.3.12.2
7
- date: 2006-04-04 00:00:00 -04:00
6
+ version: 0.3.12.3
7
+ date: 2006-04-06 00:00:00 -04:00
8
8
  summary: A small fast HTTP library and server that runs Rails, Camping, and Nitro apps.
9
9
  require_paths:
10
10
  - lib