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 {