Bug fixes for route-path programming

 - Leaves should avoid going through other leaves to reach destination
 - dsNextObjective store should only be purged by new master before a full reroute
 - move full reroute for master change to a different threadpool from retry filters

Change-Id: I33be83bfb90d5848cfe94ed0fcdc17f2cca6d73f
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 864a924..0322201 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
@@ -519,6 +519,7 @@
         deviceListener = null;
         groupHandlerMap.forEach((k, v) -> v.shutdown());
         groupHandlerMap.clear();
+        defaultRoutingHandler.shutdown();
 
         dsNextObjStore.destroy();
         vlanNextObjStore.destroy();
@@ -1284,7 +1285,14 @@
             .forEach(entry -> entry.getValue().cleanUpForNeighborDown(device.id()));
     }
 
+    /**
+     * Purge the destinationSet nextObjective store of entries with this device
+     * as key. Erases app-level knowledge of hashed groups in this device.
+     *
+     * @param devId the device identifier
+     */
     void purgeHashedNextObjectiveStore(DeviceId devId) {
+        log.debug("Purging hashed next-obj store for dev:{}", devId);
         dsNextObjStore.entrySet().stream()
                 .filter(entry -> entry.getKey().deviceId().equals(devId))
                 .forEach(entry -> dsNextObjStore.remove(entry.getKey()));