Skip to content

Commit

Permalink
[CONJ-682] internal pool correction: when receiving an RST during
Browse files Browse the repository at this point in the history
connection validation, the pool will end up throwing connection timeout
exception in place of reusing another connection.
  • Loading branch information
rusher committed Mar 5, 2019
1 parent beb1121 commit b7a9932
Show file tree
Hide file tree
Showing 5 changed files with 44 additions and 38 deletions.
6 changes: 3 additions & 3 deletions pom.xml
Expand Up @@ -58,7 +58,7 @@
<artifactId>mariadb-java-client</artifactId>
<packaging>jar</packaging>
<name>mariadb-java-client</name>
<version>2.4.0</version>
<version>2.4.1-SNAPSHOT</version>
<description>JDBC driver for MariaDB and MySQL</description>
<url>https://mariadb.com/kb/en/mariadb/about-mariadb-connector-j/</url>

Expand All @@ -71,8 +71,8 @@
<checkstyle.plugin.version>2.17</checkstyle.plugin.version>
<driver.version.major>2</driver.version.major>
<driver.version.minor>4</driver.version.minor>
<driver.version.patch>0</driver.version.patch>
<driver.version.qualifier></driver.version.qualifier>
<driver.version.patch>1</driver.version.patch>
<driver.version.qualifier>-SNAPSHOT</driver.version.qualifier>
</properties>

<licenses>
Expand Down
Expand Up @@ -53,9 +53,9 @@
package org.mariadb.jdbc.internal.util.constant;

public final class Version {
public static final String version = "2.4.0";
public static final String version = "2.4.1-SNAPSHOT";
public static final int majorVersion = 2;
public static final int minorVersion = 4;
public static final int patchVersion = 0;
public static final String qualifier = "";
public static final int patchVersion = 1;
public static final String qualifier = "-SNAPSHOT";
}
66 changes: 36 additions & 30 deletions src/main/java/org/mariadb/jdbc/internal/util/pool/Pool.java
Expand Up @@ -257,46 +257,50 @@ private MariaDbPooledConnection getIdleConnection() throws InterruptedException
private MariaDbPooledConnection getIdleConnection(long timeout, TimeUnit timeUnit)
throws InterruptedException {

MariaDbPooledConnection item =
(timeout == 0) ? idleConnections.pollFirst() : idleConnections.pollFirst(timeout, timeUnit);
while (true) {
MariaDbPooledConnection item =
(timeout == 0) ? idleConnections.pollFirst() : idleConnections.pollFirst(timeout, timeUnit);

if (item != null) {
MariaDbConnection connection = item.getConnection();
try {
if (TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - item.getLastUsed().get())
> options.poolValidMinDelay) {
if (item != null) {
MariaDbConnection connection = item.getConnection();
try {
if (TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - item.getLastUsed().get())
> options.poolValidMinDelay) {

//validate connection
if (connection.isValid(10)) { //10 seconds timeout
item.lastUsedToNow();
return item;
}

} else {

//validate connection
if (connection.isValid(10)) { //10 seconds timeout
// connection has been retrieved recently -> skip connection validation
item.lastUsedToNow();
return item;

}

} else {
} catch (SQLException sqle) {
//eat
}

// connection has been retrieved recently -> skip connection validation
item.lastUsedToNow();
return item;
totalConnection.decrementAndGet();

// validation failed
silentAbortConnection(item);
addConnectionRequest();
if (logger.isDebugEnabled()) {
logger.debug(
"pool {} connection removed from pool due to failed validation (total:{}, active:{}, pending:{})",
poolTag, totalConnection.get(), getActiveConnections(), pendingRequestNumber.get());
}

} catch (SQLException sqle) {
//eat
continue;
}

totalConnection.decrementAndGet();
return null;

// validation failed
silentAbortConnection(item);

if (logger.isDebugEnabled()) {
logger.debug(
"pool {} connection removed from pool due to failed validation (total:{}, active:{}, pending:{})",
poolTag, totalConnection.get(), getActiveConnections(), pendingRequestNumber.get());
}
}

return null;
}

private void silentCloseConnection(MariaDbPooledConnection item) {
Expand Down Expand Up @@ -351,10 +355,12 @@ public void connectionClosed(ConnectionEvent event) {
public void connectionErrorOccurred(ConnectionEvent event) {

MariaDbPooledConnection item = ((MariaDbPooledConnection) event.getSource());
totalConnection.decrementAndGet();
if (idleConnections.remove(item))
totalConnection.decrementAndGet();
silentCloseConnection(item);
logger.debug("connection removed from pool {} due to having throw a Connection exception",
poolTag);
addConnectionRequest();
logger.debug("connection {} removed from pool {} due to having throw a Connection exception (total:{}, active:{}, pending:{})",
item.getConnection().getServerThreadId(), poolTag, totalConnection.get(), getActiveConnections(), pendingRequestNumber.get());

}

Expand Down
2 changes: 1 addition & 1 deletion src/test/java/org/mariadb/jdbc/ConnectionTest.java
Expand Up @@ -798,7 +798,7 @@ public void testWarnings() throws SQLException {
Statement stmt = sharedConnection.createStatement();
stmt.executeQuery("select now() = 1");
SQLWarning warning = sharedConnection.getWarnings();
assertTrue(warning.getMessage().contains("Incorrect datetime value: '1'"));
assertTrue(warning.getMessage().contains("ncorrect datetime value: '1'"));
sharedConnection.clearWarnings();
assertNull(sharedConnection.getWarnings());
}
Expand Down
2 changes: 1 addition & 1 deletion src/test/resources/logback-test.xml
Expand Up @@ -60,7 +60,7 @@
</encoder>
</appender>

<logger additivity="false" level="trace" name="org.mariadb.jdbc">
<logger additivity="false" level="debug" name="org.mariadb.jdbc">
<appender-ref ref="STDOUT"/>
</logger>

Expand Down

0 comments on commit b7a9932

Please sign in to comment.