1. Michael Granger
  2. ruby-pg
  3. Issues


Issue #66 resolved

Win32 asynchronous queries hang on connection error

Rafał Bigaj
created an issue

I encountered the following problems on win32 system with all version of pg (0.9.0, 0.9.1, 0.10.0, 0.10.1 and 0.11.0) on Ruby 1.9:

During asynchronous queries the CPU usage is 100% - rb_w32_thread_select does not wait any time on foreign socket (not created with ruby socket API). The only way I found to workaround the problem is simple waiting 1ms before each select if the PG is busy.

PQConsumeInput result is not interpreted in pgconn_block what makes the waiting loop infinite (PQisBusy returns always TRUE) if connection error occurs

pgconn_async_exec can block the interpreter for a long time on initial pgconn_get_last_result (pgconn_block is not called before)

I have committed the fixes for above problems to my fork at: https://bitbucket.org/rafalbigaj/ruby-pg/changeset/17a6a01c1725

Comments (9)

  1. Michael Granger repo owner

    Applying the patch as-is breaks the build for me:

    ../../../../ext/pg.c:2602:39: error: operator '||' has no right operand
    ../../../../ext/pg.c: In function ‘pgconn_block’:
    ../../../../ext/pg.c:2608: error: ‘zerotime’ undeclared (first use in this function)
    ../../../../ext/pg.c:2608: error: (Each undeclared identifier is reported only once
    ../../../../ext/pg.c:2608: error: for each function it appears in.)

    It's likely just a matter of a missing `defined()` at line 2602.

    I'll fix that and get this applied. Do you have a minimal test case that demonstrates the problem? I can probably figure it out myself, but I'm wondering if it's possible to write a test for it, and thought if you already had something you used, I'd have a headstart.

  2. Rafał Bigaj reporter

    I have attached the simple script that I uses to test if the connection problem still exist.

    During the script is running I release my network connection. On the original code I frequently encounter hangs.

    How to write automated test for it?

  3. Log in to comment