Ruby on Rails | Screencasts | Download | Documentation | Weblog | Community | Source

Ticket #3433 (closed defect: fixed)

Opened 2 years ago

Last modified 2 years ago

[PATCH] WEBrick concurrency control broken

Reported by: tom@craz8.com Assigned to: David
Priority: normal Milestone: 1.0
Component: Railties Version: 1.0.0
Severity: critical Keywords: webrick mutex
Cc:

Description

Symptoms

I have a site that has some static files and some images retrieved from a database table. If I have a number of large dynamic images, WEBrick freaks out, indicating the MySQL database connection is lost. Also, from the development log, it looks like two requests are running simultaneously! Since ActiveController::Base.allow_concurrency is still false, this can't be - or can it?

Once this occurs, WEBrick can be toast until it is restarted.

The Diagnosis

After a little poking around in WEBrick's service method, it seems that WEBrick is running two threads, and is doing a good job of only running one dynamic request at a time until, suddenly, it allows two dynamic requests to run at the same time!

The Problem

A static request does not lock the REQUEST_MUTEX, however, when the static file request is complete, the mutex is unlocked (in the Ensure block) even if this thread was not the one that locked the mutex. This allows a second dynamic request to start before the first one is finished, and chaos ensues.

The Fix

My patch moves the begin/ensure/end block inside the handle_file() method, allowing many static files to still be served, but only allowing one dynamic request.

Attachments

webrick-mutex.diff (0.9 kB) - added by tom@craz8.com on 01/10/06 05:55:23.
WEBrick service method better mutex usage
webrick_server.rb (4.6 kB) - added by anonymous on 06/27/06 13:15:45.

Change History

01/10/06 05:55:23 changed by tom@craz8.com

  • attachment webrick-mutex.diff added.

WEBrick service method better mutex usage

01/10/06 06:00:12 changed by tom@craz8.com

  • summary changed from WEBrick concurrency control broken to [PATCH] WEBrick concurrency control broken.

01/21/06 23:38:43 changed by david

  • status changed from new to closed.
  • resolution set to fixed.

(In [3454]) Fixed that static requests could unlock the mutex guarding dynamic requests in the WEBrick servlet (closes #3433) [tom@craz8.com]

01/21/06 23:38:53 changed by david

(In [3455]) Fixed that static requests could unlock the mutex guarding dynamic requests in the WEBrick servlet (closes #3433) [tom@craz8.com]

06/27/06 13:15:45 changed by anonymous

  • attachment webrick_server.rb added.

08/04/06 03:42:39 changed by anonymous

duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou duosou