Skip to content
This repository was archived by the owner on Nov 24, 2025. It is now read-only.

Commit dcf6e31

Browse files
authored
Traffic Router DNS zone calculation optimizations (#7622)
* wip * added tests * Add changelog * code review * remove unused imports
1 parent fbd097b commit dcf6e31

File tree

5 files changed

+113
-2
lines changed

5 files changed

+113
-2
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/).
55

66
## [unreleased]
77
### Added
8+
- [#7622](https://github.com/apache/trafficcontrol/pull/7622) *Traffic Router* Added further optimization to TR's algorithm of figuring out the zone for an incoming request.
89
- [#7609](https://github.com/apache/trafficcontrol/pull/7609) *Traffic Portal* Added Scope Query Param to SSO login.
910
- [#7450](https://github.com/apache/trafficcontrol/pull/7450) *Traffic Ops* Removed hypnotoad section and added listen field to traffic_ops_golang section in order to simplify cdn config.
1011
- [#7290](https://github.com/apache/trafficcontrol/pull/7302) *Traffic Monitor* Update TM results with hostname from via header, syncronize health on caches with same service address

traffic_router/core/src/main/java/org/apache/traffic_control/traffic_router/core/config/ConfigHandler.java

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -102,11 +102,16 @@ public class ConfigHandler {
102102
private final AtomicBoolean cancelled = new AtomicBoolean(false);
103103
private final AtomicBoolean isProcessing = new AtomicBoolean(false);
104104

105+
private final Map<String, DeliveryService> fqdnToDeliveryService = new HashMap<>();
105106
private final static String NEUSTAR_POLLING_URL = "neustar.polling.url";
106107
private final static String NEUSTAR_POLLING_INTERVAL = "neustar.polling.interval";
107108

108109
private final static String LOCALIZATION_METHODS = "localizationMethods";
109110

111+
public Map<String, DeliveryService> getFQDNToDeliveryServiceMap() {
112+
return fqdnToDeliveryService;
113+
}
114+
110115
public String getConfigDir() {
111116
return configDir;
112117
}
@@ -182,7 +187,7 @@ public boolean processConfig(final String jsonStr) throws JsonUtilsException, IO
182187
cacheRegister.setStats(stats);
183188
parseTrafficOpsConfig(config, stats);
184189

185-
final Map<String, DeliveryService> deliveryServiceMap = parseDeliveryServiceConfig(JsonUtils.getJsonNode(jo, deliveryServicesKey));
190+
final Map<String, DeliveryService> deliveryServiceMap = parseDeliveryServiceConfig(JsonUtils.getJsonNode(jo, deliveryServicesKey), cacheRegister);
186191

187192
parseCertificatesConfig(config);
188193
certificatesPublisher.setDeliveryServicesJson(deliveryServicesJson);
@@ -448,7 +453,7 @@ private void parseCacheConfig(final JsonNode contentServers, final CacheRegister
448453
statTracker.initialize(statMap, cacheRegister);
449454
}
450455

451-
private Map<String, DeliveryService> parseDeliveryServiceConfig(final JsonNode allDeliveryServices) throws JsonUtilsException {
456+
private Map<String, DeliveryService> parseDeliveryServiceConfig(final JsonNode allDeliveryServices, final CacheRegister cacheRegister) throws JsonUtilsException {
452457
final Map<String,DeliveryService> deliveryServiceMap = new HashMap<>();
453458

454459
final Iterator<String> deliveryServiceIter = allDeliveryServices.fieldNames();
@@ -469,6 +474,9 @@ private Map<String, DeliveryService> parseDeliveryServiceConfig(final JsonNode a
469474

470475
deliveryService.setDns(isDns);
471476
deliveryServiceMap.put(deliveryServiceId, deliveryService);
477+
fqdnToDeliveryService.put(deliveryService.getRoutingName() + "." + deliveryService.getDomain(), deliveryService);
478+
fqdnToDeliveryService.put("_." + deliveryService.getDomain(), deliveryService);
479+
cacheRegister.setFQDNToDeliveryServiceMap(fqdnToDeliveryService);
472480
}
473481

474482
return deliveryServiceMap;

traffic_router/core/src/main/java/org/apache/traffic_control/traffic_router/core/dns/NameServer.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -369,6 +369,14 @@ private void lookup(final Name qname, final int qtype, final InetAddress clientA
369369
return;
370370
}
371371

372+
if (clientAddress != null && clientAddress.getHostName().equals("_")) {
373+
response.getHeader().setRcode(Rcode.NXDOMAIN);
374+
response.getHeader().setFlag(Flags.AA);
375+
addDenialOfExistence(qname, zone, response, flags);
376+
addSOA(zone, response, Section.AUTHORITY, flags);
377+
return;
378+
}
379+
372380
final SetResponse sr = zone.findRecords(qname, qtype);
373381

374382
if (sr.isSuccessful()) {

traffic_router/core/src/main/java/org/apache/traffic_control/traffic_router/core/edge/CacheRegister.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ public class CacheRegister {
3232
private Map<String,Cache> allCaches;
3333
private TreeSet<DeliveryServiceMatcher> deliveryServiceMatchers;
3434
private Map<String, DeliveryService> dsMap;
35+
private Map<String, DeliveryService> fqdnToDeliveryServiceMap;
3536
private JsonNode config;
3637
private JsonNode stats;
3738
private int edgeTrafficRouterCount;
@@ -148,6 +149,10 @@ public void setDeliveryServiceMatchers(final TreeSet<DeliveryServiceMatcher> mat
148149
* @return the DeliveryService that matches the request
149150
*/
150151
public DeliveryService getDeliveryService(final Request request) {
152+
final String requestName = request.getHostname();
153+
if (getFQDNToDeliveryServiceMap() != null && getFQDNToDeliveryServiceMap().get(requestName) != null) {
154+
return getFQDNToDeliveryServiceMap().get(requestName);
155+
}
151156
if (deliveryServiceMatchers == null) {
152157
return null;
153158
}
@@ -179,6 +184,14 @@ public void setDeliveryServiceMap(final Map<String, DeliveryService> dsMap) {
179184
this.dsMap = dsMap;
180185
}
181186

187+
public Map<String, DeliveryService> getFQDNToDeliveryServiceMap() {
188+
return fqdnToDeliveryServiceMap;
189+
}
190+
191+
public void setFQDNToDeliveryServiceMap(final Map<String, DeliveryService> fqdnToDeliveryServiceMap) {
192+
this.fqdnToDeliveryServiceMap = fqdnToDeliveryServiceMap;
193+
}
194+
182195
public JsonNode getTrafficRouters() {
183196
return trafficRouters;
184197
}

traffic_router/core/src/test/java/org/apache/traffic_control/traffic_router/core/edge/CacheRegisterTest.java

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,13 +15,23 @@
1515

1616
package org.apache.traffic_control.traffic_router.core.edge;
1717

18+
import com.fasterxml.jackson.databind.node.ArrayNode;
19+
import com.fasterxml.jackson.databind.node.JsonNodeFactory;
20+
import com.fasterxml.jackson.databind.node.ObjectNode;
1821
import org.apache.traffic_control.traffic_router.core.ds.DeliveryService;
1922
import org.apache.traffic_control.traffic_router.core.ds.DeliveryServiceMatcher;
23+
import org.apache.traffic_control.traffic_router.core.request.DNSRequest;
2024
import org.apache.traffic_control.traffic_router.core.request.HTTPRequest;
2125
import org.apache.traffic_control.traffic_router.core.request.Request;
26+
import org.apache.traffic_control.traffic_router.core.util.JsonUtilsException;
2227
import org.junit.Before;
2328
import org.junit.Test;
29+
import org.xbill.DNS.Name;
30+
import org.xbill.DNS.TextParseException;
31+
import org.xbill.DNS.Type;
2432

33+
import java.util.HashMap;
34+
import java.util.Map;
2535
import java.util.TreeSet;
2636

2737
import static org.apache.traffic_control.traffic_router.core.ds.DeliveryServiceMatcher.Type.HOST;
@@ -90,4 +100,75 @@ public void itReturnsNullForDeliveryServiceWhenItHasNoMatchers() {
90100
httpRequest.setPath("foo/abcde/bar");
91101
assertThat(cacheRegister.getDeliveryService(httpRequest), nullValue());
92102
}
103+
104+
@Test
105+
public void itReturnsDeliveryServiceFromFQDNMapForHTTPRequest() throws JsonUtilsException {
106+
String requestName = "http://foo.service01.kabletown.com/";
107+
HTTPRequest httpRequest = new HTTPRequest();
108+
httpRequest.setHostname("foo.service01.kabletown.com");
109+
httpRequest.setRequestedUrl(requestName);
110+
Map<String, DeliveryService> map = new HashMap<>();
111+
112+
ObjectNode node = JsonNodeFactory.instance.objectNode();
113+
ArrayNode domainNode = node.putArray("domains");
114+
domainNode.add("kabletown.com");
115+
node.put("routingName","foo");
116+
node.put("coverageZoneOnly", false);
117+
DeliveryService ds = new DeliveryService("service01", node);
118+
119+
map.put("foo.service01.kabletown.com", ds);
120+
map.put("_.service01.kabletown.com", ds);
121+
cacheRegister.setFQDNToDeliveryServiceMap(map);
122+
123+
DeliveryService answer = cacheRegister.getDeliveryService(httpRequest);
124+
assertThat("FQDNToDeliveryServiceMap was expected to have the key foo.service01.kabletown.com",
125+
cacheRegister.getFQDNToDeliveryServiceMap().containsKey("foo.service01.kabletown.com"));
126+
assertThat("Returned Delivery Service was expected to have the ID service01",
127+
answer.getId().equals("service01"));
128+
129+
130+
httpRequest.setRequestedUrl("http://_.service01.kabletown.com");
131+
answer = cacheRegister.getDeliveryService(httpRequest);
132+
assertThat("FQDNToDeliveryServiceMap was expected to have the key _.service01.kabletown.com",
133+
cacheRegister.getFQDNToDeliveryServiceMap().containsKey("_.service01.kabletown.com"));
134+
assertThat("Returned Delivery Service was expected to have the ID service01",
135+
answer.getId().equals("service01"));
136+
}
137+
138+
@Test
139+
public void itReturnsDeliveryServiceFromFQDNMapForDNSRequest() throws JsonUtilsException, TextParseException {
140+
final Name name = Name.fromString("edge.example.com.");
141+
DNSRequest dnsRequest = new DNSRequest("example.com", name, Type.A);
142+
dnsRequest.setClientIP("10.10.10.10");
143+
dnsRequest.setHostname(name.relativize(Name.root).toString());
144+
145+
Map<String, DeliveryService> map = new HashMap<>();
146+
147+
ObjectNode node = JsonNodeFactory.instance.objectNode();
148+
ArrayNode domainNode = node.putArray("domains");
149+
domainNode.add("example.com");
150+
node.put("routingName","edge");
151+
node.put("coverageZoneOnly", false);
152+
DeliveryService ds = new DeliveryService("example", node);
153+
154+
map.put("edge.example.com", ds);
155+
map.put("_.example.com", ds);
156+
cacheRegister.setFQDNToDeliveryServiceMap(map);
157+
158+
DeliveryService answer = cacheRegister.getDeliveryService(dnsRequest);
159+
assertThat("FQDNToDeliveryServiceMap was expected to have the key edge.example.com",
160+
cacheRegister.getFQDNToDeliveryServiceMap().containsKey("edge.example.com"));
161+
assertThat("Returned Delivery Service was expected to have the ID example",
162+
answer.getId().equals("example"));
163+
164+
final Name underscoreName = Name.fromString("_.example.com");
165+
dnsRequest = new DNSRequest("example.com", underscoreName, Type.A);
166+
dnsRequest.setClientIP("10.10.10.10");
167+
dnsRequest.setHostname(name.relativize(Name.root).toString());
168+
answer = cacheRegister.getDeliveryService(dnsRequest);
169+
assertThat("FQDNToDeliveryServiceMap was expected to have the key _.example.com",
170+
cacheRegister.getFQDNToDeliveryServiceMap().containsKey("_.example.com"));
171+
assertThat("Returned Delivery Service was expected to have the ID example",
172+
answer.getId().equals("example"));
173+
}
93174
}

0 commit comments

Comments
 (0)