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 st...@apache.org on 2017/02/06 15:47:55 UTC

svn commit: r1781919 - in /jackrabbit/oak/trunk/oak-core/src: main/java/org/apache/jackrabbit/oak/plugins/observation/filter/GlobbingPathFilter.java test/java/org/apache/jackrabbit/oak/plugins/observation/filter/GlobbingPathFilterTest.java

Author: stefanegli
Date: Mon Feb  6 15:47:55 2017
New Revision: 1781919

URL: http://svn.apache.org/viewvc?rev=1781919&view=rev
Log:
OAK-5589 : performance improvement for GlobbingPathFilter constructor

Modified:
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/observation/filter/GlobbingPathFilter.java
    jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/observation/filter/GlobbingPathFilterTest.java

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/observation/filter/GlobbingPathFilter.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/observation/filter/GlobbingPathFilter.java?rev=1781919&r1=1781918&r2=1781919&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/observation/filter/GlobbingPathFilter.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/observation/filter/GlobbingPathFilter.java Mon Feb  6 15:47:55 2017
@@ -23,7 +23,9 @@ import static com.google.common.base.Obj
 import static com.google.common.base.Preconditions.checkNotNull;
 import static org.apache.jackrabbit.oak.commons.PathUtils.elements;
 
+import java.util.ArrayList;
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 import java.util.regex.Pattern;
 
@@ -31,10 +33,12 @@ import javax.annotation.Nonnull;
 
 import com.google.common.base.Joiner;
 import com.google.common.collect.ImmutableList;
+import com.google.common.collect.Iterables;
+import com.google.common.collect.Iterators;
+import com.google.common.collect.Lists;
 
 import org.apache.jackrabbit.oak.api.PropertyState;
 import org.apache.jackrabbit.oak.spi.state.NodeState;
-import org.slf4j.LoggerFactory;
 
 /**
  * This {@code Filter} implementation supports filtering on paths using
@@ -68,21 +72,29 @@ public class GlobbingPathFilter implemen
     public static final String STAR = "*";
     public static final String STAR_STAR = "**";
 
-    private final ImmutableList<String> pattern;
+    // OAK-5589 : pattern can be a normal List, it doesn't have to be immutable -
+    // given we create a new list in the public constructor anyway
+    private final List<String> pattern;
     private final Map<String, Pattern> patternMap;
 
-    private GlobbingPathFilter(@Nonnull Iterable<String> pattern, Map<String, Pattern> patternMap) {
-        this.pattern = ImmutableList.copyOf(checkNotNull(pattern));
+    private GlobbingPathFilter(@Nonnull List<String> pattern, Map<String, Pattern> patternMap) {
+        // OAK-5589 : for internal constructor case don't copy the pattern, refer to the same one
+        // this will work fine given the public constructors make a copy and internally we're
+        // never fiddling with the pattern list
+        this.pattern = checkNotNull(pattern);
         this.patternMap = checkNotNull(patternMap);
     }
 
     public GlobbingPathFilter(@Nonnull String pattern, Map<String, Pattern> patternMap) {
-        this(elements(pattern), checkNotNull(patternMap));
+        // OAK-5589 : use the fastest way to create a List based on an unknown deep pattern
+        this.pattern = new ArrayList<String>(10);
+        Iterators.addAll(this.pattern, elements(checkNotNull(pattern)).iterator());
+        this.patternMap = checkNotNull(patternMap);
     }
 
     /** for testing only - use variant which passes the patternMap for productive code **/
     public GlobbingPathFilter(@Nonnull String pattern) {
-        this(elements(pattern), new HashMap<String, Pattern>());
+        this(pattern, new HashMap<String, Pattern>());
     }
 
     @Override

Modified: jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/observation/filter/GlobbingPathFilterTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/observation/filter/GlobbingPathFilterTest.java?rev=1781919&r1=1781918&r2=1781919&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/observation/filter/GlobbingPathFilterTest.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/observation/filter/GlobbingPathFilterTest.java Mon Feb  6 15:47:55 2017
@@ -32,6 +32,7 @@ import org.apache.jackrabbit.oak.plugins
 import org.apache.jackrabbit.oak.spi.state.NodeBuilder;
 import org.apache.jackrabbit.oak.spi.state.NodeState;
 import org.junit.Before;
+import org.junit.Ignore;
 import org.junit.Test;
 
 public class GlobbingPathFilterTest {
@@ -295,10 +296,10 @@ public class GlobbingPathFilterTest {
      */
     @Test
     public void matchSuffix() {
-        EventFilter filter = new GlobbingPathFilter("r/s/t/**");
+        EventFilter filter = new GlobbingPathFilter("a/b/c/d/r/s/t/**");
         ImmutableTree t = tree;
 
-        for(String name : elements("r/s")) {
+        for(String name : elements("a/b/c/d/r/s")) {
             t = t.getChild(name);
             assertFalse(filter.includeAdd(name, t.getNodeState()));
             filter = filter.create(name, t.getNodeState(), t.getNodeState());
@@ -313,4 +314,20 @@ public class GlobbingPathFilterTest {
         }
     }
 
+    @Test
+    @Ignore("Manual test for OAK-5589")
+    public void constructorPerformance() throws Exception {
+        final int NUM = 5000000;
+        final long start = System.currentTimeMillis();
+        for(int i=0; i<NUM; i++) {
+            matchSuffix();
+            matchAtEnd();
+        }
+        final long end = System.currentTimeMillis();
+        final long diff = end - start;
+        System.out.println(NUM + " iterations took " + diff + "ms.");
+        // old version: 5000000 iterations took 33-34sec
+        // new version: 5000000 iterations took 23-24sec -> ca 25-30% faster
+    }
+
 }