postgresql サーバーへの永続的な接続を維持するプログラムがあります。ネットワークの問題が原因で接続がブロックされているとします (ネットワーク インターフェイスをダウンさせることでシミュレートできます)。eventlet を使用してクエリを呼び出したプロセスが停止します。これにより、他のイベントレットも実行できなくなります。gdb をアタッチすると、psycopg2 C コードでプロセスがブロックされていることが示されました。postgresql TCPキープアライブを試しました。ただし、接続が失われるとすぐにクエリが呼び出されると、これも失敗します。
eventlet がこの状態になるのを防ぐ方法はありますか? eventlet をこの状態から抜け出す方法はありますか。
GDB
#0 0x00002b4e7836be46 in poll () from /lib64/libc.so.6
#1 0x00002b4e835dec4f in ?? () from /usr/pgsql-9.0/lib/libpq.so.5
#2 0x00002b4e835ded50 in ?? () from /usr/pgsql-9.0/lib/libpq.so.5
#3 0x00002b4e835dd28e in PQgetResult () from /usr/pgsql-9.0/lib/libpq.so.5
#4 0x00002b4e833a4284 in psyco_exec_green (conn=0x21f42510, command=<value optimized out>) at psycopg/green.c:195
#5 0x00002b4e833a5387 in pq_execute_command_locked (conn=0x21f42510,
query=0x2b4e833b5de8 "BEGIN; SET TRANSACTION ISOLATION LEVEL READ COMMITTED", pgres=0x7fff84c38448, error=0x7fff84c38440,
tstate=0x7fff84c38438) at psycopg/pqpath.c:342
#6 0x00002b4e833a58f7 in pq_begin_locked (conn=0x21f42510, pgres=0xffffffffffffffff, error=0xffffffffffffffff, tstate=0x0)
at psycopg/pqpath.c:424
#7 0x00002b4e833a59a0 in pq_execute (curs=0x1f487528, query=0x2248c894 "SELECT 1", async=0) at psycopg/pqpath.c:764
#8 0x00002b4e833ab15b in _psyco_curs_execute (self=0x1f487528, operation=0x0, vars=0x21ec9a80, async=0)
at psycopg/cursor_type.c:419
#9 0x00002b4e833ab7b1 in psyco_curs_execute (self=0x1f487528, args=<value optimized out>, kwargs=<value optimized out>)
at psycopg/cursor_type.c:475