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 2018/03/07 08:07:47 UTC

svn commit: r1826082 - in /jackrabbit/oak/branches/1.8: ./ oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBVersionGCSupport.java

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;