CORD-48 Implementation of hashing Next Objective in OF-DPA driver. Major changes to ensure multi-ONOS-instance group-chain installation.
Also includes:
Changes to Next Objective that adds metadata field for applications to optionally send auxillary info to drivers
Changes to Next Objective that allows more explicit modification of the next objective
Changes to Forwarding Objective and PendingNext to include hashCode() and equals() method
MplsBosInstruction included in kryo serializer
GroupKey's byte[] represented as a hex string
Bug fix in mpls flow installation to report failure in install
Bug fix in linkUp in SR app to disallow non-masters to modify groups
Bug fix in ordering of actions in group
Change-Id: I3e7003f55724c2de79589e43e11d05ff4815a81d
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 a76a298..5ecdc7a 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
@@ -54,6 +54,7 @@
import org.slf4j.LoggerFactory;
import java.util.Map;
+import java.util.Objects;
import java.util.Set;
import java.util.concurrent.ExecutorService;
@@ -226,10 +227,11 @@
if (fwd.nextId() != null &&
flowObjectiveStore.getNextGroup(fwd.nextId()) == null) {
log.trace("Queuing forwarding objective for nextId {}", fwd.nextId());
- if (pendingForwards.putIfAbsent(fwd.nextId(),
- Sets.newHashSet(new PendingNext(deviceId, fwd))) != null) {
- Set<PendingNext> pending = pendingForwards.get(fwd.nextId());
- pending.add(new PendingNext(deviceId, fwd));
+ // TODO: change to computeIfAbsent
+ Set<PendingNext> pnext = pendingForwards.putIfAbsent(fwd.nextId(),
+ Sets.newHashSet(new PendingNext(deviceId, fwd)));
+ if (pnext != null) {
+ pnext.add(new PendingNext(deviceId, fwd));
}
return true;
}
@@ -412,5 +414,26 @@
public ForwardingObjective forwardingObjective() {
return fwd;
}
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(deviceId, fwd);
+ }
+
+ @Override
+ public boolean equals(final Object obj) {
+ if (this == obj) {
+ return true;
+ }
+ if (!(obj instanceof PendingNext)) {
+ return false;
+ }
+ final PendingNext other = (PendingNext) obj;
+ if (this.deviceId.equals(other.deviceId) &&
+ this.fwd.equals(other.fwd)) {
+ return true;
+ }
+ return false;
+ }
}
}