Implemented CORD-1843 to avoid race condition when updating ECMPspgs.
In this commit:
- a new mechanism in DefaultRoutingHandler to update route-path maps in all instances,
for the entire topology, after every route event has been processesed.
- fixed a race condition in LinkHandler
- avoids retrying flows in the ofdpa3 driver as this issue has been fixed in the switch
- a new CLI command to check internal link state
Change-Id: I307d0a96cc46569294d15d042b3bcb1fde735f1b
diff --git a/drivers/default/src/main/java/org/onosproject/driver/pipeline/ofdpa/Ofdpa2Pipeline.java b/drivers/default/src/main/java/org/onosproject/driver/pipeline/ofdpa/Ofdpa2Pipeline.java
index ff9f2c0..661d3e9 100644
--- a/drivers/default/src/main/java/org/onosproject/driver/pipeline/ofdpa/Ofdpa2Pipeline.java
+++ b/drivers/default/src/main/java/org/onosproject/driver/pipeline/ofdpa/Ofdpa2Pipeline.java
@@ -252,6 +252,16 @@
return true;
}
+ /**
+ * Determines whether this driver should continue to retry flows that point
+ * to empty groups. See CORD-554.
+ *
+ * @return true if the driver should retry flows
+ */
+ protected boolean shouldRetry() {
+ return true;
+ }
+
//////////////////////////////////////
// Flow Objectives
//////////////////////////////////////
@@ -1276,11 +1286,14 @@
return Collections.emptySet();
}
tb.deferred().group(group.id());
- // check if group is empty
+ // retrying flows may be necessary due to bug CORD-554
if (gkeys.size() == 1 && gkeys.get(0).size() == 1) {
- log.warn("Found empty group 0x{} in dev:{} .. will retry fwd:{}",
- Integer.toHexString(group.id().id()), deviceId, fwd.id());
- emptyGroup = true;
+ if (shouldRetry()) {
+ log.warn("Found empty group 0x{} in dev:{} .. will retry fwd:{}",
+ Integer.toHexString(group.id().id()), deviceId,
+ fwd.id());
+ emptyGroup = true;
+ }
}
} else {
log.warn("Cannot find group for nextId:{} in dev:{}. Aborting fwd:{}",
@@ -1322,7 +1335,7 @@
);
log.debug("Default rule 0.0.0.0/0 is being installed two rules");
}
- // XXX retrying flows may be necessary due to bug CORD-554
+
if (emptyGroup) {
executorService.schedule(new RetryFlows(fwd, flowRuleCollection),
RETRY_MS, TimeUnit.MILLISECONDS);