DistributedIntentStore: attempt to fix ONOS-103
Change-Id: I075ba95907c9edc2596ac8bb5f88a23d8e2af204
Showing
1 changed file
with
23 additions
and
1 deletions
... | @@ -16,7 +16,11 @@ | ... | @@ -16,7 +16,11 @@ |
16 | package org.onlab.onos.store.intent.impl; | 16 | package org.onlab.onos.store.intent.impl; |
17 | 17 | ||
18 | import com.google.common.collect.ImmutableSet; | 18 | import com.google.common.collect.ImmutableSet; |
19 | +import com.hazelcast.core.EntryAdapter; | ||
20 | +import com.hazelcast.core.EntryEvent; | ||
21 | +import com.hazelcast.core.EntryListener; | ||
19 | import com.hazelcast.core.IMap; | 22 | import com.hazelcast.core.IMap; |
23 | +import com.hazelcast.core.Member; | ||
20 | 24 | ||
21 | import org.apache.felix.scr.annotations.Activate; | 25 | import org.apache.felix.scr.annotations.Activate; |
22 | import org.apache.felix.scr.annotations.Component; | 26 | import org.apache.felix.scr.annotations.Component; |
... | @@ -87,6 +91,8 @@ public class DistributedIntentStore | ... | @@ -87,6 +91,8 @@ public class DistributedIntentStore |
87 | // TODO: disable near cache, disable read from backup for this IMap | 91 | // TODO: disable near cache, disable read from backup for this IMap |
88 | IMap<byte[], byte[]> rawStates = super.theInstance.getMap("intent-states"); | 92 | IMap<byte[], byte[]> rawStates = super.theInstance.getMap("intent-states"); |
89 | states = new SMap<>(rawStates , super.serializer); | 93 | states = new SMap<>(rawStates , super.serializer); |
94 | + EntryListener<IntentId, IntentState> listener = new RemoteIntentStateListener(); | ||
95 | + states.addEntryListener(listener , false); | ||
90 | 96 | ||
91 | transientStates.clear(); | 97 | transientStates.clear(); |
92 | 98 | ||
... | @@ -213,5 +219,21 @@ public class DistributedIntentStore | ... | @@ -213,5 +219,21 @@ public class DistributedIntentStore |
213 | installable.remove(intentId); | 219 | installable.remove(intentId); |
214 | } | 220 | } |
215 | 221 | ||
216 | - // FIXME add handler to react to remote event | 222 | + public final class RemoteIntentStateListener extends EntryAdapter<IntentId, IntentState> { |
223 | + | ||
224 | + @Override | ||
225 | + public void onEntryEvent(EntryEvent<IntentId, IntentState> event) { | ||
226 | + final Member myself = theInstance.getCluster().getLocalMember(); | ||
227 | + if (!myself.equals(event.getMember())) { | ||
228 | + // When Intent state was modified by remote node, | ||
229 | + // clear local transient state. | ||
230 | + final IntentId intentId = event.getKey(); | ||
231 | + IntentState oldState = transientStates.remove(intentId); | ||
232 | + if (oldState != null) { | ||
233 | + log.debug("{} state updated remotely, removing transient state {}", | ||
234 | + intentId, oldState); | ||
235 | + } | ||
236 | + } | ||
237 | + } | ||
238 | + } | ||
217 | } | 239 | } | ... | ... |
-
Please register or login to post a comment