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);
}
}