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/14 05:46:27 UTC

svn commit: r1752584 - in /jackrabbit/oak/branches/1.4: ./ oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/rdb/

Author: reschke
Date: Thu Jul 14 05:46:27 2016
New Revision: 1752584

URL: http://svn.apache.org/viewvc?rev=1752584&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 (ported to 1.4)

Modified:
    jackrabbit/oak/branches/1.4/   (props changed)
    jackrabbit/oak/branches/1.4/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBDataSourceWrapper.java
    jackrabbit/oak/branches/1.4/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBDocumentStoreJDBCTest.java
    jackrabbit/oak/branches/1.4/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBPreparedStatementWrapper.java
    jackrabbit/oak/branches/1.4/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBResultSetWrapper.java

Propchange: jackrabbit/oak/branches/1.4/
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Thu Jul 14 05:46:27 2016
@@ -1,3 +1,3 @@
 /jackrabbit/oak/branches/1.0:1665962
-/jackrabbit/oak/trunk:1733615,1733875,1733913,1733929,1734230,1734254,1734279,1734941,1735052,1735405,1735484,1735549,1735564,1735588,1735622,1735638,1735919,1735983,1736176,1737309-1737310,1737334,1737349,1737998,1738004,1738775,1738795,1738833,1738950,1738957,1738963,1739894,1740116,1740625-1740626,1740971,1741032,1741339,1741343,1742520,1742888,1742916,1743097,1743172,1743343,1744265,1744959,1745038,1745197,1745368,1746086,1746117,1746342,1746345,1746696,1746981,1747341-1747342,1747492,1747512,1748505,1748553,1748722,1748870,1749275,1749350,1749464,1749475,1749645,1749662,1749815,1749872,1749875,1749899,1750076-1750077,1750287,1750457,1750465,1750495,1750626,1750809,1751410,1751478,1751755,1751871,1752273-1752274,1752438
+/jackrabbit/oak/trunk:1733615,1733875,1733913,1733929,1734230,1734254,1734279,1734941,1735052,1735405,1735484,1735549,1735564,1735588,1735622,1735638,1735919,1735983,1736176,1737309-1737310,1737334,1737349,1737998,1738004,1738775,1738795,1738833,1738950,1738957,1738963,1739894,1740116,1740625-1740626,1740971,1741032,1741339,1741343,1742520,1742888,1742916,1743097,1743172,1743343,1744265,1744959,1745038,1745197,1745368,1746086,1746117,1746342,1746345,1746696,1746981,1747341-1747342,1747492,1747512,1748505,1748553,1748722,1748870,1749275,1749350,1749464,1749475,1749645,1749662,1749815,1749872,1749875,1749899,1750076-1750077,1750287,1750457,1750465,1750495,1750626,1750809,1751410,1751478,1751755,1751871,1752273-1752274,1752438,1752508
 /jackrabbit/trunk:1345480

Modified: jackrabbit/oak/branches/1.4/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBDataSourceWrapper.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.4/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBDataSourceWrapper.java?rev=1752584&r1=1752583&r2=1752584&view=diff
==============================================================================
--- jackrabbit/oak/branches/1.4/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBDataSourceWrapper.java (original)
+++ jackrabbit/oak/branches/1.4/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBDataSourceWrapper.java Thu Jul 14 05:46:27 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/branches/1.4/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBDocumentStoreJDBCTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.4/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBDocumentStoreJDBCTest.java?rev=1752584&r1=1752583&r2=1752584&view=diff
==============================================================================
--- jackrabbit/oak/branches/1.4/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBDocumentStoreJDBCTest.java (original)
+++ jackrabbit/oak/branches/1.4/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBDocumentStoreJDBCTest.java Thu Jul 14 05:46:27 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/branches/1.4/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBPreparedStatementWrapper.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.4/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBPreparedStatementWrapper.java?rev=1752584&r1=1752583&r2=1752584&view=diff
==============================================================================
--- jackrabbit/oak/branches/1.4/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBPreparedStatementWrapper.java (original)
+++ jackrabbit/oak/branches/1.4/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBPreparedStatementWrapper.java Thu Jul 14 05:46:27 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/branches/1.4/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBResultSetWrapper.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.4/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBResultSetWrapper.java?rev=1752584&r1=1752583&r2=1752584&view=diff
==============================================================================
--- jackrabbit/oak/branches/1.4/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBResultSetWrapper.java (original)
+++ jackrabbit/oak/branches/1.4/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBResultSetWrapper.java Thu Jul 14 05:46:27 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;
         }
     }