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 {


Reply via email to