CORD-354 OF-DPA support for link-failures.
Bug fix in flowObjectives store. Adding a removeNextGroup API to the store.
Change-Id: I5890411e5b4eabdc057402687ada26e539500f8f
diff --git a/core/api/src/main/java/org/onosproject/net/flowobjective/FlowObjectiveStore.java b/core/api/src/main/java/org/onosproject/net/flowobjective/FlowObjectiveStore.java
index ecf5d73..85dec0f 100644
--- a/core/api/src/main/java/org/onosproject/net/flowobjective/FlowObjectiveStore.java
+++ b/core/api/src/main/java/org/onosproject/net/flowobjective/FlowObjectiveStore.java
@@ -27,7 +27,8 @@
extends Store<ObjectiveEvent, FlowObjectiveStoreDelegate> {
/**
- * Adds a NextGroup to the store.
+ * Adds a NextGroup to the store, by mapping it to the nextId as key,
+ * and replacing any previous mapping.
*
* @param nextId an integer
* @param group a next group opaque object
@@ -36,12 +37,22 @@
/**
* Fetch a next group from the store.
- * @param nextId an integer
- * @return a next group
+ *
+ * @param nextId an integer used as key
+ * @return a next group, or null if group was not found
*/
NextGroup getNextGroup(Integer nextId);
/**
+ * Remove a next group mapping from the store.
+ *
+ * @param nextId the key to remove from the store.
+ * @return the next group which mapped to the nextId and is now removed, or
+ * null if no group mapping existed in the store
+ */
+ NextGroup removeNextGroup(Integer nextId);
+
+ /**
* Allocates a next objective id. This id is globally unique
*
* @return an integer
diff --git a/core/net/src/main/java/org/onosproject/net/flowobjective/impl/FlowObjectiveManager.java b/core/net/src/main/java/org/onosproject/net/flowobjective/impl/FlowObjectiveManager.java
index 33200b1..6a0d3e1 100644
--- a/core/net/src/main/java/org/onosproject/net/flowobjective/impl/FlowObjectiveManager.java
+++ b/core/net/src/main/java/org/onosproject/net/flowobjective/impl/FlowObjectiveManager.java
@@ -48,6 +48,7 @@
import org.onosproject.net.flowobjective.Objective;
import org.onosproject.net.flowobjective.ObjectiveError;
import org.onosproject.net.flowobjective.ObjectiveEvent;
+import org.onosproject.net.flowobjective.ObjectiveEvent.Type;
import org.onosproject.net.group.GroupService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -381,19 +382,19 @@
private class InternalStoreDelegate implements FlowObjectiveStoreDelegate {
@Override
public void notify(ObjectiveEvent event) {
- log.debug("Received notification of obj event {}", event);
- Set<PendingNext> pending = pendingForwards.remove(event.subject());
+ if (event.type() == Type.ADD) {
+ log.debug("Received notification of obj event {}", event);
+ Set<PendingNext> pending = pendingForwards.remove(event.subject());
- if (pending == null) {
- log.debug("Nothing pending for this obj event");
- return;
+ if (pending == null) {
+ log.debug("Nothing pending for this obj event");
+ return;
+ }
+
+ log.debug("Processing pending forwarding objectives {}", pending.size());
+ pending.forEach(p -> getDevicePipeliner(p.deviceId())
+ .forward(p.forwardingObjective()));
}
-
- log.debug("Processing pending forwarding objectives {}", pending.size());
-
- pending.forEach(p -> getDevicePipeliner(p.deviceId())
- .forward(p.forwardingObjective()));
-
}
}
diff --git a/core/store/dist/src/main/java/org/onosproject/store/flowobjective/impl/DistributedFlowObjectiveStore.java b/core/store/dist/src/main/java/org/onosproject/store/flowobjective/impl/DistributedFlowObjectiveStore.java
index e8ea24f..87b1058 100644
--- a/core/store/dist/src/main/java/org/onosproject/store/flowobjective/impl/DistributedFlowObjectiveStore.java
+++ b/core/store/dist/src/main/java/org/onosproject/store/flowobjective/impl/DistributedFlowObjectiveStore.java
@@ -79,10 +79,9 @@
log.info("Stopped");
}
-
@Override
public void putNextGroup(Integer nextId, NextGroup group) {
- nextGroups.putIfAbsent(nextId, group.data());
+ nextGroups.put(nextId, group.data());
notifyDelegate(new ObjectiveEvent(ObjectiveEvent.Type.ADD, nextId));
}
@@ -96,6 +95,16 @@
}
@Override
+ public NextGroup removeNextGroup(Integer nextId) {
+ Versioned<byte[]> versionGroup = nextGroups.remove(nextId);
+ if (versionGroup != null) {
+ notifyDelegate(new ObjectiveEvent(ObjectiveEvent.Type.REMOVE, nextId));
+ return new DefaultNextGroup(versionGroup.value());
+ }
+ return null;
+ }
+
+ @Override
public int allocateNextId() {
return (int) nextIds.incrementAndGet();
}