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 14:27:22 UTC

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

Author: reschke
Date: Wed May 13 12:27:22 2015
New Revision: 1679191

URL: http://svn.apache.org/r1679191
Log:
OAK-2856 - improved DB diagnostics on startup

Modified:
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBDocumentStore.java
    jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/BasicDocumentStoreTest.java

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBDocumentStore.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBDocumentStore.java?rev=1679191&r1=1679190&r2=1679191&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBDocumentStore.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBDocumentStore.java Wed May 13 12:27:22 2015
@@ -407,6 +407,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") {
@@ -414,7 +438,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
@@ -434,6 +486,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") {
@@ -463,6 +536,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") {
@@ -503,6 +598,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();
+            }
         };
 
         /**
@@ -583,6 +701,10 @@ public class RDBDocumentStore implements
                     + 1024 * 1024 * 1024 + "))";
         }
 
+        public String getAdditionalDiagnostics(RDBConnectionHandler ch, String tableName) {
+            return "";
+        }
+
         protected String description;
 
         private DB(String description) {
@@ -718,8 +840,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/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/BasicDocumentStoreTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/BasicDocumentStoreTest.java?rev=1679191&r1=1679190&r2=1679191&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/BasicDocumentStoreTest.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/BasicDocumentStoreTest.java Wed May 13 12:27:22 2015
@@ -712,6 +712,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 {
@@ -888,7 +890,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");