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 md...@apache.org on 2013/06/14 13:49:46 UTC
svn commit: r1493041 - in /jackrabbit/oak/trunk:
oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/observation/ChangeProcessor.java
oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/RepositoryTest.java
Author: mduerig
Date: Fri Jun 14 11:49:46 2013
New Revision: 1493041
URL: http://svn.apache.org/r1493041
Log:
OAK-144 Implement Observation
OAK-867: Oak whiteboard
make removeEventListener blocking again
Modified:
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/observation/ChangeProcessor.java
jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/RepositoryTest.java
Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/observation/ChangeProcessor.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/observation/ChangeProcessor.java?rev=1493041&r1=1493040&r2=1493041&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/observation/ChangeProcessor.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/observation/ChangeProcessor.java Fri Jun 14 11:49:46 2013
@@ -114,9 +114,17 @@ class ChangeProcessor implements Runnabl
public void stop() {
stopping = true; // do this outside synchronization
synchronized (this) {
- checkState(registration != null, "Change processor not started");
- changeListener.dispose();
- registration.unregister();
+ try {
+ while (running) {
+ wait();
+ }
+ checkState(registration != null, "Change processor not started");
+ changeListener.dispose();
+ registration.unregister();
+ }
+ catch (InterruptedException e) {
+ Thread.currentThread().interrupt();
+ }
}
}
@@ -145,6 +153,7 @@ class ChangeProcessor implements Runnabl
log.error("Unable to generate or send events", e);
} finally {
running = false;
+ synchronized (this) { notifyAll(); }
}
}
Modified: jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/RepositoryTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/RepositoryTest.java?rev=1493041&r1=1493040&r2=1493041&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/RepositoryTest.java (original)
+++ jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/RepositoryTest.java Fri Jun 14 11:49:46 2013
@@ -2037,8 +2037,8 @@ public class RepositoryTest extends Abst
public void observationDispose() throws RepositoryException, InterruptedException, ExecutionException,
TimeoutException {
+ final AtomicReference<Boolean> stopGeneratingEvents = new AtomicReference<Boolean>(false);
final AtomicReference<CountDownLatch> hasEvents = new AtomicReference<CountDownLatch>(new CountDownLatch(1));
- final AtomicReference<CountDownLatch> waitForRemove = new AtomicReference<CountDownLatch>(new CountDownLatch(1));
final Session observingSession = createAdminSession();
try {
final ObservationManager obsMgr = observingSession.getWorkspace().getObservationManager();
@@ -2048,13 +2048,6 @@ public class RepositoryTest extends Abst
while (events.hasNext()) {
events.next();
hasEvents.get().countDown();
- try {
- // After receiving an event wait until event listener is removed
- waitForRemove.get().await();
- }
- catch (InterruptedException e) {
- Thread.currentThread().interrupt();
- }
}
}
};
@@ -2063,30 +2056,37 @@ public class RepositoryTest extends Abst
Event.PROPERTY_ADDED | Event.PROPERTY_REMOVED | Event.PROPERTY_CHANGED | Event.PERSIST,
"/", true, null, null, false);
- // Generate two events
- Node n = getNode(TEST_PATH);
- n.setProperty("prop1", "val1");
- n.setProperty("prop2", "val2");
- n.getSession().save();
+ // Generate events
+ Executors.newSingleThreadExecutor().submit(new Callable<Void>() {
+ @Override
+ public Void call() throws Exception {
+ Node n = getNode(TEST_PATH);
+ for (int c = 0; !stopGeneratingEvents.get() ; c++) {
+ n.addNode("c" + c);
+ n.getSession().save();
+ }
+ return null;
+ }
+ });
- // Make sure we see the first event
+ // Make sure we see the events
assertTrue(hasEvents.get().await(2, TimeUnit.SECONDS));
- // Remove event listener before it receives the second event
+ // Remove event listener
Executors.newSingleThreadExecutor().submit(new Callable<Void>() {
@Override
public Void call() throws Exception {
obsMgr.removeEventListener(listener);
+ hasEvents.set(new CountDownLatch(1));
return null;
}
}).get(2, TimeUnit.SECONDS);
- hasEvents.set(new CountDownLatch(1));
- waitForRemove.get().countDown();
- // Make sure we don't see the second event
+ // Make sure we don't see any more events
assertFalse(hasEvents.get().await(2, TimeUnit.SECONDS));
}
finally {
+ stopGeneratingEvents.set(true);
observingSession.logout();
}
}