Prevent NPE if an event comes in during start up
Change-Id: I00c3a8c587c382c551d2b7212cf3d689c872fe1d
diff --git a/apps/segmentrouting/app/src/main/java/org/onosproject/segmentrouting/SegmentRoutingManager.java b/apps/segmentrouting/app/src/main/java/org/onosproject/segmentrouting/SegmentRoutingManager.java
index 20c1148..d4bea57 100644
--- a/apps/segmentrouting/app/src/main/java/org/onosproject/segmentrouting/SegmentRoutingManager.java
+++ b/apps/segmentrouting/app/src/main/java/org/onosproject/segmentrouting/SegmentRoutingManager.java
@@ -273,6 +273,7 @@
final InternalClusterListener clusterListener = new InternalClusterListener();
//Completable future for network configuration process to buffer config events handling during activation
private CompletableFuture<Boolean> networkConfigCompletion = null;
+ private final Object networkConfigCompletionLock = new Object();
private List<Event> queuedEvents = new CopyOnWriteArrayList<>();
// Handles device, link, topology and network config events
@@ -478,14 +479,16 @@
linkHandler.init();
l2TunnelHandler.init();
- networkConfigCompletion.whenComplete((value, ex) -> {
- //setting to null for easier fall through
- networkConfigCompletion = null;
- //process all queued events
- queuedEvents.forEach(event -> {
- mainEventExecutor.execute(new InternalEventHandler(event));
+ synchronized (networkConfigCompletionLock) {
+ networkConfigCompletion.whenComplete((value, ex) -> {
+ //setting to null for easier fall through
+ networkConfigCompletion = null;
+ //process all queued events
+ queuedEvents.forEach(event -> {
+ mainEventExecutor.execute(new InternalEventHandler(event));
+ });
});
- });
+ }
log.info("Started");
}
@@ -1534,30 +1537,32 @@
// The completable future is needed because of the async behaviour of the configureNetwork,
// listener registration and event arrival
// Enables us to buffer the events and execute them when the configure network is done.
- networkConfigCompletion = new CompletableFuture<>();
+ synchronized (networkConfigCompletionLock) {
+ networkConfigCompletion = new CompletableFuture<>();
- // add a small delay to absorb multiple network config added notifications
- if (!programmingScheduled.get()) {
- log.info("Buffering config calls for {} secs", PROGRAM_DELAY);
- programmingScheduled.set(true);
- mainEventExecutor.schedule(new ConfigChange(), PROGRAM_DELAY, TimeUnit.SECONDS);
+ // add a small delay to absorb multiple network config added notifications
+ if (!programmingScheduled.get()) {
+ log.info("Buffering config calls for {} secs", PROGRAM_DELAY);
+ programmingScheduled.set(true);
+ mainEventExecutor.schedule(new ConfigChange(), PROGRAM_DELAY, TimeUnit.SECONDS);
+ }
+
+ createOrUpdateDeviceConfiguration();
+
+ arpHandler = new ArpHandler(srManager);
+ icmpHandler = new IcmpHandler(srManager);
+ ipHandler = new IpHandler(srManager);
+ routingRulePopulator = new RoutingRulePopulator(srManager);
+ createOrUpdateDefaultRoutingHandler();
+
+ tunnelHandler = new TunnelHandler(linkService, deviceConfiguration,
+ groupHandlerMap, tunnelStore);
+ policyHandler = new PolicyHandler(appId, deviceConfiguration,
+ flowObjectiveService,
+ tunnelHandler, policyStore);
+ networkConfigCompletion.complete(true);
}
- createOrUpdateDeviceConfiguration();
-
- arpHandler = new ArpHandler(srManager);
- icmpHandler = new IcmpHandler(srManager);
- ipHandler = new IpHandler(srManager);
- routingRulePopulator = new RoutingRulePopulator(srManager);
- createOrUpdateDefaultRoutingHandler();
-
- tunnelHandler = new TunnelHandler(linkService, deviceConfiguration,
- groupHandlerMap, tunnelStore);
- policyHandler = new PolicyHandler(appId, deviceConfiguration,
- flowObjectiveService,
- tunnelHandler, policyStore);
- networkConfigCompletion.complete(true);
-
mcastHandler.init();
}