Author: reschke
Date: Tue Jun 16 14:03:21 2015
New Revision: 1685840
URL: http://svn.apache.org/r1685840
Log:
OAK-2995: RDB*Store: check transaction isolation level
Modified:
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBBlobStore.java
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBDocumentStore.java
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBJDBCTools.java
Modified:
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBBlobStore.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBBlobStore.java?rev=1685840&r1=1685839&r2=1685840&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBBlobStore.java
(original)
+++
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBBlobStore.java
Tue Jun 16 14:03:21 2015
@@ -275,6 +275,16 @@ public class RDBBlobStore extends Cachin
this.ch = new RDBConnectionHandler(ds);
Connection con = this.ch.getRWConnection();
+
+ int isolation = con.getTransactionIsolation();
+ String isolationDiags = RDBJDBCTools.isolationLevelToString(isolation);
+ if (isolation != Connection.TRANSACTION_READ_COMMITTED) {
+ LOG.info("Detected transaction isolation level " + isolationDiags
+ " is "
+ + (isolation < Connection.TRANSACTION_READ_COMMITTED ?
"lower" : "higher") + " than expected "
+ +
RDBJDBCTools.isolationLevelToString(Connection.TRANSACTION_READ_COMMITTED)
+ + " - check datasource configuration");
+ }
+
DatabaseMetaData md = con.getMetaData();
String dbDesc = String.format("%s %s (%d.%d)",
md.getDatabaseProductName(), md.getDatabaseProductVersion(),
md.getDatabaseMajorVersion(), md.getDatabaseMinorVersion());
@@ -330,7 +340,7 @@ public class RDBBlobStore extends Cachin
}
LOG.info("RDBBlobStore instantiated for database " + dbDesc + ",
using driver: " + driverDesc + ", connecting to: "
- + dbUrl);
+ + dbUrl + ", transaction isolation level: " +
isolationDiags);
if (!tablesPresent.isEmpty()) {
LOG.info("Tables present upon startup: " + tablesPresent);
}
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=1685840&r1=1685839&r2=1685840&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
Tue Jun 16 14:03:21 2015
@@ -822,6 +822,16 @@ public class RDBDocumentStore implements
this.cacheStats = new CacheStats(nodesCache, "Document-Documents",
builder.getWeigher(), builder.getDocumentCacheSize());
Connection con = this.ch.getRWConnection();
+
+ int isolation = con.getTransactionIsolation();
+ String isolationDiags = RDBJDBCTools.isolationLevelToString(isolation);
+ if (isolation != Connection.TRANSACTION_READ_COMMITTED) {
+ LOG.info("Detected transaction isolation level " + isolationDiags
+ " is "
+ + (isolation < Connection.TRANSACTION_READ_COMMITTED ?
"lower" : "higher") + " than expected "
+ +
RDBJDBCTools.isolationLevelToString(Connection.TRANSACTION_READ_COMMITTED)
+ + " - check datasource configuration");
+ }
+
DatabaseMetaData md = con.getMetaData();
String dbDesc = String.format("%s %s (%d.%d)",
md.getDatabaseProductName(), md.getDatabaseProductVersion(),
md.getDatabaseMajorVersion(), md.getDatabaseMinorVersion());
@@ -869,7 +879,7 @@ public class RDBDocumentStore implements
String diag = db.getAdditionalDiagnostics(this.ch, this.tnNodes);
LOG.info("RDBDocumentStore instantiated for database " + dbDesc + ",
using driver: " + driverDesc + ", connecting to: "
- + dbUrl + (diag.isEmpty() ? "" : (", properties: " + diag)));
+ + dbUrl + (diag.isEmpty() ? "" : (", properties: " + diag)) +
", transaction isolation level: " + isolationDiags);
if (!tablesPresent.isEmpty()) {
LOG.info("Tables present upon startup: " + tablesPresent);
}
Modified:
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBJDBCTools.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBJDBCTools.java?rev=1685840&r1=1685839&r2=1685840&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBJDBCTools.java
(original)
+++
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBJDBCTools.java
Tue Jun 16 14:03:21 2015
@@ -16,10 +16,15 @@
*/
package org.apache.jackrabbit.oak.plugins.document.rdb;
+import java.sql.Connection;
import java.util.Locale;
+import java.util.Map;
import javax.annotation.Nonnull;
+/**
+ * Convenience methods dealing with JDBC specifics.
+ */
public class RDBJDBCTools {
protected static String jdbctype(String jdbcurl) {
@@ -86,4 +91,32 @@ public class RDBJDBCTools {
}
return p + b;
}
+
+ /**
+ * Return string representation of transaction isolation level.
+ */
+ protected static @Nonnull String isolationLevelToString(int
isolationLevel) {
+ String name;
+ switch (isolationLevel) {
+ case Connection.TRANSACTION_NONE:
+ name = "TRANSACTION_NONE";
+ break;
+ case Connection.TRANSACTION_READ_COMMITTED:
+ name = "TRANSACTION_READ_COMMITTED";
+ break;
+ case Connection.TRANSACTION_READ_UNCOMMITTED:
+ name = "TRANSACTION_READ_UNCOMMITTED";
+ break;
+ case Connection.TRANSACTION_REPEATABLE_READ:
+ name = "TRANSACTION_REPEATABLE_READ";
+ break;
+ case Connection.TRANSACTION_SERIALIZABLE:
+ name = "TRANSACTION_SERIALIZABLE";
+ break;
+ default:
+ name = "unknown";
+ break;
+ }
+ return String.format("%s (%d)", name, isolationLevel);
+ }
}