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