You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by ro...@apache.org on 2017/11/07 09:26:22 UTC
[sling-org-apache-sling-discovery-commons] 19/38: SLING-5094 /
SLING-4603 related : cancel ongoing sync explicitly in order to avoid
dangerous CHANGED event when changes happen during sync
This is an automated email from the ASF dual-hosted git repository.
rombert pushed a commit to annotated tag org.apache.sling.discovery.commons-1.0.0
in repository https://gitbox.apache.org/repos/asf/sling-org-apache-sling-discovery-commons.git
commit 8b4c590b7c709fb77757f20022ff69e9eba10e38
Author: Stefan Egli <st...@apache.org>
AuthorDate: Wed Oct 21 15:37:35 2015 +0000
SLING-5094 / SLING-4603 related : cancel ongoing sync explicitly in order to avoid dangerous CHANGED event when changes happen during sync
git-svn-id: https://svn.apache.org/repos/asf/sling/trunk/bundles/extensions/discovery/commons@1709866 13f79535-47bb-0310-9956-ffa450edef68
---
.../providers/base/ViewStateManagerImpl.java | 6 +++
.../commons/providers/spi/ConsistencyService.java | 2 +
.../spi/base/BaseSyncTokenConsistencyService.java | 5 ++
.../commons/providers/base/ClusterTest.java | 5 ++
.../providers/base/TestMinEventDelayHandler.java | 5 ++
.../providers/base/TestViewStateManager.java | 57 +++++++++++++++++++++-
6 files changed, 79 insertions(+), 1 deletion(-)
diff --git a/src/main/java/org/apache/sling/discovery/commons/providers/base/ViewStateManagerImpl.java b/src/main/java/org/apache/sling/discovery/commons/providers/base/ViewStateManagerImpl.java
index f2c3525..70fa33f 100644
--- a/src/main/java/org/apache/sling/discovery/commons/providers/base/ViewStateManagerImpl.java
+++ b/src/main/java/org/apache/sling/discovery/commons/providers/base/ViewStateManagerImpl.java
@@ -414,6 +414,12 @@ public class ViewStateManagerImpl implements ViewStateManager {
if (!localInstance.isLocal()) {
throw new IllegalStateException("newView's local instance is not isLocal - very unexpected - hence cannot be current");
}
+
+ // cancel any potentially ongoing sync
+ if (consistencyService != null) {
+ consistencyService.cancelSync();
+ }
+
logger.debug("handleNewView: newView is current, so trying with minEventDelayHandler...");
if (minEventDelayHandler!=null) {
if (minEventDelayHandler.handlesNewView(newView)) {
diff --git a/src/main/java/org/apache/sling/discovery/commons/providers/spi/ConsistencyService.java b/src/main/java/org/apache/sling/discovery/commons/providers/spi/ConsistencyService.java
index 4678657..0aec6a8 100644
--- a/src/main/java/org/apache/sling/discovery/commons/providers/spi/ConsistencyService.java
+++ b/src/main/java/org/apache/sling/discovery/commons/providers/spi/ConsistencyService.java
@@ -81,4 +81,6 @@ public interface ConsistencyService {
*/
void sync(BaseTopologyView view, Runnable callback);
+ void cancelSync();
+
}
diff --git a/src/main/java/org/apache/sling/discovery/commons/providers/spi/base/BaseSyncTokenConsistencyService.java b/src/main/java/org/apache/sling/discovery/commons/providers/spi/base/BaseSyncTokenConsistencyService.java
index f37b7a2..fd53e82 100644
--- a/src/main/java/org/apache/sling/discovery/commons/providers/spi/base/BaseSyncTokenConsistencyService.java
+++ b/src/main/java/org/apache/sling/discovery/commons/providers/spi/base/BaseSyncTokenConsistencyService.java
@@ -52,6 +52,11 @@ public abstract class BaseSyncTokenConsistencyService extends AbstractServiceWit
}
@Override
+ public void cancelSync() {
+ cancelPreviousBackgroundCheck();
+ }
+
+ @Override
public void sync(BaseTopologyView view, Runnable callback) {
// cancel the previous background-check if it's still running
cancelPreviousBackgroundCheck();
diff --git a/src/test/java/org/apache/sling/discovery/commons/providers/base/ClusterTest.java b/src/test/java/org/apache/sling/discovery/commons/providers/base/ClusterTest.java
index 7b921dc..2bf3705 100644
--- a/src/test/java/org/apache/sling/discovery/commons/providers/base/ClusterTest.java
+++ b/src/test/java/org/apache/sling/discovery/commons/providers/base/ClusterTest.java
@@ -64,6 +64,11 @@ public class ClusterTest {
public void sync(BaseTopologyView view, Runnable callback) {
callback.run();
}
+
+ @Override
+ public void cancelSync() {
+ // nothing to cancel, we're auto-run
+ }
});
mgrList.add(mgr);
return mgr;
diff --git a/src/test/java/org/apache/sling/discovery/commons/providers/base/TestMinEventDelayHandler.java b/src/test/java/org/apache/sling/discovery/commons/providers/base/TestMinEventDelayHandler.java
index 84ec22f..d28b912 100644
--- a/src/test/java/org/apache/sling/discovery/commons/providers/base/TestMinEventDelayHandler.java
+++ b/src/test/java/org/apache/sling/discovery/commons/providers/base/TestMinEventDelayHandler.java
@@ -61,6 +61,11 @@ public class TestMinEventDelayHandler {
public void sync(BaseTopologyView view, Runnable callback) {
callback.run();
}
+
+ @Override
+ public void cancelSync() {
+ // nothing to cancel, we're auto-run
+ }
});
defaultRandom = new Random(1234123412); // I want randomness yes, but deterministic, for some methods at least
diff --git a/src/test/java/org/apache/sling/discovery/commons/providers/base/TestViewStateManager.java b/src/test/java/org/apache/sling/discovery/commons/providers/base/TestViewStateManager.java
index df90dfc..13d586d 100644
--- a/src/test/java/org/apache/sling/discovery/commons/providers/base/TestViewStateManager.java
+++ b/src/test/java/org/apache/sling/discovery/commons/providers/base/TestViewStateManager.java
@@ -22,6 +22,8 @@ import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
+import java.util.LinkedList;
+import java.util.List;
import java.util.Random;
import java.util.UUID;
import java.util.concurrent.Semaphore;
@@ -36,7 +38,6 @@ import org.apache.sling.discovery.commons.providers.DefaultClusterView;
import org.apache.sling.discovery.commons.providers.DefaultInstanceDescription;
import org.apache.sling.discovery.commons.providers.DummyTopologyView;
import org.apache.sling.discovery.commons.providers.EventHelper;
-import org.apache.sling.discovery.commons.providers.base.ViewStateManagerImpl;
import org.apache.sling.discovery.commons.providers.spi.ConsistencyService;
import org.junit.After;
import org.junit.Before;
@@ -72,6 +73,11 @@ public class TestViewStateManager {
}
}
+ @Override
+ public void cancelSync() {
+ // TODO not implemented yet
+ }
+
}
private ViewStateManagerImpl mgr;
@@ -85,6 +91,11 @@ public class TestViewStateManager {
public void sync(BaseTopologyView view, Runnable callback) {
callback.run();
}
+
+ @Override
+ public void cancelSync() {
+ // nothing to cancel, we're auto-run
+ }
});
defaultRandom = new Random(1234123412); // I want randomness yes, but deterministic, for some methods at least
}
@@ -206,6 +217,50 @@ public class TestViewStateManager {
}
@Test
+ public void testCancelSync() throws Exception {
+ final List<Runnable> syncCallbacks = new LinkedList<Runnable>();
+ mgr = new ViewStateManagerImpl(new ReentrantLock(), new ConsistencyService() {
+
+ public void sync(BaseTopologyView view, Runnable callback) {
+ synchronized(syncCallbacks) {
+ syncCallbacks.add(callback);
+ }
+ }
+
+ @Override
+ public void cancelSync() {
+ synchronized(syncCallbacks) {
+ syncCallbacks.clear();
+ }
+ }
+ });
+ mgr.handleActivated();
+ final DummyListener listener = new DummyListener();
+ mgr.bind(listener);
+ mgr.handleChanging();
+ final BaseTopologyView view = new DummyTopologyView().addInstance();
+ mgr.handleNewView(view);
+ assertTrue(mgr.waitForAsyncEvents(1000));
+ TestHelper.assertNoEvents(listener);
+ synchronized(syncCallbacks) {
+ assertEquals(1, syncCallbacks.size());
+ }
+ String id1 = UUID.randomUUID().toString();
+ String id2 = UUID.randomUUID().toString();
+ final BaseTopologyView view2 = TestHelper.newView(true, id1, id1, id1, id2);
+ mgr.handleNewView(view2);
+ assertTrue(mgr.waitForAsyncEvents(1000));
+ TestHelper.assertNoEvents(listener);
+ synchronized(syncCallbacks) {
+ assertEquals(1, syncCallbacks.size());
+ syncCallbacks.get(0).run();
+ syncCallbacks.clear();
+ }
+ assertTrue(mgr.waitForAsyncEvents(1000));
+ assertEvents(listener, EventHelper.newInitEvent(view2));
+ }
+
+ @Test
public void testActivateBindChangingChanged() throws Exception {
final DummyListener listener = new DummyListener();
// first activate
--
To stop receiving notification emails like this one, please contact
"commits@sling.apache.org" <co...@sling.apache.org>.