This is an automated email from the ASF dual-hosted git repository.
zrhoffman pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/trafficcontrol.git
The following commit(s) were added to refs/heads/master by this push:
new 7316c56e4f Traffic Router DNS zone calculation optimizations (#7641)
7316c56e4f is described below
commit 7316c56e4fde3d1c9e02fc6b358381647133bc12
Author: Srijeet Chatterjee <[email protected]>
AuthorDate: Thu Jul 13 16:59:38 2023 -0600
Traffic Router DNS zone calculation optimizations (#7641)
* Traffic Router zone (Delivery service) calculation optimizations
* remove debug
* add changelog
* improve performance, maybe?
* fix truth
---
CHANGELOG.md | 1 +
.../traffic_router/core/config/ConfigHandler.java | 12 +++-
.../traffic_router/core/edge/CacheRegister.java | 17 +++++
.../core/edge/CacheRegisterTest.java | 81 ++++++++++++++++++++++
4 files changed, 109 insertions(+), 2 deletions(-)
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<String, DeliveryService> 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<String, DeliveryService> getFQDNToDeliveryServiceMap() {
+ return fqdnToDeliveryService;
+ }
+
public String getConfigDir() {
return configDir;
}
@@ -182,7 +187,7 @@ public class ConfigHandler {
cacheRegister.setStats(stats);
parseTrafficOpsConfig(config, stats);
- final Map<String, DeliveryService>
deliveryServiceMap = parseDeliveryServiceConfig(JsonUtils.getJsonNode(jo,
deliveryServicesKey));
+ final Map<String, DeliveryService>
deliveryServiceMap = parseDeliveryServiceConfig(JsonUtils.getJsonNode(jo,
deliveryServicesKey), cacheRegister);
parseCertificatesConfig(config);
certificatesPublisher.setDeliveryServicesJson(deliveryServicesJson);
@@ -448,7 +453,7 @@ public class ConfigHandler {
statTracker.initialize(statMap, cacheRegister);
}
- private Map<String, DeliveryService> parseDeliveryServiceConfig(final
JsonNode allDeliveryServices) throws JsonUtilsException {
+ private Map<String, DeliveryService> parseDeliveryServiceConfig(final
JsonNode allDeliveryServices, final CacheRegister cacheRegister) throws
JsonUtilsException {
final Map<String,DeliveryService> deliveryServiceMap = new
HashMap<>();
final Iterator<String> deliveryServiceIter =
allDeliveryServices.fieldNames();
@@ -469,6 +474,9 @@ public class ConfigHandler {
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<String,Cache> allCaches;
private TreeSet<DeliveryServiceMatcher> deliveryServiceMatchers;
private Map<String, DeliveryService> dsMap;
+ private Map<String, DeliveryService> fqdnToDeliveryServiceMap;
private JsonNode config;
private JsonNode stats;
private int edgeTrafficRouterCount;
@@ -148,6 +149,14 @@ public class CacheRegister {
* @return the DeliveryService that matches the request
*/
public DeliveryService getDeliveryService(final Request request) {
+ final String requestName = request.getHostname();
+ final Map<String, DeliveryService> 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 class CacheRegister {
this.dsMap = dsMap;
}
+ public Map<String, DeliveryService> getFQDNToDeliveryServiceMap() {
+ return fqdnToDeliveryServiceMap;
+ }
+
+ public void setFQDNToDeliveryServiceMap(final Map<String,
DeliveryService> 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 class CacheRegisterTest {
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<String, DeliveryService> 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<String, DeliveryService> 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"));
+ }
}