Refactor: install rules in a separated thread to avoid thread blocking
Change-Id: I10ff88fb56f9358ec948f01176d6fe20d91e37c0
diff --git a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackRoutingFloatingIpHandler.java b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackRoutingFloatingIpHandler.java
index 732275c..15d2f96 100644
--- a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackRoutingFloatingIpHandler.java
+++ b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackRoutingFloatingIpHandler.java
@@ -85,7 +85,7 @@
import static org.onosproject.openstacknetworking.util.OpenstackNetworkingUtil.getGwByComputeDevId;
import static org.onosproject.openstacknetworking.util.OpenstackNetworkingUtil.getGwByInstancePort;
import static org.onosproject.openstacknetworking.util.OpenstackNetworkingUtil.isAssociatedWithVM;
-import static org.onosproject.openstacknetworking.util.OpenstackNetworkingUtil.processGratuitousArpPacketForFloatingIp;
+import static org.onosproject.openstacknetworking.util.OpenstackNetworkingUtil.processGarpPacketForFloatingIp;
import static org.onosproject.openstacknetworking.util.OpenstackNetworkingUtil.swapStaleLocation;
import static org.onosproject.openstacknetworking.util.RulePopulatorUtil.buildExtension;
import static org.onosproject.openstacknode.api.OpenstackNode.NodeType.GATEWAY;
@@ -440,7 +440,8 @@
}
private void setUpstreamRules(NetFloatingIP floatingIp, Network osNet,
- InstancePort instPort, ExternalPeerRouter externalPeerRouter,
+ InstancePort instPort,
+ ExternalPeerRouter externalPeerRouter,
boolean install) {
IpAddress floating = IpAddress.valueOf(floatingIp.getFloatingIpAddress());
TrafficSelector.Builder sBuilder = DefaultTrafficSelector.builder()
@@ -515,12 +516,13 @@
ExternalPeerRouter externalPeerRouter =
externalPeerRouterForNetwork(osNet, osNetworkService, osRouterAdminService);
if (externalPeerRouter == null) {
- log.error("Failed to process GARP packet for floating ip {} because no external peer router found");
+ log.error("Failed to process GARP packet for floating ip {} " +
+ "because no external peer router found");
return;
}
- processGratuitousArpPacketForFloatingIp(floatingIP, instancePort, externalPeerRouter.vlanId(),
- selectedGw, packetService);
+ processGarpPacketForFloatingIp(floatingIP, instancePort,
+ externalPeerRouter.vlanId(), selectedGw, packetService);
}
@@ -604,7 +606,8 @@
preCommitPortService.unsubscribePreCommit(osFip.getPortId(),
OPENSTACK_PORT_PRE_REMOVE, instancePortService,
this.getClass().getName());
- log.info("Unsubscribed the port {} on listening pre-remove event", osFip.getPortId());
+ log.info("Unsubscribed the port {} on listening pre-remove event",
+ osFip.getPortId());
}
log.info("Removed floating IP {}", osFip.getFloatingIpAddress());
});
@@ -746,17 +749,19 @@
switch (event.type()) {
case OPENSTACK_INSTANCE_PORT_DETECTED:
- if (instPort != null && instPort.portId() != null) {
- osRouterAdminService.floatingIps().stream()
- .filter(f -> f.getPortId() != null)
- .filter(f -> f.getPortId().equals(instPort.portId()))
- .forEach(f -> setFloatingIpRules(f, instPort, null, true));
- }
+ eventExecutor.execute(() -> {
+ if (instPort != null && instPort.portId() != null) {
+ osRouterAdminService.floatingIps().stream()
+ .filter(f -> f.getPortId() != null)
+ .filter(f -> f.getPortId().equals(instPort.portId()))
+ .forEach(f -> setFloatingIpRules(f,
+ instPort, null, true));
+ }
+ });
break;
case OPENSTACK_INSTANCE_MIGRATION_STARTED:
-
fip = associatedFloatingIp(event.subject(), ips);
if (fip == null) {
@@ -765,7 +770,8 @@
osPort = osNetworkService.port(fip.getPortId());
osNet = osNetworkService.network(osPort.getNetworkId());
- externalPeerRouter = externalPeerRouterForNetwork(osNet, osNetworkService, osRouterAdminService);
+ externalPeerRouter = externalPeerRouterForNetwork(osNet,
+ osNetworkService, osRouterAdminService);
if (externalPeerRouter == null) {
final String errorFormat = ERR_FLOW + "no external peer router found";
@@ -798,7 +804,8 @@
osPort = osNetworkService.port(fip.getPortId());
osNet = osNetworkService.network(osPort.getNetworkId());
- externalPeerRouter = externalPeerRouterForNetwork(osNet, osNetworkService, osRouterAdminService);
+ externalPeerRouter = externalPeerRouterForNetwork(osNet,
+ osNetworkService, osRouterAdminService);
if (externalPeerRouter == null) {
final String errorFormat = ERR_FLOW + "no external peer router found";
@@ -859,29 +866,31 @@
public void event(OpenstackNetworkEvent event) {
switch (event.type()) {
case OPENSTACK_PORT_PRE_REMOVE:
- InstancePort instPort =
- instancePortService.instancePort(event.port().getId());
-
- if (instPort == null) {
- break;
- }
-
- NetFloatingIP fip =
- associatedFloatingIp(instPort, osRouterAdminService.floatingIps());
-
- if (fip != null) {
- instancePortService.updateInstancePort(
- instPort.updateState(REMOVE_PENDING));
- eventExecutor.execute(() -> updateFipStore(event.port().getId()));
- } else {
- instancePortService.removeInstancePort(instPort.portId());
- }
+ eventExecutor.execute(() -> processPortPreRemove(event));
break;
default:
break;
}
}
+ private void processPortPreRemove(OpenstackNetworkEvent event) {
+ InstancePort instPort = instancePortService.instancePort(
+ event.port().getId());
+ if (instPort == null) {
+ return;
+ }
+ NetFloatingIP fip = associatedFloatingIp(instPort,
+ osRouterAdminService.floatingIps());
+
+ if (fip != null) {
+ instancePortService.updateInstancePort(
+ instPort.updateState(REMOVE_PENDING));
+ updateFipStore(event.port().getId());
+ } else {
+ instancePortService.removeInstancePort(instPort.portId());
+ }
+ }
+
private void updateFipStore(String portId) {
if (portId == null) {