@ONOS-2379 Improve the efficiency of blackhole solution by reusing shortest paths to the same src for each src/dst pair

Change-Id: I680c94ce2693000acdd06b5d8d762219eb9a320f
diff --git a/apps/fwd/src/main/java/org/onosproject/fwd/ReactiveForwarding.java b/apps/fwd/src/main/java/org/onosproject/fwd/ReactiveForwarding.java
index 3225f81..ccb66ad 100644
--- a/apps/fwd/src/main/java/org/onosproject/fwd/ReactiveForwarding.java
+++ b/apps/fwd/src/main/java/org/onosproject/fwd/ReactiveForwarding.java
@@ -73,7 +73,9 @@
 import org.slf4j.Logger;
 
 import java.util.Dictionary;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 import java.util.Objects;
 import java.util.Set;
 
@@ -692,6 +694,8 @@
         Set<FlowEntry> rules =  getFlowRulesFrom(egress);
         Set<SrcDstPair> pairs = findSrcDstPairs(rules);
 
+        Map<DeviceId, Set<Path>> srcPaths = new HashMap<>();
+
         for (SrcDstPair sd: pairs) {
             // get the edge deviceID for the src host
             DeviceId srcId = hostService.getHost(HostId.hostId(sd.src)).location().deviceId();
@@ -700,8 +704,11 @@
 
             cleanFlowRules(sd, egress.deviceId());
 
-            Set<Path> shortestPaths =
-                    topologyService.getPaths(topologyService.currentTopology(), egress.deviceId(), srcId);
+            Set<Path> shortestPaths = srcPaths.get(srcId);
+            if (shortestPaths == null) {
+                shortestPaths = topologyService.getPaths(topologyService.currentTopology(), egress.deviceId(), srcId);
+                srcPaths.put(srcId, shortestPaths);
+            }
             backTrackBadNodes(shortestPaths, dstId, sd);
         }
     }