diff --git a/CHANGELOG.md b/CHANGELOG.md index c1fbf13ab2..a266f123b1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -36,6 +36,7 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/). - [#7120](https://github.com/apache/trafficcontrol/pull/7120) *Docs* Update t3c documentation regarding parent.config parent_retry. ### Fixed +- [#7252](https://github.com/apache/trafficcontrol/issues/7252) *Traffic Router* Fixed integer overflow for `czCount`, by resetting the count to max value when it overflows. - [#7221](https://github.com/apache/trafficcontrol/issues/7221) *Docs* Fixed request structure spec in cdn locks description in APIv4. - [#7225](https://github.com/apache/trafficcontrol/issues/7225) *Docs* Fixed docs for /roles response description in APIv4. - [#7246](https://github.com/apache/trafficcontrol/issues/7246) *Docs* Fixed docs for /jobs response description in APIv4 and APIv5. diff --git a/traffic_router/core/src/main/java/org/apache/traffic_control/traffic_router/core/router/StatTracker.java b/traffic_router/core/src/main/java/org/apache/traffic_control/traffic_router/core/router/StatTracker.java index 610a007d33..1f2e9b5c2b 100644 --- a/traffic_router/core/src/main/java/org/apache/traffic_control/traffic_router/core/router/StatTracker.java +++ b/traffic_router/core/src/main/java/org/apache/traffic_control/traffic_router/core/router/StatTracker.java @@ -36,10 +36,10 @@ public class StatTracker { public static class Tallies { - public int getCzCount() { + public long getCzCount() { return czCount; } - public void setCzCount(final int czCount) { + public void setCzCount(final long czCount) { this.czCount = czCount; } public int getGeoCount() { @@ -97,7 +97,7 @@ public void setRegionalAlternateCount(final int regionalAlternateCount) { this.regionalAlternateCount = regionalAlternateCount; } - public int czCount; + public long czCount; public int geoCount; public int deepCzCount; public int missCount; @@ -373,7 +373,7 @@ public void saveTrack(final Track t) { totalDnsCount++; totalDnsTime += t.time; } - map = dnsMap; + map = getDnsMap(); if (t.resultDetails == Track.ResultDetails.LOCALIZED_DNS) { return; @@ -387,7 +387,7 @@ public void saveTrack(final Track t) { totalHttpCount++; totalHttpTime += t.time; } - map = httpMap; + map = getHttpMap(); } map.putIfAbsent(fqdn, new Tallies()); incTally(t, map.get(fqdn)); @@ -402,6 +402,9 @@ private static void incTally(final Track t, final Tallies tallies) { break; case CZ: tallies.czCount++; + if (tallies.czCount < 0) { + tallies.czCount = Long.MAX_VALUE; + } break; case GEO: tallies.geoCount++; diff --git a/traffic_router/core/src/test/java/org/apache/traffic_control/traffic_router/core/router/StatTrackerTest.java b/traffic_router/core/src/test/java/org/apache/traffic_control/traffic_router/core/router/StatTrackerTest.java new file mode 100644 index 0000000000..3c8c8b0faf --- /dev/null +++ b/traffic_router/core/src/test/java/org/apache/traffic_control/traffic_router/core/router/StatTrackerTest.java @@ -0,0 +1,43 @@ +/* + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.traffic_control.traffic_router.core.router; + +import org.junit.Test; +import java.util.HashMap; +import java.util.Map; +import static org.powermock.api.mockito.PowerMockito.spy; +import static org.powermock.api.mockito.PowerMockito.when; +import static org.springframework.test.util.AssertionErrors.assertEquals; + +public class StatTrackerTest { + @Test + public void testIncTally() { + StatTracker tracker = spy(new StatTracker()); + StatTracker.Tallies tallies = new StatTracker.Tallies(); + StatTracker.Track track = StatTracker.getTrack(); + + tallies.setCzCount(Long.MAX_VALUE); + + Map map = new HashMap<>(); + map.put("blah", tallies); + when(tracker.getDnsMap()).thenReturn(map); + + track.setRouteType(StatTracker.Track.RouteType.DNS, "blah"); + track.setResult(StatTracker.Track.ResultType.CZ); + tracker.saveTrack(track); + assertEquals("expected czCount to be max long value but got " + tallies.getCzCount(), Long.MAX_VALUE, tallies.getCzCount()); + } +}