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;
         }
     }