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() {
