diff --git a/CHANGELOG.md b/CHANGELOG.md index 01271dd0d5..04c45b4d47 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -42,6 +42,7 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/). - [#7602](https://github.com/apache/trafficcontrol/pull/7602) *t3c* added installed package data to t3c-apply-metadata.json - [#7618](https://github.com/apache/trafficcontrol/pull/7618) *Traffic Portal* Add the ability to inspect a user provider cert, or the cert chain on DS SSL keys. - [#7619](https://github.com/apache/trafficcontrol/pull/7619) Traffic Ops* added optional field `oauth_user_attribute` for OAuth login credentials +- [#7641](https://github.com/apache/trafficcontrol/pull/7641) *Traffic Router* Added further optimization to TR's algorithm of figuring out the zone for an incoming request. ### Changed - [#7584](https://github.com/apache/trafficcontrol/pull/7584) *Documentation* Upgrade Traffic Control Sphinx documentation Makefile OS intelligent. diff --git a/traffic_router/core/src/main/java/org/apache/traffic_control/traffic_router/core/config/ConfigHandler.java b/traffic_router/core/src/main/java/org/apache/traffic_control/traffic_router/core/config/ConfigHandler.java index 64cde8bfbd..26a7c0e6ff 100644 --- a/traffic_router/core/src/main/java/org/apache/traffic_control/traffic_router/core/config/ConfigHandler.java +++ b/traffic_router/core/src/main/java/org/apache/traffic_control/traffic_router/core/config/ConfigHandler.java @@ -102,11 +102,16 @@ public class ConfigHandler { private final AtomicBoolean cancelled = new AtomicBoolean(false); private final AtomicBoolean isProcessing = new AtomicBoolean(false); + private final Map fqdnToDeliveryService = new HashMap<>(); private final static String NEUSTAR_POLLING_URL = "neustar.polling.url"; private final static String NEUSTAR_POLLING_INTERVAL = "neustar.polling.interval"; private final static String LOCALIZATION_METHODS = "localizationMethods"; + public Map getFQDNToDeliveryServiceMap() { + return fqdnToDeliveryService; + } + public String getConfigDir() { return configDir; } @@ -182,7 +187,7 @@ public boolean processConfig(final String jsonStr) throws JsonUtilsException, IO cacheRegister.setStats(stats); parseTrafficOpsConfig(config, stats); - final Map deliveryServiceMap = parseDeliveryServiceConfig(JsonUtils.getJsonNode(jo, deliveryServicesKey)); + final Map deliveryServiceMap = parseDeliveryServiceConfig(JsonUtils.getJsonNode(jo, deliveryServicesKey), cacheRegister); parseCertificatesConfig(config); certificatesPublisher.setDeliveryServicesJson(deliveryServicesJson); @@ -448,7 +453,7 @@ private void parseCacheConfig(final JsonNode contentServers, final CacheRegister statTracker.initialize(statMap, cacheRegister); } - private Map parseDeliveryServiceConfig(final JsonNode allDeliveryServices) throws JsonUtilsException { + private Map parseDeliveryServiceConfig(final JsonNode allDeliveryServices, final CacheRegister cacheRegister) throws JsonUtilsException { final Map deliveryServiceMap = new HashMap<>(); final Iterator deliveryServiceIter = allDeliveryServices.fieldNames(); @@ -469,6 +474,9 @@ private Map parseDeliveryServiceConfig(final JsonNode a deliveryService.setDns(isDns); deliveryServiceMap.put(deliveryServiceId, deliveryService); + fqdnToDeliveryService.put(deliveryService.getRoutingName() + "." + deliveryService.getDomain(), deliveryService); + fqdnToDeliveryService.put("_." + deliveryService.getDomain(), deliveryService); + cacheRegister.setFQDNToDeliveryServiceMap(fqdnToDeliveryService); } return deliveryServiceMap; diff --git a/traffic_router/core/src/main/java/org/apache/traffic_control/traffic_router/core/edge/CacheRegister.java b/traffic_router/core/src/main/java/org/apache/traffic_control/traffic_router/core/edge/CacheRegister.java index e6de36b29d..37049cd141 100644 --- a/traffic_router/core/src/main/java/org/apache/traffic_control/traffic_router/core/edge/CacheRegister.java +++ b/traffic_router/core/src/main/java/org/apache/traffic_control/traffic_router/core/edge/CacheRegister.java @@ -32,6 +32,7 @@ public class CacheRegister { private Map allCaches; private TreeSet deliveryServiceMatchers; private Map dsMap; + private Map fqdnToDeliveryServiceMap; private JsonNode config; private JsonNode stats; private int edgeTrafficRouterCount; @@ -148,6 +149,14 @@ public void setDeliveryServiceMatchers(final TreeSet mat * @return the DeliveryService that matches the request */ public DeliveryService getDeliveryService(final Request request) { + final String requestName = request.getHostname(); + final Map map = getFQDNToDeliveryServiceMap(); + if (map != null) { + final DeliveryService ds = map.get(requestName); + if (ds != null) { + return ds; + } + } if (deliveryServiceMatchers == null) { return null; } @@ -179,6 +188,14 @@ public void setDeliveryServiceMap(final Map dsMap) { this.dsMap = dsMap; } + public Map getFQDNToDeliveryServiceMap() { + return fqdnToDeliveryServiceMap; + } + + public void setFQDNToDeliveryServiceMap(final Map fqdnToDeliveryServiceMap) { + this.fqdnToDeliveryServiceMap = fqdnToDeliveryServiceMap; + } + public JsonNode getTrafficRouters() { return trafficRouters; } diff --git a/traffic_router/core/src/test/java/org/apache/traffic_control/traffic_router/core/edge/CacheRegisterTest.java b/traffic_router/core/src/test/java/org/apache/traffic_control/traffic_router/core/edge/CacheRegisterTest.java index 471167fcb6..07f338e205 100644 --- a/traffic_router/core/src/test/java/org/apache/traffic_control/traffic_router/core/edge/CacheRegisterTest.java +++ b/traffic_router/core/src/test/java/org/apache/traffic_control/traffic_router/core/edge/CacheRegisterTest.java @@ -15,13 +15,23 @@ package org.apache.traffic_control.traffic_router.core.edge; +import com.fasterxml.jackson.databind.node.ArrayNode; +import com.fasterxml.jackson.databind.node.JsonNodeFactory; +import com.fasterxml.jackson.databind.node.ObjectNode; import org.apache.traffic_control.traffic_router.core.ds.DeliveryService; import org.apache.traffic_control.traffic_router.core.ds.DeliveryServiceMatcher; +import org.apache.traffic_control.traffic_router.core.request.DNSRequest; import org.apache.traffic_control.traffic_router.core.request.HTTPRequest; import org.apache.traffic_control.traffic_router.core.request.Request; +import org.apache.traffic_control.traffic_router.core.util.JsonUtilsException; import org.junit.Before; import org.junit.Test; +import org.xbill.DNS.Name; +import org.xbill.DNS.TextParseException; +import org.xbill.DNS.Type; +import java.util.HashMap; +import java.util.Map; import java.util.TreeSet; import static org.apache.traffic_control.traffic_router.core.ds.DeliveryServiceMatcher.Type.HOST; @@ -90,4 +100,75 @@ public void itReturnsNullForDeliveryServiceWhenItHasNoMatchers() { httpRequest.setPath("foo/abcde/bar"); assertThat(cacheRegister.getDeliveryService(httpRequest), nullValue()); } + + @Test + public void itReturnsDeliveryServiceFromFQDNMapForHTTPRequest() throws JsonUtilsException { + String requestName = "http://foo.service01.kabletown.com/"; + HTTPRequest httpRequest = new HTTPRequest(); + httpRequest.setHostname("foo.service01.kabletown.com"); + httpRequest.setRequestedUrl(requestName); + Map map = new HashMap<>(); + + ObjectNode node = JsonNodeFactory.instance.objectNode(); + ArrayNode domainNode = node.putArray("domains"); + domainNode.add("kabletown.com"); + node.put("routingName","foo"); + node.put("coverageZoneOnly", false); + DeliveryService ds = new DeliveryService("service01", node); + + map.put("foo.service01.kabletown.com", ds); + map.put("_.service01.kabletown.com", ds); + cacheRegister.setFQDNToDeliveryServiceMap(map); + + DeliveryService answer = cacheRegister.getDeliveryService(httpRequest); + assertThat("FQDNToDeliveryServiceMap was expected to have the key foo.service01.kabletown.com", + cacheRegister.getFQDNToDeliveryServiceMap().containsKey("foo.service01.kabletown.com")); + assertThat("Returned Delivery Service was expected to have the ID service01", + answer.getId().equals("service01")); + + + httpRequest.setRequestedUrl("http://_.service01.kabletown.com"); + answer = cacheRegister.getDeliveryService(httpRequest); + assertThat("FQDNToDeliveryServiceMap was expected to have the key _.service01.kabletown.com", + cacheRegister.getFQDNToDeliveryServiceMap().containsKey("_.service01.kabletown.com")); + assertThat("Returned Delivery Service was expected to have the ID service01", + answer.getId().equals("service01")); + } + + @Test + public void itReturnsDeliveryServiceFromFQDNMapForDNSRequest() throws JsonUtilsException, TextParseException { + final Name name = Name.fromString("edge.example.com."); + DNSRequest dnsRequest = new DNSRequest("example.com", name, Type.A); + dnsRequest.setClientIP("10.10.10.10"); + dnsRequest.setHostname(name.relativize(Name.root).toString()); + + Map map = new HashMap<>(); + + ObjectNode node = JsonNodeFactory.instance.objectNode(); + ArrayNode domainNode = node.putArray("domains"); + domainNode.add("example.com"); + node.put("routingName","edge"); + node.put("coverageZoneOnly", false); + DeliveryService ds = new DeliveryService("example", node); + + map.put("edge.example.com", ds); + map.put("_.example.com", ds); + cacheRegister.setFQDNToDeliveryServiceMap(map); + + DeliveryService answer = cacheRegister.getDeliveryService(dnsRequest); + assertThat("FQDNToDeliveryServiceMap was expected to have the key edge.example.com", + cacheRegister.getFQDNToDeliveryServiceMap().containsKey("edge.example.com")); + assertThat("Returned Delivery Service was expected to have the ID example", + answer.getId().equals("example")); + + final Name underscoreName = Name.fromString("_.example.com"); + dnsRequest = new DNSRequest("example.com", underscoreName, Type.A); + dnsRequest.setClientIP("10.10.10.10"); + dnsRequest.setHostname(name.relativize(Name.root).toString()); + answer = cacheRegister.getDeliveryService(dnsRequest); + assertThat("FQDNToDeliveryServiceMap was expected to have the key _.example.com", + cacheRegister.getFQDNToDeliveryServiceMap().containsKey("_.example.com")); + assertThat("Returned Delivery Service was expected to have the ID example", + answer.getId().equals("example")); + } }