Fix: do not query the distributed store inside main thread
Change-Id: I883030cb661b619f82bd554c21a48bb39f3fbbe6
diff --git a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackSwitchingHandler.java b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackSwitchingHandler.java
index 47fad9d..14fd5da 100644
--- a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackSwitchingHandler.java
+++ b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackSwitchingHandler.java
@@ -17,11 +17,6 @@
package org.onosproject.openstacknetworking.impl;
import com.google.common.base.Strings;
-import org.osgi.service.component.annotations.Activate;
-import org.osgi.service.component.annotations.Component;
-import org.osgi.service.component.annotations.Deactivate;
-import org.osgi.service.component.annotations.Reference;
-import org.osgi.service.component.annotations.ReferenceCardinality;
import org.onlab.packet.Ethernet;
import org.onlab.packet.VlanId;
import org.onosproject.cfg.ComponentConfigService;
@@ -52,6 +47,11 @@
import org.openstack4j.model.network.Network;
import org.openstack4j.model.network.NetworkType;
import org.openstack4j.model.network.Port;
+import org.osgi.service.component.annotations.Activate;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.Deactivate;
+import org.osgi.service.component.annotations.Reference;
+import org.osgi.service.component.annotations.ReferenceCardinality;
import org.slf4j.Logger;
import java.util.Objects;
@@ -76,6 +76,7 @@
import static org.onosproject.openstacknetworking.api.Constants.PRIORITY_TUNNEL_TAG_RULE;
import static org.onosproject.openstacknetworking.api.Constants.STAT_FLAT_OUTBOUND_TABLE;
import static org.onosproject.openstacknetworking.api.Constants.VTAG_TABLE;
+import static org.onosproject.openstacknetworking.api.InstancePortEvent.Type.OPENSTACK_INSTANCE_MIGRATION_STARTED;
import static org.onosproject.openstacknetworking.util.OpenstackNetworkingUtil.getPropertyValue;
import static org.onosproject.openstacknetworking.util.OpenstackNetworkingUtil.swapStaleLocation;
import static org.onosproject.openstacknetworking.util.RulePopulatorUtil.buildExtension;
@@ -677,7 +678,8 @@
}
private String getArpMode() {
- Set<ConfigProperty> properties = configService.getProperties(OpenstackSwitchingArpHandler.class.getName());
+ Set<ConfigProperty> properties =
+ configService.getProperties(OpenstackSwitchingArpHandler.class.getName());
return getPropertyValue(properties, ARP_MODE);
}
@@ -690,38 +692,58 @@
*/
private class InternalInstancePortListener implements InstancePortListener {
- @Override
- public boolean isRelevant(InstancePortEvent event) {
- InstancePort instPort = event.subject();
- return mastershipService.isLocalMaster(instPort.deviceId());
+ private boolean isRelevantHelper(InstancePortEvent event) {
+ return mastershipService.isLocalMaster(event.subject().deviceId());
}
@Override
public void event(InstancePortEvent event) {
InstancePort instPort = event.subject();
- Port osPort = osNetworkService.port(instPort.portId());
switch (event.type()) {
case OPENSTACK_INSTANCE_PORT_DETECTED:
case OPENSTACK_INSTANCE_PORT_UPDATED:
+ case OPENSTACK_INSTANCE_MIGRATION_STARTED:
case OPENSTACK_INSTANCE_RESTARTED:
- log.info("SwitchingHandler: Instance port detected MAC:{} IP:{}",
+
+ if (event.type() == OPENSTACK_INSTANCE_MIGRATION_STARTED) {
+ log.info("SwitchingHandler: Migration started at MAC:{} IP:{}",
instPort.macAddress(),
instPort.ipAddress());
-
- eventExecutor.execute(() -> instPortDetected(instPort));
-
- if (osPort != null) {
- eventExecutor.execute(() ->
- setPortBlockRules(instPort, !osPort.isAdminStateUp()));
+ } else {
+ log.info("SwitchingHandler: Instance port detected MAC:{} IP:{}",
+ instPort.macAddress(),
+ instPort.ipAddress());
}
+ eventExecutor.execute(() -> {
+
+ if (!isRelevantHelper(event)) {
+ return;
+ }
+
+ instPortDetected(instPort);
+
+ Port osPort = osNetworkService.port(instPort.portId());
+
+ if (osPort != null) {
+ setPortBlockRules(instPort, !osPort.isAdminStateUp());
+ }
+ });
+
break;
case OPENSTACK_INSTANCE_TERMINATED:
log.info("SwitchingHandler: Instance port terminated MAC:{} IP:{}",
instPort.macAddress(),
instPort.ipAddress());
- eventExecutor.execute(() -> removeVportRules(instPort));
+ eventExecutor.execute(() -> {
+
+ if (!isRelevantHelper(event)) {
+ return;
+ }
+
+ removeVportRules(instPort);
+ });
break;
case OPENSTACK_INSTANCE_PORT_VANISHED:
@@ -729,24 +751,20 @@
instPort.macAddress(),
instPort.ipAddress());
- eventExecutor.execute(() -> instPortRemoved(instPort));
+ eventExecutor.execute(() -> {
- if (osPort != null) {
- setPortBlockRules(instPort, false);
- }
+ if (!isRelevantHelper(event)) {
+ return;
+ }
- break;
- case OPENSTACK_INSTANCE_MIGRATION_STARTED:
- log.info("SwitchingHandler: Migration started for MAC:{} IP:{}",
- instPort.macAddress(),
- instPort.ipAddress());
+ instPortRemoved(instPort);
- eventExecutor.execute(() -> instPortDetected(instPort));
+ Port osPort = osNetworkService.port(instPort.portId());
- if (osPort != null) {
- eventExecutor.execute(() ->
- setPortBlockRules(instPort, !osPort.isAdminStateUp()));
- }
+ if (osPort != null) {
+ setPortBlockRules(instPort, false);
+ }
+ });
break;
case OPENSTACK_INSTANCE_MIGRATION_ENDED:
@@ -755,7 +773,14 @@
instPort.ipAddress());
InstancePort revisedInstPort = swapStaleLocation(instPort);
- eventExecutor.execute(() -> removeVportRules(revisedInstPort));
+ eventExecutor.execute(() -> {
+
+ if (!isRelevantHelper(event)) {
+ return;
+ }
+
+ removeVportRules(revisedInstPort);
+ });
break;
default:
@@ -778,19 +803,16 @@
@Override
public boolean isRelevant(OpenstackNetworkEvent event) {
+ return event.subject() != null && event.port() != null;
+ }
- // do not allow to proceed without leadership
- NodeId leader = leadershipService.getLeader(appId.name());
- return Objects.equals(localNodeId, leader);
+ private boolean isRelevantHelper() {
+ return Objects.equals(localNodeId, leadershipService.getLeader(appId.name()));
}
@Override
public void event(OpenstackNetworkEvent event) {
- if (event.subject() == null || event.port() == null) {
- return;
- }
-
boolean isNwAdminStateUp = event.subject().isAdminStateUp();
boolean isPortAdminStateUp = event.port().isAdminStateUp();
@@ -799,17 +821,33 @@
switch (event.type()) {
case OPENSTACK_NETWORK_CREATED:
case OPENSTACK_NETWORK_UPDATED:
- eventExecutor.execute(() ->
- setNetworkBlockRules(event.subject(), !isNwAdminStateUp));
+ eventExecutor.execute(() -> {
+ if (!isRelevantHelper()) {
+ return;
+ }
+
+ setNetworkBlockRules(event.subject(), !isNwAdminStateUp);
+ });
break;
case OPENSTACK_NETWORK_REMOVED:
- eventExecutor.execute(() ->
- setNetworkBlockRules(event.subject(), false));
+ eventExecutor.execute(() -> {
+
+ if (!isRelevantHelper()) {
+ return;
+ }
+
+ setNetworkBlockRules(event.subject(), false);
+ });
break;
case OPENSTACK_PORT_CREATED:
case OPENSTACK_PORT_UPDATED:
eventExecutor.execute(() -> {
+
+ if (!isRelevantHelper()) {
+ return;
+ }
+
InstancePort instPort = instancePortService.instancePort(portId);
if (instPort != null) {
setPortBlockRules(instPort, !isPortAdminStateUp);
@@ -818,6 +856,11 @@
break;
case OPENSTACK_PORT_REMOVED:
eventExecutor.execute(() -> {
+
+ if (!isRelevantHelper()) {
+ return;
+ }
+
InstancePort instPort = instancePortService.instancePort(portId);
if (instPort != null) {
setPortBlockRules(instPort, false);