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 2014/10/16 13:22:50 UTC

svn commit: r1632274 - /jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBDocumentStore.java

Author: reschke
Date: Thu Oct 16 11:22:50 2014
New Revision: 1632274

URL: http://svn.apache.org/r1632274
Log:
OAK-1941 - implement batched append update for update operations that do not require checking the current document state - improve _modified MAX handling

Modified:
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBDocumentStore.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=1632274&r1=1632273&r2=1632274&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 Thu Oct 16 11:22:50 2014
@@ -1255,13 +1255,14 @@ public class RDBDocumentStore implements
 
     private boolean dbAppendingUpdate(Connection connection, String tableName, String id, Long modified, Boolean hasBinary, Long modcount, Long cmodcount, Long oldmodcount,
             String appendData) throws SQLException {
-        String t = "update " + tableName + " set MODIFIED = ?, HASBINARY = ?, MODCOUNT = ?, CMODCOUNT = ?, DSIZE = DSIZE + ?, ";
-        t += (this.needsConcat ? "DATA = CONCAT(DATA, ?) " : "DATA = DATA || ? ");
-        t += "where ID = ?";
+        StringBuilder t = new StringBuilder();
+        t.append("update " + tableName + " set MODIFIED = GREATEST(MODIFIED, ?), HASBINARY = ?, MODCOUNT = ?, CMODCOUNT = ?, DSIZE = DSIZE + ?, ");
+        t.append(this.needsConcat ? "DATA = CONCAT(DATA, ?) " : "DATA = DATA || ? ");
+        t.append("where ID = ?");
         if (oldmodcount != null) {
-            t += " and MODCOUNT = ?";
+            t.append(" and MODCOUNT = ?");
         }
-        PreparedStatement stmt = connection.prepareStatement(t);
+        PreparedStatement stmt = connection.prepareStatement(t.toString());
         try {
             int si = 1;
             stmt.setObject(si++, modified, Types.BIGINT);
@@ -1287,7 +1288,7 @@ public class RDBDocumentStore implements
 
     private boolean dbBatchedAppendingUpdate(Connection connection, String tableName, List<String> ids, Long modified, String appendData) throws SQLException {
         StringBuilder t = new StringBuilder();
-        t.append("update " + tableName + " set MODIFIED = ?, MODCOUNT = MODCOUNT + 1, DSIZE = DSIZE + ?, ");
+        t.append("update " + tableName + " set MODIFIED = GREATEST(MODIFIED, ?), MODCOUNT = MODCOUNT + 1, DSIZE = DSIZE + ?, ");
         t.append(this.needsConcat ? "DATA = CONCAT(DATA, ?)" : "DATA = DATA || ? ");
         t.append("where ID in (");
         for (int i = 0; i < ids.size(); i++) {
@@ -1296,7 +1297,7 @@ public class RDBDocumentStore implements
             }
             t.append('?');
         }
-        t.append(") and MODIFIED <= ?");
+        t.append(")");
         PreparedStatement stmt = connection.prepareStatement(t.toString());
         try {
             int si = 1;
@@ -1306,10 +1307,9 @@ public class RDBDocumentStore implements
             for (String id : ids) {
                 stmt.setString(si++, id);
             }
-            stmt.setObject(si++, modified, Types.BIGINT);
             int result = stmt.executeUpdate();
             if (result != ids.size()) {
-                LOG.debug("DB update failed for " + tableName + "/" + ids);
+                LOG.debug("DB update failed: only " + result + " of " + ids.size() + " updated. Table: " + tableName + ", IDs:" + ids);
             }
             return result == ids.size();
         }