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 2015/05/13 16:32:19 UTC

svn commit: r1679219 - in /jackrabbit/oak/branches/1.2: ./ oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBDocumentStore.java oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/BasicDocumentStoreTest.java

Author: reschke
Date: Wed May 13 14:32:18 2015
New Revision: 1679219

URL: http://svn.apache.org/r1679219
Log:
OAK-2856 - improved DB diagnostics on startup (ported to 1.2)

Modified:
    jackrabbit/oak/branches/1.2/   (props changed)
    jackrabbit/oak/branches/1.2/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBDocumentStore.java
    jackrabbit/oak/branches/1.2/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/BasicDocumentStoreTest.java

Propchange: jackrabbit/oak/branches/1.2/
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Wed May 13 14:32:18 2015
@@ -1,3 +1,3 @@
 /jackrabbit/oak/branches/1.0:1665962
-/jackrabbit/oak/trunk:1672350,1672468,1672537,1672603,1672642,1672644,1672834-1672835,1673351,1673410,1673414,1673436,1673644,1673662-1673664,1673669,1673695,1674046,1674065,1674075,1674107,1674228,1674880,1675055,1675332,1675354,1675357,1675593,1676198,1676237,1676407,1676458,1676539,1676670,1676725,1677939,1678173,1678758,1678938,1679165
+/jackrabbit/oak/trunk:1672350,1672468,1672537,1672603,1672642,1672644,1672834-1672835,1673351,1673410,1673414,1673436,1673644,1673662-1673664,1673669,1673695,1674046,1674065,1674075,1674107,1674228,1674880,1675055,1675332,1675354,1675357,1675593,1676198,1676237,1676407,1676458,1676539,1676670,1676725,1677939,1678173,1678758,1678938,1679165,1679191
 /jackrabbit/trunk:1345480

Modified: jackrabbit/oak/branches/1.2/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBDocumentStore.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.2/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBDocumentStore.java?rev=1679219&r1=1679218&r2=1679219&view=diff
==============================================================================
--- jackrabbit/oak/branches/1.2/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBDocumentStore.java (original)
+++ jackrabbit/oak/branches/1.2/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBDocumentStore.java Wed May 13 14:32:18 2015
@@ -393,6 +393,30 @@ public class RDBDocumentStore implements
             public String getTableCreationStatement(String tableName) {
                 return ("create table " + tableName + " (ID varchar(512) not null primary key, MODIFIED bigint, HASBINARY smallint, DELETEDONCE smallint, MODCOUNT bigint, CMODCOUNT bigint, DSIZE bigint, DATA varchar(16384), BDATA bytea)");
             }
+
+            @Override
+            public String getAdditionalDiagnostics(RDBConnectionHandler ch, String tableName) {
+                Connection con = null;
+                Map<String, String> result = new HashMap<String, String>();
+                try {
+                    con = ch.getROConnection();
+                    String cat = con.getCatalog();
+                    PreparedStatement stmt = con.prepareStatement("SELECT pg_encoding_to_char(encoding), datcollate FROM pg_database WHERE datname=?");
+                    stmt.setString(1, cat);
+                    ResultSet rs = stmt.executeQuery();
+                    while (rs.next()) {
+                        result.put("pg_encoding_to_char(encoding)", rs.getString(1));
+                        result.put("datcollate", rs.getString(2));
+                    }
+                    stmt.close();
+                    con.commit();
+                } catch (SQLException ex) {
+                    LOG.debug("while getting diagnostics", ex);
+                } finally {
+                    ch.closeConnection(con);
+                }
+                return result.toString();
+            }
         },
 
         DB2("DB2") {
@@ -400,7 +424,35 @@ public class RDBDocumentStore implements
             public void checkVersion(DatabaseMetaData md) throws SQLException {
                 versionCheck(md, 10, 5, description);
             }
-        },
+
+            @Override
+            public String getAdditionalDiagnostics(RDBConnectionHandler ch, String tableName) {
+                Connection con = null;
+                Map<String, String> result = new HashMap<String, String>();
+                try {
+                    con = ch.getROConnection();
+                    // we can't look up by schema as con.getSchema is JDK 1.7
+                    PreparedStatement stmt = con.prepareStatement("SELECT CODEPAGE, COLLATIONSCHEMA, COLLATIONNAME, TABSCHEMA FROM SYSCAT.COLUMNS WHERE COLNAME=? and COLNO=0 AND UPPER(TABNAME)=UPPER(?)");
+                    stmt.setString(1, "ID");
+                    stmt.setString(2, tableName);
+                    ResultSet rs = stmt.executeQuery();
+                    while (rs.next() && result.size() < 20) {
+                        // thus including the schema name here
+                        String schema = rs.getString("TABSCHEMA").trim();
+                        result.put(schema + ".CODEPAGE", rs.getString("CODEPAGE").trim());
+                        result.put(schema + ".COLLATIONSCHEMA", rs.getString("COLLATIONSCHEMA").trim());
+                        result.put(schema + ".COLLATIONNAME", rs.getString("COLLATIONNAME").trim());
+                    }
+                    stmt.close();
+                    con.commit();
+                } catch (SQLException ex) {
+                    LOG.debug("while getting diagnostics", ex);
+                } finally {
+                    ch.closeConnection(con);
+                }
+                return result.toString();
+            }
+},
 
         ORACLE("Oracle") {
             @Override
@@ -420,6 +472,27 @@ public class RDBDocumentStore implements
                 // see https://issues.apache.org/jira/browse/OAK-1914
                 return ("create table " + tableName + " (ID varchar(512) not null primary key, MODIFIED number, HASBINARY number, DELETEDONCE number, MODCOUNT number, CMODCOUNT number, DSIZE number, DATA varchar(4000), BDATA blob)");
             }
