You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@trafficcontrol.apache.org by el...@apache.org on 2018/10/05 19:54:32 UTC
[trafficcontrol] 02/05: Filter by enabled LocalizationMethods when
selecting a CacheGroup
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 e770951f3289e9e5f7844c7ebc857c83ab144573
Author: Rawlin Peters <ra...@comcast.com>
AuthorDate: Mon Aug 13 16:58:46 2018 -0600
Filter by enabled LocalizationMethods when selecting a CacheGroup
---
.../traffic_router/core/cache/CacheLocation.java | 11 ++++++++-
.../traffic_router/core/config/ConfigHandler.java | 2 +-
.../traffic_router/core/router/TrafficRouter.java | 28 ++++++++++++++++++++--
.../traffic_router/core/loc/CoverageZoneTest.java | 2 ++
.../core/router/TrafficRouterTest.java | 2 ++
5 files changed, 41 insertions(+), 4 deletions(-)
diff --git a/traffic_router/core/src/main/java/com/comcast/cdn/traffic_control/traffic_router/core/cache/CacheLocation.java b/traffic_router/core/src/main/java/com/comcast/cdn/traffic_control/traffic_router/core/cache/CacheLocation.java
index d71ffcb..e615f62 100644
--- a/traffic_router/core/src/main/java/com/comcast/cdn/traffic_control/traffic_router/core/cache/CacheLocation.java
+++ b/traffic_router/core/src/main/java/com/comcast/cdn/traffic_control/traffic_router/core/cache/CacheLocation.java
@@ -16,7 +16,9 @@
package com.comcast.cdn.traffic_control.traffic_router.core.cache;
import java.util.ArrayList;
+import java.util.Arrays;
import java.util.HashMap;
+import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
@@ -57,7 +59,7 @@ public class CacheLocation {
* the coordinates of this location
*/
public CacheLocation(final String id, final Geolocation geolocation) {
- this(id, geolocation, null, true, null);
+ this(id, geolocation, null, true, new HashSet<>());
}
/**
@@ -86,9 +88,16 @@ public class CacheLocation {
this.backupCacheGroups = backupCacheGroups;
this.useClosestGeoOnBackupFailure = useClosestGeoOnBackupFailure;
this.enabledLocalizationMethods = enabledLocalizationMethods;
+ if (this.enabledLocalizationMethods.isEmpty()) {
+ this.enabledLocalizationMethods.addAll(Arrays.asList(LocalizationMethod.values()));
+ }
caches = new HashMap<String, Cache>();
}
+ public boolean isEnabledFor(final LocalizationMethod localizationMethod) {
+ return enabledLocalizationMethods.contains(localizationMethod);
+ }
+
/**
* Adds the specified cache to this location.
*
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 29719e7..af0f9a0 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
@@ -690,7 +690,7 @@ public class ConfigHandler {
}
- Set<CacheLocation.LocalizationMethod> enabledLocalizationMethods = parseLocalizationMethods(loc, jo);
+ final Set<CacheLocation.LocalizationMethod> enabledLocalizationMethods = parseLocalizationMethods(loc, jo);
try {
locations.add(
diff --git a/traffic_router/core/src/main/java/com/comcast/cdn/traffic_control/traffic_router/core/router/TrafficRouter.java b/traffic_router/core/src/main/java/com/comcast/cdn/traffic_control/traffic_router/core/router/TrafficRouter.java
index c67455c..be41704 100644
--- a/traffic_router/core/src/main/java/com/comcast/cdn/traffic_control/traffic_router/core/router/TrafficRouter.java
+++ b/traffic_router/core/src/main/java/com/comcast/cdn/traffic_control/traffic_router/core/router/TrafficRouter.java
@@ -21,6 +21,7 @@ import java.net.MalformedURLException;
import java.net.URL;
import java.net.UnknownHostException;
import java.util.ArrayList;
+import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
@@ -48,6 +49,7 @@ import org.xbill.DNS.Zone;
import com.comcast.cdn.traffic_control.traffic_router.core.cache.Cache;
import com.comcast.cdn.traffic_control.traffic_router.core.cache.CacheLocation;
+import com.comcast.cdn.traffic_control.traffic_router.core.cache.CacheLocation.LocalizationMethod;
import com.comcast.cdn.traffic_control.traffic_router.core.cache.CacheRegister;
import com.comcast.cdn.traffic_control.traffic_router.core.cache.InetRecord;
import com.comcast.cdn.traffic_control.traffic_router.core.dns.ZoneManager;
@@ -252,7 +254,8 @@ public class TrafficRouter {
int locationsTested = 0;
final int locationLimit = ds.getLocationLimit();
- final List<CacheLocation> cacheLocations1 = ds.filterAvailableLocations(getCacheRegister().getCacheLocations());
+ final List<CacheLocation> geoEnabledCacheLocations = filterEnabledLocations(getCacheRegister().getCacheLocations(), LocalizationMethod.GEO);
+ final List<CacheLocation> cacheLocations1 = ds.filterAvailableLocations(geoEnabledCacheLocations);
final List<CacheLocation> cacheLocations = orderCacheLocations(cacheLocations1, clientLocation);
for (final CacheLocation location : cacheLocations) {
@@ -711,6 +714,7 @@ public class TrafficRouter {
@SuppressWarnings({"PMD.CyclomaticComplexity", "PMD.NPathComplexity"})
public CacheLocation getCoverageZoneCacheLocation(final String ip, final String deliveryServiceId, final boolean useDeep, final Track track) {
final NetworkNode networkNode = useDeep ? getDeepNetworkNode(ip) : getNetworkNode(ip);
+ final LocalizationMethod localizationMethod = useDeep ? LocalizationMethod.DEEP_CZ : LocalizationMethod.CZ;
if (networkNode == null) {
return null;
@@ -724,6 +728,10 @@ public class TrafficRouter {
cacheLocation.loadDeepCaches(networkNode.getDeepCacheNames(), cacheRegister);
}
+ if (cacheLocation != null && !cacheLocation.isEnabledFor(localizationMethod)) {
+ return null;
+ }
+
if (cacheLocation != null && !getSupportingCaches(cacheLocation.getCaches(), deliveryService).isEmpty()) {
return cacheLocation;
}
@@ -739,6 +747,11 @@ public class TrafficRouter {
// find CacheLocation
cacheLocation = getCacheRegister().getCacheLocationById(networkNode.getLoc());
+ if (cacheLocation != null && !cacheLocation.isEnabledFor(localizationMethod)) {
+ track.continueGeo = false; // hit in the CZF but the cachegroup doesn't allow CZ-localization, don't fall back to GEO
+ return null;
+ }
+
if (cacheLocation != null && !getSupportingCaches(cacheLocation.getCaches(), deliveryService).isEmpty()) {
// lazy loading in case a CacheLocation has not yet been associated with this NetworkNode
networkNode.setCacheLocation(cacheLocation);
@@ -748,6 +761,9 @@ public class TrafficRouter {
if (cacheLocation != null && cacheLocation.getBackupCacheGroups() != null) {
for (final String cacheGroup : cacheLocation.getBackupCacheGroups()) {
final CacheLocation bkCacheLocation = getCacheRegister().getCacheLocationById(cacheGroup);
+ if (bkCacheLocation != null && !bkCacheLocation.isEnabledFor(localizationMethod)) {
+ continue;
+ }
if (bkCacheLocation != null && !getSupportingCaches(bkCacheLocation.getCaches(), deliveryService).isEmpty()) {
LOGGER.debug("Got backup CZ cache group " + bkCacheLocation.getId() + " for " + ip + ", ds " + deliveryServiceId);
if (track != null) {
@@ -767,7 +783,9 @@ public class TrafficRouter {
// We had a hit in the CZF but the name does not match a known cache location.
// Check whether the CZF entry has a geolocation and use it if so.
- final CacheLocation closestCacheLocation = getClosestCacheLocation(cacheRegister.filterAvailableLocations(deliveryServiceId), networkNode.getGeolocation(), cacheRegister.getDeliveryService(deliveryServiceId));
+ List<CacheLocation> availableLocations = cacheRegister.filterAvailableLocations(deliveryServiceId);
+ availableLocations = filterEnabledLocations(availableLocations, localizationMethod);
+ final CacheLocation closestCacheLocation = getClosestCacheLocation(availableLocations, networkNode.getGeolocation(), cacheRegister.getDeliveryService(deliveryServiceId));
if (closestCacheLocation != null) {
LOGGER.debug("Got closest CZ cache group " + closestCacheLocation.getId() + " for " + ip + ", ds " + deliveryServiceId);
if (track != null) {
@@ -777,6 +795,12 @@ public class TrafficRouter {
return closestCacheLocation;
}
+ public List<CacheLocation> filterEnabledLocations(final Collection<CacheLocation> locations, final LocalizationMethod localizationMethod) {
+ return locations.stream()
+ .filter(loc -> loc.isEnabledFor(localizationMethod))
+ .collect(Collectors.toList());
+ }
+
public CacheLocation getDeepCoverageZoneCacheLocation(final String ip, final DeliveryService deliveryService) {
return getCoverageZoneCacheLocation(ip, deliveryService, true, null);
}
diff --git a/traffic_router/core/src/test/java/com/comcast/cdn/traffic_control/traffic_router/core/loc/CoverageZoneTest.java b/traffic_router/core/src/test/java/com/comcast/cdn/traffic_control/traffic_router/core/loc/CoverageZoneTest.java
index f340b2e..ce5bc1e 100644
--- a/traffic_router/core/src/test/java/com/comcast/cdn/traffic_control/traffic_router/core/loc/CoverageZoneTest.java
+++ b/traffic_router/core/src/test/java/com/comcast/cdn/traffic_control/traffic_router/core/loc/CoverageZoneTest.java
@@ -35,6 +35,7 @@ import java.util.List;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.equalTo;
import static org.hamcrest.Matchers.not;
+import static org.mockito.Matchers.any;
import static org.mockito.Matchers.anyListOf;
import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.mock;
@@ -92,6 +93,7 @@ public class CoverageZoneTest {
when(trafficRouter.getCacheRegister()).thenReturn(cacheRegister);
when(trafficRouter.orderCacheLocations(cacheGroups,testLocation)).thenCallRealMethod();
when(trafficRouter.getSupportingCaches(anyListOf(Cache.class), eq(deliveryService))).thenCallRealMethod();
+ when(trafficRouter.filterEnabledLocations(anyListOf(CacheLocation.class), any(CacheLocation.LocalizationMethod.class))).thenCallRealMethod();
PowerMockito.when(trafficRouter, "getNetworkNode", "12.23.34.45").thenReturn(eastNetworkNode);
PowerMockito.when(trafficRouter, "getClosestCacheLocation", cacheGroups, testLocation, deliveryService).thenCallRealMethod();
}
diff --git a/traffic_router/core/src/test/java/com/comcast/cdn/traffic_control/traffic_router/core/router/TrafficRouterTest.java b/traffic_router/core/src/test/java/com/comcast/cdn/traffic_control/traffic_router/core/router/TrafficRouterTest.java
index 2e7a54a..d644445 100644
--- a/traffic_router/core/src/test/java/com/comcast/cdn/traffic_control/traffic_router/core/router/TrafficRouterTest.java
+++ b/traffic_router/core/src/test/java/com/comcast/cdn/traffic_control/traffic_router/core/router/TrafficRouterTest.java
@@ -17,6 +17,7 @@ package com.comcast.cdn.traffic_control.traffic_router.core.router;
import com.comcast.cdn.traffic_control.traffic_router.core.cache.Cache;
import com.comcast.cdn.traffic_control.traffic_router.core.cache.CacheLocation;
+import com.comcast.cdn.traffic_control.traffic_router.core.cache.CacheLocation.LocalizationMethod;
import com.comcast.cdn.traffic_control.traffic_router.core.cache.CacheRegister;
import com.comcast.cdn.traffic_control.traffic_router.core.cache.InetRecord;
import com.comcast.cdn.traffic_control.traffic_router.core.config.CertificateChecker;
@@ -175,6 +176,7 @@ public class TrafficRouterTest {
when(trafficRouter.getClientLocation(anyString(), any(DeliveryService.class), any(CacheLocation.class), any(Track.class))).thenReturn(clientLocation);
when(trafficRouter.getCachesByGeo(any(DeliveryService.class), any(Geolocation.class), any(Track.class))).thenCallRealMethod();
+ when(trafficRouter.filterEnabledLocations(any(List.class), any(LocalizationMethod.class))).thenCallRealMethod();
when(trafficRouter.orderCacheLocations(any(List.class), any(Geolocation.class))).thenCallRealMethod();
when(trafficRouter.getSupportingCaches(any(List.class), any(DeliveryService.class))).thenCallRealMethod();