implemented a distributed default flow registration mechanism to avoid duplicate requests from other onos instances
Change-Id: Ib2abb483456538e3e08e9790c4b4b0d50db8b384
implemented a distributed default flow registration mechanism to avoid
duplicate requests from other onos instances
Change-Id: I620cc51ac29cddaffa73cdbb20e9a9acbdd9ea69
diff --git a/core/net/src/main/java/org/onosproject/net/packet/impl/PacketManager.java b/core/net/src/main/java/org/onosproject/net/packet/impl/PacketManager.java
index 8908601..9177d3a 100644
--- a/core/net/src/main/java/org/onosproject/net/packet/impl/PacketManager.java
+++ b/core/net/src/main/java/org/onosproject/net/packet/impl/PacketManager.java
@@ -23,7 +23,6 @@
import org.apache.felix.scr.annotations.Service;
import org.onosproject.core.ApplicationId;
import org.onosproject.net.Device;
-import org.onosproject.net.MastershipRole;
import org.onosproject.net.device.DeviceEvent;
import org.onosproject.net.device.DeviceListener;
import org.onosproject.net.device.DeviceService;
@@ -33,6 +32,7 @@
import org.onosproject.net.flow.FlowRuleService;
import org.onosproject.net.flow.TrafficSelector;
import org.onosproject.net.flow.TrafficTreatment;
+import org.onosproject.net.packet.DefaultPacketRequest;
import org.onosproject.net.packet.OutboundPacket;
import org.onosproject.net.packet.PacketContext;
import org.onosproject.net.packet.PacketEvent;
@@ -41,6 +41,7 @@
import org.onosproject.net.packet.PacketProvider;
import org.onosproject.net.packet.PacketProviderRegistry;
import org.onosproject.net.packet.PacketProviderService;
+import org.onosproject.net.packet.PacketRequest;
import org.onosproject.net.packet.PacketService;
import org.onosproject.net.packet.PacketStore;
import org.onosproject.net.packet.PacketStoreDelegate;
@@ -48,9 +49,7 @@
import org.onosproject.net.provider.AbstractProviderService;
import org.slf4j.Logger;
-import java.util.Collections;
import java.util.Map;
-import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import static com.google.common.base.Preconditions.checkNotNull;
@@ -82,68 +81,6 @@
private final Map<Integer, PacketProcessor> processors = new ConcurrentHashMap<>();
- private Set<PacketRequest> packetRequests =
- Collections.newSetFromMap(new ConcurrentHashMap<>());
-
- private final class PacketRequest {
- private final TrafficSelector selector;
- private final PacketPriority priority;
- private final ApplicationId appId;
- private final FlowRule.Type tableType;
-
- public PacketRequest(TrafficSelector selector, PacketPriority priority,
- ApplicationId appId, FlowRule.Type tableType) {
- this.selector = selector;
- this.priority = priority;
- this.appId = appId;
- this.tableType = tableType;
- }
-
- public TrafficSelector selector() {
- return selector;
- }
-
- public PacketPriority priority() {
- return priority;
- }
-
- public ApplicationId appId() {
- return appId;
- }
-
- public FlowRule.Type tableType() {
- return tableType;
- }
-
- @Override
- public boolean equals(Object o) {
- if (this == o) {
- return true;
- }
- if (o == null || getClass() != o.getClass()) {
- return false;
- }
-
- PacketRequest that = (PacketRequest) o;
-
- if (priority != that.priority) {
- return false;
- }
- if (!selector.equals(that.selector)) {
- return false;
- }
-
- return true;
- }
-
- @Override
- public int hashCode() {
- int result = selector.hashCode();
- result = 31 * result + priority.hashCode();
- return result;
- }
- }
-
@Activate
public void activate() {
store.setDelegate(delegate);
@@ -177,10 +114,11 @@
checkNotNull(appId, "Application ID cannot be null");
PacketRequest request =
- new PacketRequest(selector, priority, appId, FlowRule.Type.DEFAULT);
+ new DefaultPacketRequest(selector, priority, appId, FlowRule.Type.DEFAULT);
- packetRequests.add(request);
- pushToAllDevices(request);
+ if (store.requestPackets(request)) {
+ pushToAllDevices(request);
+ }
}
@Override
@@ -192,11 +130,12 @@
+ "without table hints, use other methods in the packetService API");
PacketRequest request =
- new PacketRequest(selector, priority, appId, tableType);
+ new DefaultPacketRequest(selector, priority, appId, tableType);
- if (packetRequests.add(request)) {
+ if (store.requestPackets(request)) {
pushToAllDevices(request);
}
+
}
/**
@@ -206,9 +145,7 @@
*/
private void pushToAllDevices(PacketRequest request) {
for (Device device : deviceService.getDevices()) {
- if (deviceService.getRole(device.id()) == MastershipRole.MASTER) {
- pushRule(device, request);
- }
+ pushRule(device, request);
}
}
@@ -303,7 +240,7 @@
public void event(DeviceEvent event) {
Device device = event.subject();
if (event.type() == DeviceEvent.Type.DEVICE_ADDED) {
- for (PacketRequest request : packetRequests) {
+ for (PacketRequest request : store.existingRequests()) {
pushRule(device, request);
}
}