Fix the side effects introduced by https://gerrit.onosproject.org/#/c/10978/
Change-Id: I88f84f28d9c5243c6ce42c81914b0f87e41bbd3e
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 93a727f..8ce67cd 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
@@ -253,12 +253,38 @@
return queued;
}
- // Retrieves the device pipeline behaviour from the cache.
+ /**
+ * Retrieves (if it exists) the device pipeline behaviour from the cache.
+ * Otherwise it warms the caches and triggers the init method of the Pipeline.
+ *
+ * @param deviceId the id of the device associated to the pipeline
+ * @return the implementation of the Pipeliner behaviour
+ */
private Pipeliner getDevicePipeliner(DeviceId deviceId) {
return pipeliners.computeIfAbsent(deviceId, this::initPipelineHandler);
}
/**
+ * Retrieves (if it exists) the device pipeline behaviour from the cache and
+ * and triggers the init method of the pipeline. Otherwise (DEVICE_ADDED) it warms
+ * the caches and triggers the init method of the Pipeline. The rationale of this
+ * method is for managing the scenario of a switch that goes down for a failure
+ * and goes up after a while.
+ *
+ * @param deviceId the id of the device associated to the pipeline
+ * @return the implementation of the Pipeliner behaviour
+ */
+ private Pipeliner getAndInitDevicePipeliner(DeviceId deviceId) {
+ return pipeliners.compute(deviceId, (deviceIdValue, pipelinerValue) -> {
+ if (pipelinerValue != null) {
+ pipelinerValue.init(deviceId, context);
+ return pipelinerValue;
+ }
+ return this.initPipelineHandler(deviceId);
+ });
+ }
+
+ /**
* Creates and initialize {@link Pipeliner}.
* <p>
* Note: Expected to be called under per-Device lock.
@@ -315,7 +341,7 @@
event.subject().id());
if (deviceService.isAvailable(event.subject().id())) {
log.debug("Device is now available {}", event.subject().id());
- getDevicePipeliner(event.subject().id());
+ getAndInitDevicePipeliner(event.subject().id());
} else {
log.debug("Device is no longer available {}", event.subject().id());
}