Author: reschke Date: Wed Mar 7 08:07:47 2018 New Revision: 1826082 URL: http://svn.apache.org/viewvc?rev=1826082&view=rev Log: OAK-7313: RDB*Store: add DEBUG level logging for filters in RDBVersionGCSupport (ported to 1.8)
Modified: jackrabbit/oak/branches/1.8/ (props changed) jackrabbit/oak/branches/1.8/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBVersionGCSupport.java Propchange: jackrabbit/oak/branches/1.8/ ------------------------------------------------------------------------------ --- svn:mergeinfo (original) +++ svn:mergeinfo Wed Mar 7 08:07:47 2018 @@ -1,3 +1,3 @@ /jackrabbit/oak/branches/1.0:1665962 -/jackrabbit/oak/trunk:1820660-1820661,1820729,1820734,1820859,1820861,1820878,1820888,1820947,1821130,1821140-1821141,1821240,1821249,1821258,1821325,1821358,1821361-1821362,1821370,1821375,1821393,1821477,1821487,1821516,1821665,1821668,1821681,1822121,1822201,1822723,1822808,1822850,1822934,1823135,1823163,1823169,1824962,1825362,1825381,1825442,1825448,1825466,1825470,1825475,1825523,1825525,1825619-1825621,1825651,1825992 +/jackrabbit/oak/trunk:1820660-1820661,1820729,1820734,1820859,1820861,1820878,1820888,1820947,1821130,1821140-1821141,1821240,1821249,1821258,1821325,1821358,1821361-1821362,1821370,1821375,1821393,1821477,1821487,1821516,1821665,1821668,1821681,1822121,1822201,1822723,1822808,1822850,1822934,1823135,1823163,1823169,1824962,1825362,1825381,1825442,1825448,1825466,1825470,1825475,1825523,1825525,1825619-1825621,1825651,1825992,1826079 /jackrabbit/trunk:1345480 Modified: jackrabbit/oak/branches/1.8/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBVersionGCSupport.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.8/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBVersionGCSupport.java?rev=1826082&r1=1826081&r2=1826082&view=diff ============================================================================== --- jackrabbit/oak/branches/1.8/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBVersionGCSupport.java (original) +++ jackrabbit/oak/branches/1.8/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBVersionGCSupport.java Wed Mar 7 08:07:47 2018 @@ -72,6 +72,7 @@ public class RDBVersionGCSupport extends final long oldestRevTimeStamp) { Iterable<NodeDocument> it1; Iterable<NodeDocument> it2; + String name1, name2; // for schema 0 or 1 rows, we'll have to constrain the path List<String> excludeKeyPatterns = Arrays.asList("_:/%", "__:/%", "___:/%"); @@ -85,6 +86,7 @@ public class RDBVersionGCSupport extends List<QueryCondition> conditions1 = new ArrayList<QueryCondition>(); conditions1.add(new QueryCondition(NodeDocument.SD_TYPE, "in", gcTypeCodes)); conditions1.add(new QueryCondition(RDBDocumentStore.VERSIONPROP, ">=", 2)); + name1 = "version 2 query"; it1 = store.queryAsIterable(Collection.NODES, null, null, Collections.emptyList(), conditions1, Integer.MAX_VALUE, null); @@ -92,6 +94,7 @@ public class RDBVersionGCSupport extends conditions2.add(new QueryCondition(RDBDocumentStore.VERSIONPROP, "null or <", 2)); it2 = store.queryAsIterable(Collection.NODES, null, null, excludeKeyPatterns, conditions2, Integer.MAX_VALUE, null); + name2 = "version <2 fallback on " + excludeKeyPatterns; } catch (UnsupportedIndexedPropertyException ex) { // this will happen if we query a table that doesn't have the SD* // columns - create a new query without the constraint, and let the @@ -99,26 +102,74 @@ public class RDBVersionGCSupport extends it1 = store.queryAsIterable(Collection.NODES, null, null, excludeKeyPatterns, Collections.emptyList(), Integer.MAX_VALUE, null); it2 = Collections.emptySet(); + name1 = "version <2 fallback on " + excludeKeyPatterns; + name2 = ""; } final Iterable<NodeDocument> fit1 = it1; final Iterable<NodeDocument> fit2 = it2; - return CloseableIterable.wrap(Iterables.filter(Iterables.concat(fit1, fit2), new Predicate<NodeDocument>() { + Predicate<NodeDocument> pred = new Predicate<NodeDocument>() { @Override public boolean apply(NodeDocument doc) { return gcTypes.contains(doc.getSplitDocType()) && doc.hasAllRevisionLessThan(oldestRevTimeStamp) && !isDefaultNoBranchSplitNewerThan(doc, sweepRevs); } - }), new Closeable() { + }; + + final CountingPredicate<NodeDocument> cp1 = new CountingPredicate<NodeDocument>(name1, pred); + final CountingPredicate<NodeDocument> cp2 = new CountingPredicate<NodeDocument>(name2, pred); + + return CloseableIterable.wrap(Iterables.concat(Iterables.filter(fit1, cp1), Iterables.filter(fit2, cp2)), new Closeable() { @Override public void close() throws IOException { Utils.closeIfCloseable(fit1); Utils.closeIfCloseable(fit2); + if (LOG.isDebugEnabled()) { + String stats1 = cp1.getStats(); + String stats2 = cp2.getStats(); + String message = ""; + if (!stats1.isEmpty()) { + message = stats1; + } + if (!stats2.isEmpty()) { + if (!message.isEmpty()) { + message += ", "; + } + message += stats2; + } + if (!message.isEmpty()) { + LOG.debug(message); + } + } } }); } + private static class CountingPredicate<T> implements Predicate<T> { + + private final String name; + private final Predicate<T> predicate; + private int count, matches; + + public CountingPredicate(String name, Predicate<T> predicate) { + this.name = name; + this.predicate = predicate; + } + + public String getStats() { + return count == 0 ? "" : ("Predicate statistics for '" + name + "': " + matches + "/" + count); + } + + @Override + public boolean apply(T doc) { + count += 1; + boolean match = predicate.apply(doc); + matches += (match ? 1 : 0); + return match; + } + } + @Override public long getOldestDeletedOnceTimestamp(Clock clock, long precisionMs) { long modifiedMs = Long.MIN_VALUE;