+
+            @Override
+            public String getAdditionalDiagnostics(RDBConnectionHandler ch, String tableName) {
+                Connection con = null;
+                Map<String, String> result = new HashMap<String, String>();
+                try {
+                    con = ch.getROConnection();
+                    Statement stmt = con.createStatement();
+                    ResultSet rs = stmt.executeQuery("SELECT PARAMETER, VALUE from NLS_DATABASE_PARAMETERS WHERE PARAMETER IN ('NLS_COMP', 'NLS_CHARACTERSET')");
+                    while (rs.next()) {
+                        result.put(rs.getString(1), rs.getString(2));
+                    }
+                    stmt.close();
+                    con.commit();
+                } catch (SQLException ex) {
+                    LOG.debug("while getting diagnostics", ex);
+                } finally {
+                    ch.closeConnection(con);
+                }
+                return result.toString();
+            }
         },
 
         MYSQL("MySQL") {
@@ -449,6 +522,28 @@ public class RDBDocumentStore implements
             public String getConcatQueryString(int dataOctetLimit, int dataLength) {
                 return "CONCAT(DATA, ?)";
             }
+
+            @Override
+            public String getAdditionalDiagnostics(RDBConnectionHandler ch, String tableName) {
+                Connection con = null;
+                Map<String, String> result = new HashMap<String, String>();
+                try {
+                    con = ch.getROConnection();
+                    PreparedStatement stmt = con.prepareStatement("SHOW TABLE STATUS LIKE ?");
+                    stmt.setString(1, tableName);
+                    ResultSet rs = stmt.executeQuery();
+                    while (rs.next()) {
+                        result.put("collation", rs.getString("Collation"));
+                    }
+                    stmt.close();
+                    con.commit();
+                } catch (SQLException ex) {
+                    LOG.debug("while getting diagnostics", ex);
+                } finally {
+                    ch.closeConnection(con);
+                }
+                return result.toString();
+            }
         },
 
         MSSQL("Microsoft SQL Server") {
@@ -489,6 +584,29 @@ public class RDBDocumentStore implements
             public String getGreatestQueryString(String column) {
                 return "(select MAX(mod) from (VALUES (" + column + "), (?)) AS ALLMOD(mod))";
             }
+
+            @Override
+            public String getAdditionalDiagnostics(RDBConnectionHandler ch, String tableName) {
+                Connection con = null;
+                Map<String, String> result = new HashMap<String, String>();
+                try {
+                    con = ch.getROConnection();
+                    String cat = con.getCatalog();
+                    PreparedStatement stmt = con.prepareStatement("SELECT collation_name FROM sys.databases WHERE name=?");
+                    stmt.setString(1, cat);
+                    ResultSet rs = stmt.executeQuery();
+                    while (rs.next()) {
+                        result.put("collation_name", rs.getString(1));
+                    }
+                    stmt.close();
+                    con.commit();
+                } catch (SQLException ex) {
+                    LOG.debug("while getting diagnostics", ex);
+                } finally {
+                    ch.closeConnection(con);
+                }
+                return result.toString();
+            }
         };
 
         /**
@@ -569,6 +687,10 @@ public class RDBDocumentStore implements
                     + 1024 * 1024 * 1024 + "))";
         }
 
+        public String getAdditionalDiagnostics(RDBConnectionHandler ch, String tableName) {
+            return "";
+        }
+
         protected String description;
 
         private DB(String description) {
@@ -704,8 +826,10 @@ public class RDBDocumentStore implements
             tablesToBeDropped.addAll(tablesCreated);
         }
 
+        String diag = db.getAdditionalDiagnostics(this.ch, this.tnNodes);
+
         LOG.info("RDBDocumentStore instantiated for database " + dbDesc + ", using driver: " + driverDesc + ", connecting to: "
-                + dbUrl);
+                + dbUrl + (diag.isEmpty() ? "" : (", properties: " + diag)));
         if (!tablesPresent.isEmpty()) {
             LOG.info("Tables present upon startup: " + tablesPresent);
         }

Modified: jackrabbit/oak/branches/1.2/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/BasicDocumentStoreTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.2/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/BasicDocumentStoreTest.java?rev=1679219&r1=1679218&r2=1679219&view=diff
==============================================================================
--- jackrabbit/oak/branches/1.2/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/BasicDocumentStoreTest.java (original)
+++ jackrabbit/oak/branches/1.2/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/BasicDocumentStoreTest.java Wed May 13 14:32:18 2015
@@ -708,6 +708,8 @@ public class BasicDocumentStoreTest exte
             try {
                 connection = super.rdbDataSource.getConnection();
                 connection.setAutoCommit(false);
+                // we use the same pool as the document store, and the connection might have been returned in read-only mode
+                connection.setReadOnly(false);
                 PreparedStatement stmt = connection.prepareStatement("insert into " + table
                         + " (ID, MODCOUNT, DATA) values (?, ?, ?)");
                 try {
@@ -884,7 +886,7 @@ public class BasicDocumentStoreTest exte
                     try {
                         setIdInStatement(stmt, 1, key);
                         ResultSet rs = stmt.executeQuery();
-                        assertTrue(rs.next());
+                        assertTrue("test record " + key + " not found in " + super.dsname, rs.next());
                         String got = rs.getString(1);
                         long modc = rs.getLong(2);
                         LOG.info("column reset " + modc + " times");