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 2017/04/18 04:09:53 UTC

svn commit: r1791736 - in /jackrabbit/oak/trunk/oak-core/src: main/java/org/apache/jackrabbit/oak/plugins/document/rdb/ test/java/org/apache/jackrabbit/oak/plugins/document/rdb/

Author: reschke
Date: Tue Apr 18 04:09:53 2017
New Revision: 1791736

URL: http://svn.apache.org/viewvc?rev=1791736&view=rev
Log:
OAK-6083: RDBDocumentStore: implement support for VersionGCSupport extensions added for incremental VGC

Modified:
    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/RDBDocumentStoreJDBC.java
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBVersionGCSupport.java
    jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBDocumentStoreJDBCTest.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=1791736&r1=1791735&r2=1791736&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 Apr 18 04:09:53 2017
@@ -1540,6 +1540,48 @@ public class RDBDocumentStore implements
         };
     }
 
+    protected <T extends Document> long queryCount(final Collection<T> collection, String fromKey, String toKey,
+            final List<String> excludeKeyPatterns, final List<QueryCondition> conditions) {
+
+        return internalGetAggregate(collection, "COUNT", "*", fromKey, toKey, excludeKeyPatterns, conditions);
+    }
+
+    protected <T extends Document> long getMinValue(final Collection<T> collection, String field, String fromKey, String toKey,
+            final List<String> excludeKeyPatterns, final List<QueryCondition> conditions) {
+
+        return internalGetAggregate(collection, "MIN", field, fromKey, toKey, excludeKeyPatterns, conditions);
+    }
+
+    private <T extends Document> long internalGetAggregate(final Collection<T> collection, final String aggregrate, String field,
+            String fromKey, String toKey, final List<String> excludeKeyPatterns, final List<QueryCondition> conditions) {
+
+        final RDBTableMetaData tmd = getTable(collection);
+        for (QueryCondition cond : conditions) {
+            if (!INDEXEDPROPERTIES.contains(cond.getPropertyName())) {
+                String message = "indexed property " + cond.getPropertyName() + " not supported, query was '" + cond.getOperator()
+                        + "'" + cond.getValue() + "'; supported properties are " + INDEXEDPROPERTIES;
+                LOG.info(message);
+                throw new DocumentStoreException(message);
+            }
+        }
+
+        final String from = collection == Collection.NODES && NodeDocument.MIN_ID_VALUE.equals(fromKey) ? null : fromKey;
+        final String to = collection == Collection.NODES && NodeDocument.MAX_ID_VALUE.equals(toKey) ? null : toKey;
+
+        Connection connection = null;
+        try {
+            connection = ch.getROConnection();
+            long result = db.getLong(connection, tmd, aggregrate, field, from, to, excludeKeyPatterns, conditions);
+            connection.commit();
+            return result;
+        } catch (SQLException ex) {
+            LOG.error("SQL exception on query", ex);
+            throw new DocumentStoreException(ex);
+        } finally {
+            this.ch.closeConnection(connection);
+        }
+    }
+
     @Nonnull
     protected <T extends Document> RDBTableMetaData getTable(Collection<T> collection) {
         RDBTableMetaData tmd = this.tableMeta.get(collection);

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBDocumentStoreJDBC.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBDocumentStoreJDBC.java?rev=1791736&r1=1791735&r2=1791736&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBDocumentStoreJDBC.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBDocumentStoreJDBC.java Tue Apr 18 04:09:53 2017
@@ -519,12 +519,13 @@ public class RDBDocumentStoreJDBC {
         return result;
     }
 
-    public long getLong(Connection connection, RDBTableMetaData tmd, String selector, String minId, String maxId,
+    public long getLong(Connection connection, RDBTableMetaData tmd, String aggregate, String field, String minId, String maxId,
             List<String> excludeKeyPatterns, List<QueryCondition> conditions) throws SQLException {
         PreparedStatement stmt = null;
         ResultSet rs = null;
         long start = System.currentTimeMillis();
         long result = -1;
+        String selector = aggregate + "(" + ("*".equals(field) ? "*" : INDEXED_PROP_MAPPING.get(field)) + ")";
         try {
             stmt = prepareQuery(connection, tmd, selector, minId, maxId, excludeKeyPatterns, conditions, Integer.MAX_VALUE, null);
             rs = stmt.executeQuery();
@@ -538,8 +539,8 @@ public class RDBDocumentStoreJDBC {
                 long elapsed = System.currentTimeMillis() - start;
                 String params = String.format("params minid '%s' maxid '%s' excludeKeyPatterns %s conditions %s.", minId, maxId,
                         excludeKeyPatterns, conditions);
-                LOG.debug("Aggregate query " + selector + " on " + tmd.getName() + " with " + params + " -> " + result + ", took " + elapsed
-                        + "ms");
+                LOG.debug("Aggregate query " + selector + " on " + tmd.getName() + " with " + params + " -> " + result + ", took "
+                        + elapsed + "ms");
             }
         }
     }

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBVersionGCSupport.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBVersionGCSupport.java?rev=1791736&r1=1791735&r2=1791736&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBVersionGCSupport.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBVersionGCSupport.java Tue Apr 18 04:09:53 2017
@@ -26,11 +26,16 @@ import java.util.List;
 import java.util.Set;
 
 import org.apache.jackrabbit.oak.plugins.document.Collection;
+import org.apache.jackrabbit.oak.plugins.document.DocumentStoreException;
 import org.apache.jackrabbit.oak.plugins.document.NodeDocument;
 import org.apache.jackrabbit.oak.plugins.document.NodeDocument.SplitDocType;
 import org.apache.jackrabbit.oak.plugins.document.VersionGCSupport;
 import org.apache.jackrabbit.oak.plugins.document.rdb.RDBDocumentStore.QueryCondition;
 import org.apache.jackrabbit.oak.plugins.document.util.CloseableIterable;
+import org.apache.jackrabbit.oak.plugins.document.util.Utils;
+import org.apache.jackrabbit.oak.stats.Clock;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 import com.google.common.base.Predicate;
 
@@ -40,6 +45,8 @@ import com.google.common.base.Predicate;
  */
 public class RDBVersionGCSupport extends VersionGCSupport {
 
+    private static final Logger LOG = LoggerFactory.getLogger(RDBVersionGCSupport.class);
+
     private RDBDocumentStore store;
 
     public RDBVersionGCSupport(RDBDocumentStore store) {
@@ -71,4 +78,32 @@ public class RDBVersionGCSupport extends
             }
         }), (Closeable) it);
     }
