[libpostgresql-jdbc-java] 78/93: connectTimeout property support
Emmanuel Bourg
ebourg-guest at moszumanska.debian.org
Mon Jan 9 10:18:55 UTC 2017
This is an automated email from the git hooks/post-receive script.
ebourg-guest pushed a commit to annotated tag REL9_3_1102
in repository libpostgresql-jdbc-java.
commit bbb6fd0eca4bb9c7a44d8a47840be0feb7ff7942
Author: seregamorph <serega.morph at gmail.com>
Date: Sat Apr 5 17:03:49 2014 +0400
connectTimeout property support
---
doc/pgjdbc.xml | 12 ++++++
org/postgresql/core/PGStream.java | 17 +++++++-
org/postgresql/core/v2/ConnectionFactoryImpl.java | 18 ++++++---
org/postgresql/core/v2/ProtocolConnectionImpl.java | 7 +++-
org/postgresql/core/v3/ConnectionFactoryImpl.java | 18 ++++++---
org/postgresql/core/v3/ProtocolConnectionImpl.java | 7 +++-
org/postgresql/test/jdbc2/ConnectTimeoutTest.java | 45 ++++++++++++++++++++++
org/postgresql/test/jdbc2/Jdbc2TestSuite.java | 4 +-
8 files changed, 110 insertions(+), 18 deletions(-)
diff --git a/doc/pgjdbc.xml b/doc/pgjdbc.xml
index 5f6f04e..4c7bb7b 100644
--- a/doc/pgjdbc.xml
+++ b/doc/pgjdbc.xml
@@ -725,6 +725,18 @@ openssl pkcs8 -topk8 -in client.key -out client.pk8 -outform DER -v1 PBE-SHA1-3D
</listitem>
</varlistentry>
+ <varlistentry>
+ <term><varname>connectTimeout</varname> = <type>int</type></term>
+ <listitem>
+ <para>
+ The timeout value used for socket connect operations. If connecting
+ to the server takes longer than this value, the connection is broken.
+ The timeout is specified in seconds and a value of zero means that
+ it is disabled.
+ </para>
+ </listitem>
+ </varlistentry>
+
<varlistentry>
<term><varname>socketTimeout</varname> = <type>int</type></term>
<listitem>
diff --git a/org/postgresql/core/PGStream.java b/org/postgresql/core/PGStream.java
index fad4c12..bf4b5c4 100644
--- a/org/postgresql/core/PGStream.java
+++ b/org/postgresql/core/PGStream.java
@@ -50,14 +50,15 @@ public class PGStream
* a stream connection.
*
* @param hostSpec the host and port to connect to
+ * @param timeout timeout in milliseconds, or 0 if no timeout set
* @exception IOException if an IOException occurs below it.
*/
- public PGStream(HostSpec hostSpec) throws IOException
+ public PGStream(HostSpec hostSpec, int timeout) throws IOException
{
this.hostSpec = hostSpec;
Socket socket = new Socket();
- socket.connect(new InetSocketAddress(hostSpec.getHost(), hostSpec.getPort()));
+ socket.connect(new InetSocketAddress(hostSpec.getHost(), hostSpec.getPort()), timeout);
changeSocket(socket);
setEncoding(Encoding.getJVMEncoding("US-ASCII"));
@@ -65,6 +66,18 @@ public class PGStream
_int4buf = new byte[4];
}
+ /**
+ * Constructor: Connect to the PostgreSQL back end and return
+ * a stream connection.
+ *
+ * @param hostSpec the host and port to connect to
+ * @throws IOException if an IOException occurs below it.
+ * @deprecated use {@link #PGStream(org.postgresql.util.HostSpec, int)}
+ */
+ public PGStream(HostSpec hostSpec) throws IOException {
+ this(hostSpec, 0);
+ }
+
public HostSpec getHostSpec() {
return hostSpec;
}
diff --git a/org/postgresql/core/v2/ConnectionFactoryImpl.java b/org/postgresql/core/v2/ConnectionFactoryImpl.java
index 07cf232..08ea0c3 100644
--- a/org/postgresql/core/v2/ConnectionFactoryImpl.java
+++ b/org/postgresql/core/v2/ConnectionFactoryImpl.java
@@ -78,16 +78,22 @@ public class ConnectionFactoryImpl extends ConnectionFactory {
//
// Establish a connection.
//
-
+ int connectTimeout = 0;
+ String connectTimeoutProperty = info.getProperty("connectTimeout", "0");
+ try {
+ connectTimeout = Integer.parseInt(connectTimeoutProperty) * 1000;
+ } catch (NumberFormatException nfe) {
+ logger.info("Couldn't parse connectTimeout value:" + connectTimeoutProperty);
+ }
PGStream newStream = null;
try
{
- newStream = new PGStream(hostSpec);
+ newStream = new PGStream(hostSpec, connectTimeout);
// Construct and send an ssl startup packet if requested.
if (trySSL)
- newStream = enableSSL(newStream, requireSSL, info, logger);
+ newStream = enableSSL(newStream, requireSSL, info, logger, connectTimeout);
// Set the socket timeout if the "socketTimeout" property has been set.
@@ -112,7 +118,7 @@ public class ConnectionFactoryImpl extends ConnectionFactory {
doAuthentication(newStream, user, info.getProperty("password"), logger);
// Do final startup.
- ProtocolConnectionImpl protoConnection = new ProtocolConnectionImpl(newStream, user, database, logger);
+ ProtocolConnectionImpl protoConnection = new ProtocolConnectionImpl(newStream, user, database, logger, connectTimeout);
readStartupMessages(newStream, protoConnection, logger);
// Run some initial queries
@@ -175,7 +181,7 @@ public class ConnectionFactoryImpl extends ConnectionFactory {
throw new PSQLException (GT.tr("The connection url is invalid."), PSQLState.CONNECTION_UNABLE_TO_CONNECT);
}
- private PGStream enableSSL(PGStream pgStream, boolean requireSSL, Properties info, Logger logger) throws IOException, SQLException {
+ private PGStream enableSSL(PGStream pgStream, boolean requireSSL, Properties info, Logger logger, int connectTimeout) throws IOException, SQLException {
if (logger.logDebug())
logger.debug(" FE=> SSLRequest");
@@ -199,7 +205,7 @@ public class ConnectionFactoryImpl extends ConnectionFactory {
// We have to reconnect to continue.
pgStream.close();
- return new PGStream(pgStream.getHostSpec());
+ return new PGStream(pgStream.getHostSpec(), connectTimeout);
case 'N':
if (logger.logDebug())
diff --git a/org/postgresql/core/v2/ProtocolConnectionImpl.java b/org/postgresql/core/v2/ProtocolConnectionImpl.java
index a7d588f..677c48a 100644
--- a/org/postgresql/core/v2/ProtocolConnectionImpl.java
+++ b/org/postgresql/core/v2/ProtocolConnectionImpl.java
@@ -24,12 +24,13 @@ import org.postgresql.util.HostSpec;
* @author Oliver Jowett (oliver at opencloud.com)
*/
class ProtocolConnectionImpl implements ProtocolConnection {
- ProtocolConnectionImpl(PGStream pgStream, String user, String database, Logger logger) {
+ ProtocolConnectionImpl(PGStream pgStream, String user, String database, Logger logger, int connectTimeout) {
this.pgStream = pgStream;
this.user = user;
this.database = database;
this.logger = logger;
this.executor = new QueryExecutorImpl(this, pgStream, logger);
+ this.connectTimeout = connectTimeout;
}
public HostSpec getHostSpec() {
@@ -87,7 +88,7 @@ class ProtocolConnectionImpl implements ProtocolConnection {
if (logger.logDebug())
logger.debug(" FE=> CancelRequest(pid=" + cancelPid + ",ckey=" + cancelKey + ")");
- cancelStream = new PGStream(pgStream.getHostSpec());
+ cancelStream = new PGStream(pgStream.getHostSpec(), connectTimeout);
cancelStream.SendInteger4(16);
cancelStream.SendInteger2(1234);
cancelStream.SendInteger2(5678);
@@ -229,4 +230,6 @@ class ProtocolConnectionImpl implements ProtocolConnection {
private final String database;
private final QueryExecutorImpl executor;
private final Logger logger;
+
+ private final int connectTimeout;
}
diff --git a/org/postgresql/core/v3/ConnectionFactoryImpl.java b/org/postgresql/core/v3/ConnectionFactoryImpl.java
index 3c7d332..84a5380 100644
--- a/org/postgresql/core/v3/ConnectionFactoryImpl.java
+++ b/org/postgresql/core/v3/ConnectionFactoryImpl.java
@@ -95,14 +95,22 @@ public class ConnectionFactoryImpl extends ConnectionFactory {
// Establish a connection.
//
+ int connectTimeout = 0;
+ String connectTimeoutProperty = info.getProperty("connectTimeout", "0");
+ try {
+ connectTimeout = Integer.parseInt(connectTimeoutProperty) * 1000;
+ } catch (NumberFormatException nfe) {
+ logger.info("Couldn't parse connectTimeout value:" + connectTimeoutProperty);
+ }
+
PGStream newStream = null;
try
{
- newStream = new PGStream(hostSpec);
+ newStream = new PGStream(hostSpec, connectTimeout);
// Construct and send an ssl startup packet if requested.
if (trySSL)
- newStream = enableSSL(newStream, requireSSL, info, logger);
+ newStream = enableSSL(newStream, requireSSL, info, logger, connectTimeout);
// Set the socket timeout if the "socketTimeout" property has been set.
String socketTimeoutProperty = info.getProperty("socketTimeout", "0");
@@ -173,7 +181,7 @@ public class ConnectionFactoryImpl extends ConnectionFactory {
doAuthentication(newStream, hostSpec.getHost(), user, info, logger);
// Do final startup.
- ProtocolConnectionImpl protoConnection = new ProtocolConnectionImpl(newStream, user, database, info, logger);
+ ProtocolConnectionImpl protoConnection = new ProtocolConnectionImpl(newStream, user, database, info, logger, connectTimeout);
readStartupMessages(newStream, protoConnection, logger);
runInitialQueries(protoConnection, info, logger);
@@ -272,7 +280,7 @@ public class ConnectionFactoryImpl extends ConnectionFactory {
return start + tz.substring(4);
}
- private PGStream enableSSL(PGStream pgStream, boolean requireSSL, Properties info, Logger logger) throws IOException, SQLException {
+ private PGStream enableSSL(PGStream pgStream, boolean requireSSL, Properties info, Logger logger, int connectTimeout) throws IOException, SQLException {
if (logger.logDebug())
logger.debug(" FE=> SSLRequest");
@@ -296,7 +304,7 @@ public class ConnectionFactoryImpl extends ConnectionFactory {
// We have to reconnect to continue.
pgStream.close();
- return new PGStream(pgStream.getHostSpec());
+ return new PGStream(pgStream.getHostSpec(), connectTimeout);
case 'N':
if (logger.logDebug())
diff --git a/org/postgresql/core/v3/ProtocolConnectionImpl.java b/org/postgresql/core/v3/ProtocolConnectionImpl.java
index 92073e3..75e911e 100644
--- a/org/postgresql/core/v3/ProtocolConnectionImpl.java
+++ b/org/postgresql/core/v3/ProtocolConnectionImpl.java
@@ -27,7 +27,7 @@ import java.util.Properties;
* @author Oliver Jowett (oliver at opencloud.com)
*/
class ProtocolConnectionImpl implements ProtocolConnection {
- ProtocolConnectionImpl(PGStream pgStream, String user, String database, Properties info, Logger logger) {
+ ProtocolConnectionImpl(PGStream pgStream, String user, String database, Properties info, Logger logger, int connectTimeout) {
this.pgStream = pgStream;
this.user = user;
this.database = database;
@@ -35,6 +35,7 @@ class ProtocolConnectionImpl implements ProtocolConnection {
this.executor = new QueryExecutorImpl(this, pgStream, info, logger);
// default value for server versions that don't report standard_conforming_strings
this.standardConformingStrings = false;
+ this.connectTimeout = connectTimeout;
}
public HostSpec getHostSpec() {
@@ -89,7 +90,7 @@ class ProtocolConnectionImpl implements ProtocolConnection {
if (logger.logDebug())
logger.debug(" FE=> CancelRequest(pid=" + cancelPid + ",ckey=" + cancelKey + ")");
- cancelStream = new PGStream(pgStream.getHostSpec());
+ cancelStream = new PGStream(pgStream.getHostSpec(), connectTimeout);
cancelStream.SendInteger4(16);
cancelStream.SendInteger2(1234);
cancelStream.SendInteger2(5678);
@@ -249,4 +250,6 @@ class ProtocolConnectionImpl implements ProtocolConnection {
private final String database;
private final QueryExecutorImpl executor;
private final Logger logger;
+
+ private final int connectTimeout;
}
diff --git a/org/postgresql/test/jdbc2/ConnectTimeoutTest.java b/org/postgresql/test/jdbc2/ConnectTimeoutTest.java
new file mode 100644
index 0000000..71e0f34
--- /dev/null
+++ b/org/postgresql/test/jdbc2/ConnectTimeoutTest.java
@@ -0,0 +1,45 @@
+package org.postgresql.test.jdbc2;
+
+import junit.framework.Assert;
+import junit.framework.TestCase;
+import org.postgresql.test.TestUtil;
+
+import java.net.SocketTimeoutException;
+import java.sql.DriverManager;
+import java.sql.SQLException;
+import java.util.Properties;
+
+public class ConnectTimeoutTest extends TestCase {
+ private static final String UNREACHABLE_HOST = "1.0.0.0";
+ private static final String UNREACHABLE_URL = "jdbc:postgresql://" + UNREACHABLE_HOST + "/test";
+ private static final int CONNECT_TIMEOUT = 10;
+
+ @Override
+ protected void setUp() throws Exception {
+ super.setUp();
+ TestUtil.initDriver();
+ }
+
+ public void testTimeout() {
+ final Properties props = new Properties();
+ props.setProperty("user", "test");
+ props.setProperty("password", "test");
+ // with 0 (default value) it hangs for about 60 seconds (platform dependent)
+ props.setProperty("connectTimeout", Integer.toString(CONNECT_TIMEOUT));
+
+ final long startTime = System.currentTimeMillis();
+ try {
+ DriverManager.getConnection(UNREACHABLE_URL, props);
+ } catch (SQLException e) {
+ Assert.assertTrue("Unexpected " + e.toString(),
+ e.getCause() instanceof SocketTimeoutException);
+ final long interval = System.currentTimeMillis() - startTime;
+ final long connectTimeoutMillis = CONNECT_TIMEOUT * 1000;
+ final long maxDeviation = connectTimeoutMillis / 10;
+ // check that it was not a default system timeout, an approximate value is used
+ Assert.assertTrue(Math.abs(interval - connectTimeoutMillis) < maxDeviation);
+ return;
+ }
+ fail("SQLException expected");
+ }
+}
diff --git a/org/postgresql/test/jdbc2/Jdbc2TestSuite.java b/org/postgresql/test/jdbc2/Jdbc2TestSuite.java
index 732e498..cda45aa 100644
--- a/org/postgresql/test/jdbc2/Jdbc2TestSuite.java
+++ b/org/postgresql/test/jdbc2/Jdbc2TestSuite.java
@@ -92,7 +92,9 @@ public class Jdbc2TestSuite extends TestSuite
suite.addTestSuite(LoginTimeoutTest.class);
suite.addTestSuite(TestACL.class);
-
+
+ suite.addTestSuite(ConnectTimeoutTest.class);
+
Connection conn = TestUtil.openDB();
if (TestUtil.isProtocolVersion(conn, 3)) {
suite.addTestSuite(CopyTest.class);
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-java/libpostgresql-jdbc-java.git
More information about the pkg-java-commits
mailing list