Author: stefanegli
Date: Tue Nov 29 09:52:32 2016
New Revision: 1771872

URL: http://svn.apache.org/viewvc?rev=1771872&view=rev
Log:
OAK-5160 : made FilteringAwareObserver's before indeed Nonnull

Modified:
    
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/observation/FilteringDispatcher.java
    
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/spi/commit/BackgroundObserverTest.java
    
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/spi/commit/PrefilteringBackgroundObserverTest.java
    
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/observation/ChangeProcessor.java

Modified: 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/observation/FilteringDispatcher.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/observation/FilteringDispatcher.java?rev=1771872&r1=1771871&r2=1771872&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/observation/FilteringDispatcher.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/observation/FilteringDispatcher.java
 Tue Nov 29 09:52:32 2016
@@ -21,7 +21,6 @@ package org.apache.jackrabbit.oak.plugin
 import static com.google.common.base.Preconditions.checkNotNull;
 
 import javax.annotation.Nonnull;
-import javax.annotation.Nullable;
 
 import org.apache.jackrabbit.oak.spi.commit.CommitInfo;
 import org.apache.jackrabbit.oak.spi.commit.Observer;
@@ -47,8 +46,12 @@ public class FilteringDispatcher impleme
     @Override
     public void contentChanged(@Nonnull NodeState root,
                                @Nonnull CommitInfo info) {
-        if (info != FilteringObserver.NOOP_CHANGE) {
-            observer.contentChanged(before, root, info);
+        if (before != null) { 
+            // avoid null being passed as before to observer
+            // before == null happens only at startup
+            if (info != FilteringObserver.NOOP_CHANGE) {
+                observer.contentChanged(before, root, info);
+            }
         }
         before = root;
     }

Modified: 
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/spi/commit/BackgroundObserverTest.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/spi/commit/BackgroundObserverTest.java?rev=1771872&r1=1771871&r2=1771872&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/spi/commit/BackgroundObserverTest.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/spi/commit/BackgroundObserverTest.java
 Tue Nov 29 09:52:32 2016
@@ -206,7 +206,7 @@ public class BackgroundObserverTest {
             final long done = System.currentTimeMillis() + 
unit.toMillis(timeout);
             synchronized (this) {
                 while (!pausing && done > System.currentTimeMillis()) {
-                    this.wait();
+                    this.wait(100);
                 }
                 return pausing;
             }
@@ -216,7 +216,7 @@ public class BackgroundObserverTest {
             final long done = System.currentTimeMillis() + 
unit.toMillis(timeout);
             synchronized (this) {
                 while (pausing && done > System.currentTimeMillis()) {
-                    this.wait();
+                    this.wait(100);
                 }
                 return !pausing;
             }
@@ -280,7 +280,6 @@ public class BackgroundObserverTest {
         List<Pair> expected = new LinkedList<Pair>();
         NodeStateGenerator generator = new NodeStateGenerator();
         NodeState first = generator.next();
-        expected.add(new Pair(null, first));
         fo.contentChanged(first, CommitInfo.EMPTY);
         for (int i = 0; i < 100000; i++) {
             filter.excludeNext(true);
@@ -300,7 +299,6 @@ public class BackgroundObserverTest {
         List<Pair> expected = new LinkedList<Pair>();
         NodeStateGenerator generator = new NodeStateGenerator();
         NodeState first = generator.next();
-        expected.add(new Pair(null, first));
         fo.contentChanged(first, CommitInfo.EMPTY);
         NodeState previous = first;
         for (int i = 0; i < 10000; i++) {
@@ -326,8 +324,10 @@ public class BackgroundObserverTest {
         recorder.pause();
 
         // the first one will directly go to the recorder
+        NodeState initialHeldBack = generator.next();
+        fo.contentChanged(initialHeldBack, CommitInfo.EMPTY);
         NodeState firstIncluded = generator.next();
-        expected.add(new Pair(null, firstIncluded));
+        expected.add(new Pair(initialHeldBack, firstIncluded));
         fo.contentChanged(firstIncluded, CommitInfo.EMPTY);
 
         assertTrue("observer did not get called (yet?)", 
recorder.waitForPausing(5, TimeUnit.SECONDS));
@@ -408,7 +408,6 @@ public class BackgroundObserverTest {
         Random r = new Random(2343242); // seed: repeatable tests
         NodeStateGenerator generator = new NodeStateGenerator();
         NodeState first = generator.next();
-        expected.add(new Pair(null, first));
         fo.contentChanged(first, CommitInfo.EMPTY);
         NodeState previous = first;
         for (int i = 0; i < cnt; i++) {

Modified: 
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/spi/commit/PrefilteringBackgroundObserverTest.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/spi/commit/PrefilteringBackgroundObserverTest.java?rev=1771872&r1=1771871&r2=1771872&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/spi/commit/PrefilteringBackgroundObserverTest.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/spi/commit/PrefilteringBackgroundObserverTest.java
 Tue Nov 29 09:52:32 2016
@@ -165,8 +165,8 @@ public class PrefilteringBackgroundObser
         }
         executeRunnables(runnableQ, 10);
         
-        assertEquals(501, received.size());
-        assertEquals(500, resetCallCnt);
+        assertEquals(500, received.size()); // changed from 501 with OAK-5121
+        assertEquals(499, resetCallCnt); // changed from 500 with OAK-5121
         
         // Part 2 : run with filtersEvaluatedMapWithNullObservers - empty or 
null shouldn't matter, it's excluded in both cases
         received.clear();
@@ -233,7 +233,7 @@ public class PrefilteringBackgroundObser
                 // still 5 in the queue
                 new TestPattern(INCLUDED, 5, false, 0, 0),
                 // now we added 2, queue still not full
-                new TestPattern(EXCLUDED, 0 /* only flush*/, true, 10, 2)
+                new TestPattern(EXCLUDED, 0 /* only flush*/, true, 10, 1)
                 );
     }
     
@@ -249,7 +249,7 @@ public class PrefilteringBackgroundObser
                 // still 6 in the queue, of 7
                 new TestPattern(INCLUDED, 5, false, 0, 0, 6, 7),
                 // now we added 2 (one NOOP and one of those 5), so the queue 
got full (==7)
-                new TestPattern(EXCLUDED, 0 /* only flush*/, true, 5, 1, 7, 0)
+                new TestPattern(EXCLUDED, 0 /* only flush*/, true, 5, 0, 7, 0)
                 );
     }
     
@@ -283,7 +283,7 @@ public class PrefilteringBackgroundObser
                 // still full but it's ignored, so doesn't have any queue 
length effect
                 new TestPattern(INCLUDED, 3, false, 0, 0, 4, 4),
                 // adding 3 will not work, it will result in an overflow entry
-                new TestPattern(EXCLUDED, 0 /* only flush*/, true, 3, 1, 4, 0),
+                new TestPattern(EXCLUDED, 0 /* only flush*/, true, 3, 0, 4, 0),
                 new TestPattern(INCLUDED, 1, false, 0, 0, 0, 1),
                 new TestPattern(EXCLUDED, 0 /* only flush*/, true, 1, 0, 1, 0)
                 );

Modified: 
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/observation/ChangeProcessor.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/observation/ChangeProcessor.java?rev=1771872&r1=1771871&r2=1771872&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/observation/ChangeProcessor.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/observation/ChangeProcessor.java
 Tue Nov 29 09:52:32 2016
@@ -474,6 +474,8 @@ class ChangeProcessor implements Filteri
     public void contentChanged(@Nonnull NodeState before, 
                                @Nonnull NodeState after,
                                @Nonnull CommitInfo info) {
+        checkNotNull(before); // OAK-5160 before is now guaranteed to be 
non-null
+        checkNotNull(after);
         checkNotNull(info);
         FilterResult prefilterTestResult = null;
         if (PREFILTERING_TESTMODE) {
@@ -490,64 +492,62 @@ class ChangeProcessor implements Filteri
                 LOG.warn("contentChanged: exception in wouldBeExcludedCommit: 
" + e, e);
             }
         }
-        if (before != null) {
-            try {
-                long start = PERF_LOGGER.start();
-                FilterProvider provider = filterProvider.get();
-                boolean onEventInvoked = false;
-                // FIXME don't rely on toString for session id
-                if (provider.includeCommit(contentSession.toString(), info)) {
-                    EventFilter filter = provider.getFilter(before, after);
-                    EventIterator events = new EventQueue(namePathMapper, 
info, before, after,
-                            provider.getSubTrees(), Filters.all(filter, 
VISIBLE_FILTER), 
-                            provider.getEventAggregator());
+        try {
+            long start = PERF_LOGGER.start();
+            FilterProvider provider = filterProvider.get();
+            boolean onEventInvoked = false;
+            // FIXME don't rely on toString for session id
+            if (provider.includeCommit(contentSession.toString(), info)) {
+                EventFilter filter = provider.getFilter(before, after);
+                EventIterator events = new EventQueue(namePathMapper, info, 
before, after,
+                        provider.getSubTrees(), Filters.all(filter, 
VISIBLE_FILTER), 
+                        provider.getEventAggregator());
 
-                    long time = System.nanoTime();
-                    boolean hasEvents = events.hasNext();
-                    tracker.recordProducerTime(System.nanoTime() - time, 
TimeUnit.NANOSECONDS);
-                    if (hasEvents && runningMonitor.enterIf(running)) {
+                long time = System.nanoTime();
+                boolean hasEvents = events.hasNext();
+                tracker.recordProducerTime(System.nanoTime() - time, 
TimeUnit.NANOSECONDS);
+                if (hasEvents && runningMonitor.enterIf(running)) {
+                    if (commitRateLimiter != null) {
+                        commitRateLimiter.beforeNonBlocking();
+                    }
+                    try {
+                        CountingIterator countingEvents = new 
CountingIterator(events);
+                        onEventInvoked = true;
+                        eventListener.onEvent(countingEvents);
+                        countingEvents.updateCounters(eventCount, 
eventDuration);
+                    } finally {
                         if (commitRateLimiter != null) {
-                            commitRateLimiter.beforeNonBlocking();
-                        }
-                        try {
-                            CountingIterator countingEvents = new 
CountingIterator(events);
-                            onEventInvoked = true;
-                            eventListener.onEvent(countingEvents);
-                            countingEvents.updateCounters(eventCount, 
eventDuration);
-                        } finally {
-                            if (commitRateLimiter != null) {
-                                commitRateLimiter.afterNonBlocking();
-                            }
-                            runningMonitor.leave();
+                            commitRateLimiter.afterNonBlocking();
                         }
+                        runningMonitor.leave();
                     }
                 }
-                if (prefilterTestResult != null) {
-                    // OAK-4908 test mode
-                    if (prefilterTestResult == FilterResult.EXCLUDE && 
onEventInvoked) {
-                        // this is not ok, an event would have gotten
-                        // excluded-by-prefiltering even though
-                        // it actually got an event.
-                        LOG.warn("contentChanged: delivering event which would 
have been prefiltered, "
-                                + "info={}, this={}, listener={}", info, this, 
eventListener);
-                    } else if (prefilterTestResult == FilterResult.INCLUDE && 
!onEventInvoked && info != null
-                            && info != CommitInfo.EMPTY) {
-                        // this can occur arbitrarily frequent. as prefiltering
-                        // is not perfect, it can
-                        // have false negatives - ie it can include even though
-                        // no event is then created
-                        // hence we can only really log at debug here
-                        LOG.debug(
-                                "contentChanged: no event to deliver but not 
prefiltered, info={}, this={}, listener={}",
-                                info, this, eventListener);
-                    }
+            }
+            if (prefilterTestResult != null) {
+                // OAK-4908 test mode
+                if (prefilterTestResult == FilterResult.EXCLUDE && 
onEventInvoked) {
+                    // this is not ok, an event would have gotten
+                    // excluded-by-prefiltering even though
+                    // it actually got an event.
+                    LOG.warn("contentChanged: delivering event which would 
have been prefiltered, "
+                            + "info={}, this={}, listener={}", info, this, 
eventListener);
+                } else if (prefilterTestResult == FilterResult.INCLUDE && 
!onEventInvoked && info != null
+                        && info != CommitInfo.EMPTY) {
+                    // this can occur arbitrarily frequent. as prefiltering
+                    // is not perfect, it can
+                    // have false negatives - ie it can include even though
+                    // no event is then created
+                    // hence we can only really log at debug here
+                    LOG.debug(
+                            "contentChanged: no event to deliver but not 
prefiltered, info={}, this={}, listener={}",
+                            info, this, eventListener);
                 }
-                PERF_LOGGER.end(start, 100,
-                        "Generated events (before: {}, after: {})",
-                        before, after);
-            } catch (Exception e) {
-                LOG.warn("Error while dispatching observation events for " + 
tracker, e);
             }
+            PERF_LOGGER.end(start, 100,
+                    "Generated events (before: {}, after: {})",
+                    before, after);
+        } catch (Exception e) {
+            LOG.warn("Error while dispatching observation events for " + 
tracker, e);
         }
     }
 


Reply via email to