-}
+
+    @Override
+    public long getOldestDeletedOnceTimestamp(Clock clock, long precisionMs) {
+        long modifiedMs = Long.MIN_VALUE;
+
+        LOG.debug("getOldestDeletedOnceTimestamp() <- start");
+        try {
+            modifiedMs = store.getMinValue(Collection.NODES, NodeDocument.MODIFIED_IN_SECS, null, null,
+                    RDBDocumentStore.EMPTY_KEY_PATTERN,
+                    Collections.singletonList(new QueryCondition(NodeDocument.DELETED_ONCE, "=", 1)));
+        } catch (DocumentStoreException ex) {
+            LOG.debug("getMinValue(MODIFIED)", ex);
+        }
+
+        if (modifiedMs > 0) {
+            LOG.debug("getOldestDeletedOnceTimestamp() -> {}", Utils.timestampToString(modifiedMs));
+            return modifiedMs;
+        } else {
+            LOG.debug("getOldestDeletedOnceTimestamp() -> none found, return current time");
+            return clock.getTime();
+        }
+    }
+
+    @Override
+    public long getDeletedOnceCount() {
+        return store.queryCount(Collection.NODES, null, null, RDBDocumentStore.EMPTY_KEY_PATTERN,
+                Collections.singletonList(new QueryCondition(NodeDocument.DELETED_ONCE, "=", 1)));
+    }
+}
\ No newline at end of file

Modified: jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBDocumentStoreJDBCTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBDocumentStoreJDBCTest.java?rev=1791736&r1=1791735&r2=1791736&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBDocumentStoreJDBCTest.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBDocumentStoreJDBCTest.java Tue Apr 18 04:09:53 2017
@@ -389,7 +389,7 @@ public class RDBDocumentStoreJDBCTest ex
             con.setReadOnly(true);
             RDBTableMetaData tmd = ((RDBDocumentStore) super.ds).getTable(Collection.NODES);
             List<QueryCondition> conditions = Collections.emptyList();
-            long cnt = jdbc.getLong(con, tmd, "count(*)", null, null, RDBDocumentStore.EMPTY_KEY_PATTERN, conditions);
+            long cnt = jdbc.getLong(con, tmd, "count", "*", null, null, RDBDocumentStore.EMPTY_KEY_PATTERN, conditions);
             assertTrue(cnt > 0);
         } finally {
             con.close();
@@ -436,9 +436,8 @@ public class RDBDocumentStoreJDBCTest ex
         assertTrue(super.ds.create(Collection.NODES, Collections.singletonList(op)));
         removeMe.add(baseName5ModifiedNoDeletedOnce);
 
-        String selector = "min(MODIFIED)";
         LogCustomizer customLogs = LogCustomizer.forLogger(RDBDocumentStoreJDBC.class.getName()).enable(Level.DEBUG)
-                .contains("Aggregate query").contains(selector).create();
+                .contains("Aggregate query").contains("min(MODIFIED)").create();
         customLogs.starting();
         Connection con = super.rdbDataSource.getConnection();
         try {
@@ -446,7 +445,7 @@ public class RDBDocumentStoreJDBCTest ex
             RDBTableMetaData tmd = ((RDBDocumentStore) super.ds).getTable(Collection.NODES);
             List<QueryCondition> conditions = new ArrayList<QueryCondition>();
             conditions.add(new QueryCondition(RDBDocumentStore.COLLISIONSMODCOUNT, "=", magicValue));
-            long min = jdbc.getLong(con, tmd, selector, null, null, RDBDocumentStore.EMPTY_KEY_PATTERN, conditions);
+            long min = jdbc.getLong(con, tmd, "min", "_modified", null, null, RDBDocumentStore.EMPTY_KEY_PATTERN, conditions);
             assertEquals(5, min);
             con.commit();
         } finally {
@@ -463,7 +462,7 @@ public class RDBDocumentStoreJDBCTest ex
             List<QueryCondition> conditions = new ArrayList<QueryCondition>();
             conditions.add(new QueryCondition(RDBDocumentStore.COLLISIONSMODCOUNT, "=", magicValue));
             conditions.add(new QueryCondition(NodeDocument.DELETED_ONCE, "=", 1));
-            long min = jdbc.getLong(con, tmd, selector, null, null, RDBDocumentStore.EMPTY_KEY_PATTERN, conditions);
+            long min = jdbc.getLong(con, tmd, "min", "_modified", null, null, RDBDocumentStore.EMPTY_KEY_PATTERN, conditions);
             assertEquals(10, min);
             con.commit();
         } finally {