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");