-
Notifications
You must be signed in to change notification settings - Fork 180
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Win32 asynchronous queries hang on connection error #66
Comments
Original comment by Michael Granger (Bitbucket: ged, GitHub: ged). Applying the patch as-is breaks the build for me:
It's likely just a matter of a missing 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. |
Original comment by Anonymous. After running into performance problems I found out that the previous patch that added a small wait (1ms) after each PQisBusy is not a good idea. I have committed the next patch: https://bitbucket.org/rafalbigaj/ruby-pg/changeset/fc4109b2ddba which uses Winsock events and rb_w32_wait_events. The proposed solution is faster about 20-30% on WIN32 than the original code. |
Original comment by Rafał Bigaj (Bitbucket: rafalbigaj, GitHub: rafalbigaj). 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? |
Original comment by Rafał Bigaj (Bitbucket: rafalbigaj, GitHub: rafalbigaj). One commit more: |
Original report by Rafał Bigaj (Bitbucket: rafalbigaj, GitHub: rafalbigaj).
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
The text was updated successfully, but these errors were encountered: