This is an automated email from the ASF dual-hosted git repository.

elsloo pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/trafficcontrol.git

commit 5bc20e189a3796353d56c8bda847191c11ec9e5a
Author: Jeff Elsloo <[email protected]>
AuthorDate: Fri Jan 10 11:00:22 2020 -0700

    Fixed a bug that led to ADMIN_DOWN hosts being served in ETR related 
dynamic responses.
---
 .../traffic_router/core/config/ConfigHandler.java  | 58 ++++++++++++----------
 .../traffic_router/core/edge/CacheRegister.java    | 37 ++++++--------
 2 files changed, 46 insertions(+), 49 deletions(-)

diff --git 
a/traffic_router/core/src/main/java/com/comcast/cdn/traffic_control/traffic_router/core/config/ConfigHandler.java
 
b/traffic_router/core/src/main/java/com/comcast/cdn/traffic_control/traffic_router/core/config/ConfigHandler.java
index c0eb40a..7cc3ee9 100644
--- 
a/traffic_router/core/src/main/java/com/comcast/cdn/traffic_control/traffic_router/core/config/ConfigHandler.java
+++ 
b/traffic_router/core/src/main/java/com/comcast/cdn/traffic_control/traffic_router/core/config/ConfigHandler.java
@@ -883,10 +883,11 @@ public class ConfigHandler {
                return locations;
        }
 
+       @SuppressWarnings("PMD.CyclomaticComplexity")
        private void parseEdgeTrafficRouterLocations(final JsonNode jo, final 
CacheRegister cacheRegister) throws JsonUtilsException {
                final String locationKey = "location";
                final JsonNode trafficRouterJo = JsonUtils.getJsonNode(jo, 
"contentRouters");
-               final Set<TrafficRouterLocation> locations = new 
HashSet<TrafficRouterLocation>(trafficRouterJo.size());
+               final Map<Geolocation, TrafficRouterLocation> locations = new 
HashMap<>();
                final JsonNode trafficRouterLocJo = 
jo.get("trafficRouterLocations");
 
                if (trafficRouterLocJo == null) {
@@ -899,46 +900,49 @@ public class ConfigHandler {
                for (final Iterator<String> trafficRouterNames = 
trafficRouterJo.fieldNames(); trafficRouterNames.hasNext();) {
                final String trafficRouterName = trafficRouterNames.next();
                        final JsonNode trafficRouter = 
trafficRouterJo.get(trafficRouterName);
+
+                       // define here to log invalid ip/ip6 input on catch 
below
+                       String ip = null;
+                       String ip6 = null;
+
                        try {
                                final String trLoc = 
JsonUtils.getString(trafficRouter, locationKey);
                                final Location cl = allLocations.get(trLoc);
 
                                if (cl != null) {
-                                       LOGGER.info("Edge Traffic Router " + 
trafficRouterName + " @ " + trLoc + "; " + cl.getGeolocation().toString());
-                                       locations.add(new 
TrafficRouterLocation(trLoc, cl.getGeolocation()));
-                               } else {
-                                       LOGGER.error("No trafficRouterLocations 
configured for " + trLoc + "; unable to use Edge Traffic Router " + 
trafficRouterName);
-                               }
-
-                       } catch (JsonUtilsException e) {
-                               LOGGER.warn(e,e);
-                       }
-               }
+                                       TrafficRouterLocation 
trafficRouterLocation = locations.get(cl.getGeolocation());
 
-               cacheRegister.setEdgeTrafficRouterLocations(locations);
+                                       if (trafficRouterLocation == null) {
+                                               trafficRouterLocation = new 
TrafficRouterLocation(trLoc, cl.getGeolocation());
+                                               
locations.put(cl.getGeolocation(), trafficRouterLocation);
+                                       }
 
-               for (final Iterator<String> trafficRouterNames = 
trafficRouterJo.fieldNames(); trafficRouterNames.hasNext();) {
-                       final String trafficRouterName = 
trafficRouterNames.next();
-                       final JsonNode trafficRouter = 
trafficRouterJo.get(trafficRouterName);
-                       final String location = 
JsonUtils.getString(trafficRouter, locationKey);
-                       final TrafficRouterLocation trafficRouterLocation = 
cacheRegister.getEdgeTrafficRouterLocation(location);
+                                       final JsonNode status = 
trafficRouter.get("status");
 
-                       if (trafficRouterLocation != null) {
-                               final Node edgeTrafficRouter = new 
Node(trafficRouterName, trafficRouterName, JsonUtils.optInt(jo, "hashCount"));
-                               final String ip = 
JsonUtils.getString(trafficRouter, "ip");
-                               final String ip6 = 
JsonUtils.optString(trafficRouter, "ip6");
-                               
edgeTrafficRouter.setFqdn(JsonUtils.getString(trafficRouter, "fqdn"));
-                               
edgeTrafficRouter.setPort(JsonUtils.getInt(trafficRouter, "port"));
+                                       if (status == null || 
(!"ONLINE".equals(status.asText()) && !"REPORTED".equals(status.asText()))) {
+                                               
LOGGER.warn(String.format("Skipping Edge Traffic Router %s due to %s status", 
trafficRouterName, status));
+                                               continue;
+                                       } else {
+                                               LOGGER.info(String.format("Edge 
Traffic Router %s %s @ %s; %s", status, trafficRouterName, trLoc, 
cl.getGeolocation().toString()));
+                                       }
 
-                               try {
+                                       final Node edgeTrafficRouter = new 
Node(trafficRouterName, trafficRouterName, JsonUtils.optInt(jo, "hashCount"));
+                                       ip = JsonUtils.getString(trafficRouter, 
"ip");
+                                       ip6 = 
JsonUtils.optString(trafficRouter, "ip6");
+                                       
edgeTrafficRouter.setFqdn(JsonUtils.getString(trafficRouter, "fqdn"));
+                                       
edgeTrafficRouter.setPort(JsonUtils.getInt(trafficRouter, "port"));
                                        edgeTrafficRouter.setIpAddress(ip, ip6, 
0);
                                        
trafficRouterLocation.addTrafficRouter(trafficRouterName, edgeTrafficRouter);
-                               } catch (UnknownHostException ex) {
-                                       LOGGER.warn(ex + " : " + ip);
+                               } else {
+                                       LOGGER.error("No Location found for " + 
trLoc + "; unable to use Edge Traffic Router " + trafficRouterName);
                                }
+                       } catch (JsonUtilsException e) {
+                               LOGGER.warn(e, e);
+                       } catch (UnknownHostException ex) {
+                               LOGGER.warn(String.format("%s; input was ip=%s, 
ip6=%s", ex, ip, ip6), ex);
                        }
                }
 
-               cacheRegister.setEdgeTrafficRouterCount();
+               cacheRegister.setEdgeTrafficRouterLocations(locations.values());
        }
 }
diff --git 
a/traffic_router/core/src/main/java/com/comcast/cdn/traffic_control/traffic_router/core/edge/CacheRegister.java
 
b/traffic_router/core/src/main/java/com/comcast/cdn/traffic_control/traffic_router/core/edge/CacheRegister.java
index 8da63df..c802a84 100644
--- 
a/traffic_router/core/src/main/java/com/comcast/cdn/traffic_control/traffic_router/core/edge/CacheRegister.java
+++ 
b/traffic_router/core/src/main/java/com/comcast/cdn/traffic_control/traffic_router/core/edge/CacheRegister.java
@@ -15,13 +15,7 @@
 
 package com.comcast.cdn.traffic_control.traffic_router.core.edge;
 
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.TreeSet;
+import java.util.*;
 
 import com.fasterxml.jackson.databind.JsonNode;
 
@@ -74,20 +68,8 @@ public class CacheRegister {
                return new 
ArrayList<TrafficRouterLocation>(edgeTrafficRouterLocations.values());
        }
 
-       public void setEdgeTrafficRouterCount() {
-               int count = 0;
-
-               for (final TrafficRouterLocation location : 
getEdgeTrafficRouterLocations()) {
-                       final List<Node> trafficRouters = 
location.getTrafficRouters();
-
-                       if (trafficRouters == null) {
-                               continue;
-                       }
-
-                       count += trafficRouters.size();
-               }
-
-               edgeTrafficRouterCount = count;
+       private void setEdgeTrafficRouterCount(final int count) {
+               this.edgeTrafficRouterCount = count;
        }
 
        public int getEdgeTrafficRouterCount() {
@@ -117,11 +99,22 @@ public class CacheRegister {
                }
        }
 
-       public void setEdgeTrafficRouterLocations(final 
Set<TrafficRouterLocation> locations) {
+       public void setEdgeTrafficRouterLocations(final 
Collection<TrafficRouterLocation> locations) {
+               int count = 0;
+
                edgeTrafficRouterLocations.clear();
+
                for (final TrafficRouterLocation newLoc : locations) {
                        edgeTrafficRouterLocations.put(newLoc.getId(), newLoc);
+
+                       final List<Node> trafficRouters = 
newLoc.getTrafficRouters();
+
+                       if (trafficRouters != null) {
+                               count += trafficRouters.size();
+                       }
                }
+
+               setEdgeTrafficRouterCount(count);
        }
 
        public boolean hasEdgeTrafficRouters() {

Reply via email to