Long running SQL query via ActiveRecord blocking the entire Ruby process?

To my surprise, a long running SQL query via ActiveRecord blocks an
entire Ruby process (all the other threads are blocked while the
thread that runs the SQL query is waiting for the result set)

Has anyone else found this to be the case? (am I mistaken?)
Is there any way to avoid this other than spawning a separate process?

[Ruby version 1.8.4, ActiveRecord version 1.14.4 on Linux]

-Steve

It is my understanding that Ruby threads are green threads.

see: Green thread - Wikipedia
"Also a green thread may block all other threads if performing a
blocking I/O operation. In order to avoid these problems, green
threads must use asynchronous I/O operations, but the added complexity
increases latency."

I seem to remember reading about Ruby threads and IO blocking, but
cannot find it.

Hope the above answers some questions.

Does anyone know of a solution?

-Szymon

···

On Nov 6, 3:26 pm, estebanj...@gmail.com wrote:

To my surprise, a long running SQL query via ActiveRecord blocks an
entire Ruby process (all the other threads are blocked while the
thread that runs the SQL query is waiting for the result set)

Has anyone else found this to be the case? (am I mistaken?)
Is there any way to avoid this other than spawning a separate process?

[Ruby version 1.8.4, ActiveRecord version 1.14.4 on Linux]

-Steve

To my surprise, a long running SQL query via ActiveRecord
blocks an entire Ruby process (all the other threads are
blocked while the thread that runs the SQL query is waiting
for the result set)

Has anyone else found this to be the case? (am I mistaken?)
Is there any way to avoid this other than spawning a separate process?

[Ruby version 1.8.4, ActiveRecord version 1.14.4 on Linux]

As far as I know, things like Mongrel obtain a global lock -> run the
request through rails -> and release the lock. Rails isn't thread safe,
and a great deal of hackery depends upon this non-threaded mode of
operation. To handle multiple requests, you'll need multiple processes.

I'm curious, do you have something attempting to run the same rails in
multiple ruby threads at the same time?

Brian

The postgres and oracle adapters support async queries which won't
block Ruby threads, or you can use any of the pure-Ruby database
drivers.

Forking processes is probably better though.

jeremy

···

On 11/6/07, estebanjang@gmail.com <estebanjang@gmail.com> wrote:

To my surprise, a long running SQL query via ActiveRecord blocks an
entire Ruby process (all the other threads are blocked while the
thread that runs the SQL query is waiting for the result set)

Has anyone else found this to be the case? (am I mistaken?)
Is there any way to avoid this other than spawning a separate process?

C extensions that block will block the whole process, as they
basically interrupt ruby's thread schedular while they are running.
Unless the extension is written with this in mind, which most are not.

Chris

···

On Nov 6, 2007 12:30 PM, <estebanjang@gmail.com> wrote:

To my surprise, a long running SQL query via ActiveRecord blocks an
entire Ruby process (all the other threads are blocked while the
thread that runs the SQL query is waiting for the result set)

Has anyone else found this to be the case? (am I mistaken?)
Is there any way to avoid this other than spawning a separate process?

i'll be releasing a background job manager for rails in a few days... fyi.

a @ http://codeforpeople.com/

···

On Nov 6, 2007, at 2:47 PM, Jeremy Kemper wrote:

The postgres and oracle adapters support async queries which won't
block Ruby threads, or you can use any of the pure-Ruby database
drivers.

Forking processes is probably better though.

--
we can deny everything, except that we have the possibility of being better. simply reflect on that.
h.h. the 14th dalai lama