You are viewing a plain text version of this content. The canonical link for it is here.
Posted to oak-commits@jackrabbit.apache.org by re...@apache.org on 2016/07/13 18:44:13 UTC
svn commit: r1752508 - in
/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/rdb:
RDBDataSourceWrapper.java RDBDocumentStoreJDBCTest.java
RDBPreparedStatementWrapper.java RDBResultSetWrapper.java
Author: reschke
Date: Wed Jul 13 18:44:13 2016
New Revision: 1752508
URL: http://svn.apache.org/viewvc?rev=1752508&view=rev
Log:
OAK-4557: RDBPreparedStatementWrapper - do not implicitly close ResultSet when wrapped Statement doesn't; also add a test case to check the DataSource's behavior
Modified:
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBDataSourceWrapper.java
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBDocumentStoreJDBCTest.java
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBPreparedStatementWrapper.java
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBResultSetWrapper.java
Modified: jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBDataSourceWrapper.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBDataSourceWrapper.java?rev=1752508&r1=1752507&r2=1752508&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBDataSourceWrapper.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBDataSourceWrapper.java Wed Jul 13 18:44:13 2016
@@ -154,4 +154,9 @@ public class RDBDataSourceWrapper implem
((Closeable) ds).close();
}
}
+
+ @Override
+ public String toString() {
+ return this.getClass().getName() + " wrapping a " + this.ds.toString();
+ }
}
Modified: jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBDocumentStoreJDBCTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBDocumentStoreJDBCTest.java?rev=1752508&r1=1752507&r2=1752508&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBDocumentStoreJDBCTest.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBDocumentStoreJDBCTest.java Wed Jul 13 18:44:13 2016
@@ -44,6 +44,8 @@ import org.apache.jackrabbit.oak.plugins
import org.apache.jackrabbit.oak.plugins.document.UpdateOp;
import org.apache.jackrabbit.oak.plugins.document.rdb.RDBDocumentStore.RDBTableMetaData;
import org.junit.Test;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
/**
* Tests checking certain JDBC related features.
@@ -52,6 +54,7 @@ public class RDBDocumentStoreJDBCTest ex
private RDBDocumentStoreJDBC jdbc;
private RDBDocumentStoreDB dbInfo;
+ private static final Logger LOG = LoggerFactory.getLogger(RDBDocumentStoreJDBCTest.class);
public RDBDocumentStoreJDBCTest(DocumentStoreFixture dsf) {
super(dsf);
@@ -241,6 +244,27 @@ public class RDBDocumentStoreJDBCTest ex
} finally {
con.close();
}
+ }
+
+ @Test
+ public void statementCloseTest() throws SQLException {
+
+ // for now we just log the behavior, see https://bz.apache.org/bugzilla/show_bug.cgi?id=59850
+
+ String table = ((RDBDocumentStore) super.ds).getTable(Collection.NODES).getName();
+
+ Connection con = super.rdbDataSource.getConnection();
+ con.setReadOnly(true);
+ try {
+ PreparedStatement st = con.prepareStatement("SELECT id from " + table + " WHERE id = ?");
+ setIdInStatement(st, 1, "key-1");
+ ResultSet rs = st.executeQuery();
+ st.close();
+ LOG.info(super.rdbDataSource + " on " + super.dsname + " - statement.close() closes ResultSet: " + rs.isClosed());
+ con.commit();
+ } finally {
+ con.close();
+ }
}
private static boolean isSuccess(int result) {
Modified: jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBPreparedStatementWrapper.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBPreparedStatementWrapper.java?rev=1752508&r1=1752507&r2=1752508&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBPreparedStatementWrapper.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBPreparedStatementWrapper.java Wed Jul 13 18:44:13 2016
@@ -44,12 +44,16 @@ import java.util.Arrays;
import java.util.Calendar;
import java.util.List;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
public class RDBPreparedStatementWrapper implements PreparedStatement {
private final RDBDataSourceWrapper datasource;
private final PreparedStatement statement;
private ResultSet resultSet = null;
private List<Object> parameters = new ArrayList<Object>();
+ private static final Logger LOG = LoggerFactory.getLogger(RDBPreparedStatementWrapper.class);
public RDBPreparedStatementWrapper(RDBDataSourceWrapper datasource, PreparedStatement statement) {
this.datasource = datasource;
@@ -88,10 +92,16 @@ public class RDBPreparedStatementWrapper
}
public void close() throws SQLException {
- if (resultSet != null) {
- resultSet.close();
- }
statement.close();
+ if (resultSet instanceof RDBResultSetWrapper) {
+ if (resultSet.isClosed()) {
+ ((RDBResultSetWrapper) resultSet).dumpResult(null);
+ } else {
+ ((RDBResultSetWrapper) resultSet).dumpResult("(not closed!)");
+ LOG.error("Wrapped statement " + statement + " failed to close associated ResultSet; call stack:",
+ new Exception("call stack"));
+ }
+ }
}
// needed in Java 7...
Modified: jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBResultSetWrapper.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBResultSetWrapper.java?rev=1752508&r1=1752507&r2=1752508&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBResultSetWrapper.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBResultSetWrapper.java Wed Jul 13 18:44:13 2016
@@ -46,6 +46,7 @@ public class RDBResultSetWrapper impleme
private final ResultSet resultSet;
private final long rsstart;
int results = 0;
+ boolean wasDumped = false;
public RDBResultSetWrapper(RDBDataSourceWrapper datasource, ResultSet resultSet) {
this.datasource = datasource;
@@ -74,22 +75,30 @@ public class RDBResultSetWrapper impleme
}
public void close() throws SQLException {
- long start = System.nanoTime();
- SQLException x = null;
+ String info = null;
try {
resultSet.close();
} catch (SQLException ex) {
- x = ex;
+ info = ex.getMessage();
throw ex;
} finally {
+ dumpResult(info);
+ }
+ }
+
+ protected void dumpResult(String info) throws SQLException {
+ if (!wasDumped) {
+ long start = System.nanoTime();
List<RDBLogEntry> l = datasource.getLog();
if (l != null) {
String message = results + " results; resultSet.close() after " + ((start - rsstart) / 1000) + "us";
- if (x != null) {
- message += " " + x.getMessage();
+ if (info != null) {
+ message += " " + info;
}
l.add(new RDBLogEntry(start, message));
}
+
+ wasDumped = true;
}
}