Re: ODBC cliens is hanging if network connection is broken

[email protected] Mon, 9 Jul 2018 17:06:37 +0300
Newsgroups gmane.comp.db.postgresql.odbc
Message-ID <[email protected]>
Hello!

Thank You for quick response. 
I set SQL_ATTR_QUERY_TIMEOUT to 5 seconds as follows:

SQLRETURN rc = SQLSetStmtAttr(hstmt, SQL_ATTR_QUERY_TIMEOUT, (SQLPOINTER) 
5, SQL_IS_UINTEGER);
after SQLAllocHandle for hstmt and before SQLExecDirect call.

To take some time in SQLExecDirect I call the command "SELECT pg_sleep(10)
". 
If an ODBC aplication does not loose network connection with the remote 
server  this command is terminated in 5 seconds after its invocation.
I get the following error 57014 (Cancelling statement due to statement 
timeout).

In case if network connection is lost(network interface is down) my ODBC 
application is indefinitely hanging. 
Here is a gstack output of this process:
gstack 13359
#0  0x00007fdd045703b0 in __poll_nocancel () from /lib64/libc.so.6
#1  0x00007fdd037c8626 in ?? () from /usr/lib64/libpq.so.5
#2  0x00007fdd037c86b0 in ?? () from /usr/lib64/libpq.so.5
#3  0x00007fdd037c6889 in PQgetResult () from /usr/lib64/libpq.so.5
#4  0x00007fdd039fbe55 in CC_send_query_append (self=self@entry=0x10ccc60, 
query=query@entry=0x7fff2364d470 "SET statement_timeout = 5000", 
qi=qi@entry=0x0, flag=flag@entry=0, stmt=stmt@entry=0x0, 
appendq=appendq@entry=0x0) at connection.c:1921
#5  0x00007fdd03a2e3ed in SC_execute (self=self@entry=0x10df840) at 
statement.c:1912
#6  0x00007fdd03a0c596 in Exec_with_parameters_resolved 
(stmt=stmt@entry=0x10df840, exec_end=exec_end@entry=0x7fff2364d60c) at 
execute.c:450
#7  0x00007fdd03a0d4b6 in PGAPI_Execute (hstmt=hstmt@entry=0x10df840, 
flag=flag@entry=1) at execute.c:1045
#8  0x00007fdd03a0daac in PGAPI_ExecDirect (hstmt=hstmt@entry=0x10df840, 
szSqlStr=szSqlStr@entry=0x4014ed "SELECT pg_sleep(10)", 
cbSqlStr=cbSqlStr@entry=-3, flag=flag@entry=1) at execute.c:191
#9  0x00007fdd03a3511b in SQLExecDirect (StatementHandle=0x10df840, 
StatementText=0x4014ed "SELECT pg_sleep(10)", TextLength=-3) at 
odbcapi.c:322
#10 0x00007fdd04851432 in SQLExecDirect () from /usr/lib64/libodbc.so.2
#11 0x0000000000400fcf in main (argc=1, argv=0x7fff2364d928) at 
odbcExample.c:163

Do you have any idea what can be wrong? 

Thank you in advance, 
Andrei Yahorau



From:   "Inoue, Hiroshi" <[email protected]>
To:     [email protected], 
Cc:     [email protected], [email protected]
Date:   08/07/2018 13:33
Subject:        Re: ODBC cliens is hanging if network connection is broken



Hi,

On 2018/07/07 21:37, [email protected] wrote:
Hello PostgreSQL Community!

I downloaded and installed the latest version of PostgreSQL from 
https://www.postgresql.org/ftp/source/v10.4/ on my SLES 12 system.
Here is my configuration of unixODBC: 

odbcinst,ini 
[PostgreSQL] 
Description=PostgreSQL ODBC driver 
Driver=/usr/local/lib/psqlodbcw.so 
FileUsage=1 

odbc.ini 
[sles12-1] 
Description = PostgreSQL connection to rtpdb 
Driver = PostgreSQL 
Database = rtpdb 
Servername = sles12-1 
Username = 
Password = 
Port = 5432 
Protocol = 7.4+ 
ReadOnly = No 
RowVersioning = No 
ShowSystemTables = No 
ConnSettings = 

As a Driver in odbcinst.ini I specified the path to psqlodbcw.so which was 
downloaded from https://git.postgresql.org/gitweb/?p=psqlodbc.git and 
built as follows: 
./configure
make
make install 

Could you please provide a comment concerning the following situation? 

I  created a simple ODBC program which calls "SELECT pg_is_in_recovery()" 
on the remote PostgreSQL server using ODBC API. It works good with this 
ODBC configuration. But as soon as I turn off network interface after 
SQLConnect  call and before SQLExecDirect, it leads to SQLExecDirect 
hanging.

I tried to use statement_timeout  and idle_in_transaction_session_timeout 
 postgresql configuration parameters but they were not suitable for 
network issue case. These parameters define server-side behaviour but a 
client considers that the connection is ok and it is hanging.



As far as I know SQL_ATTR_CONNECTION_TIMEOUT ODBC attribute could handle 
this situation. Another ODBC driver for another database in case of 
similar situation returns HYT01  ODBC error (Connection timeout expired) . 
But I guess  SQL_ATTR_CONNECTION_TIMEOUT  is not supported by psqlodbc. 
 Am I right?

How about calling SQLSetStmtAttr() with the attribute parameter 
SQL_ATTR_QUERY_TIMEOUT?



PostgreSQL JDBC driver provides socketTimeout property which helps a 
client to be informed about network problems and to avoid an infinite 
hanging. 
In my tests it returned 08006 sqlstate (connection_failure ). 

So I have a question. Is there any psqlodbc or native PostgreSQL mechanism 
or configuration parameter which helps a client to be informed about 
network problem?
Is there any mechanism which helps to avoid this infinite hanging for SQL 
query in this case? 

Thank You in advance, 
Andrei Yahorau