Repository: aurora Updated Branches: refs/heads/master 85fed6ba9 -> b0d24f4d5
Adding metrics for removals from BiCache Reviewed at https://reviews.apache.org/r/58636/ Project: http://git-wip-us.apache.org/repos/asf/aurora/repo Commit: http://git-wip-us.apache.org/repos/asf/aurora/commit/b0d24f4d Tree: http://git-wip-us.apache.org/repos/asf/aurora/tree/b0d24f4d Diff: http://git-wip-us.apache.org/repos/asf/aurora/diff/b0d24f4d Branch: refs/heads/master Commit: b0d24f4d5f5db8fc2fac306215f26b114b12009d Parents: 85fed6b Author: Reza Motamedi <[email protected]> Authored: Mon May 8 16:37:09 2017 -0700 Committer: David McLaughlin <[email protected]> Committed: Mon May 8 16:37:09 2017 -0700 ---------------------------------------------------------------------- .../aurora/scheduler/preemptor/BiCache.java | 24 +++++++++---- .../scheduler/preemptor/PreemptorModule.java | 2 +- .../scheduler/scheduling/SchedulingModule.java | 2 +- .../aurora/scheduler/preemptor/BiCacheTest.java | 36 ++++++++++++++------ .../preemptor/PendingTaskProcessorTest.java | 9 ++--- 5 files changed, 51 insertions(+), 22 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/aurora/blob/b0d24f4d/src/main/java/org/apache/aurora/scheduler/preemptor/BiCache.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/aurora/scheduler/preemptor/BiCache.java b/src/main/java/org/apache/aurora/scheduler/preemptor/BiCache.java index 70390f6..7616012 100644 --- a/src/main/java/org/apache/aurora/scheduler/preemptor/BiCache.java +++ b/src/main/java/org/apache/aurora/scheduler/preemptor/BiCache.java @@ -16,6 +16,7 @@ package org.apache.aurora.scheduler.preemptor; import java.util.Map; import java.util.Set; import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicLong; import javax.inject.Inject; @@ -48,16 +49,19 @@ public class BiCache<K, V> { public static class BiCacheSettings { private final Amount<Long, Time> expireAfter; - private final String cacheSizeStatName; + private final String cacheName; - public BiCacheSettings(Amount<Long, Time> expireAfter, String cacheSizeStatName) { + public BiCacheSettings(Amount<Long, Time> expireAfter, String cacheName) { this.expireAfter = requireNonNull(expireAfter); - this.cacheSizeStatName = requireNonNull(cacheSizeStatName); + this.cacheName = requireNonNull(cacheName); } } private final Cache<K, V> cache; private final Multimap<V, K> inverse = HashMultimap.create(); + private final AtomicLong removalCounter; + private final AtomicLong expirationCounter; + private final AtomicLong explictRemovalCounter; @Inject public BiCache( @@ -77,14 +81,21 @@ public class BiCache<K, V> { .removalListener(new RemovalListener<K, V>() { @Override public void onRemoval(RemovalNotification<K, V> notification) { + removalCounter.getAndIncrement(); + if (notification.wasEvicted()) { + expirationCounter.incrementAndGet(); + } inverse.remove(notification.getValue(), notification.getKey()); } }) .build(); - statsProvider.makeGauge( - settings.cacheSizeStatName, - cache::size); + statsProvider.makeGauge(settings.cacheName + "_cache_size", cache::size); + removalCounter = statsProvider.makeCounter(settings.cacheName + "_cache_removals"); + expirationCounter = statsProvider.makeCounter( + settings.cacheName + "_cache_expiration_removals"); + explictRemovalCounter = statsProvider.makeCounter( + settings.cacheName + "_cache_explicit_removals"); } /** @@ -130,6 +141,7 @@ public class BiCache<K, V> { * @param value Value to remove. */ public synchronized void remove(K key, V value) { + explictRemovalCounter.getAndIncrement(); inverse.remove(value, key); cache.invalidate(key); } http://git-wip-us.apache.org/repos/asf/aurora/blob/b0d24f4d/src/main/java/org/apache/aurora/scheduler/preemptor/PreemptorModule.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/aurora/scheduler/preemptor/PreemptorModule.java b/src/main/java/org/apache/aurora/scheduler/preemptor/PreemptorModule.java index 66d2029..92087eb 100644 --- a/src/main/java/org/apache/aurora/scheduler/preemptor/PreemptorModule.java +++ b/src/main/java/org/apache/aurora/scheduler/preemptor/PreemptorModule.java @@ -108,7 +108,7 @@ public class PreemptorModule extends AbstractModule { .annotatedWith(PendingTaskProcessor.PreemptionDelay.class) .toInstance(preemptionDelay); bind(BiCacheSettings.class).toInstance( - new BiCacheSettings(PREEMPTION_SLOT_HOLD_TIME.get(), "preemption_slot_cache_size")); + new BiCacheSettings(PREEMPTION_SLOT_HOLD_TIME.get(), "preemption_slot")); bind(new TypeLiteral<BiCache<PreemptionProposal, TaskGroupKey>>() { }) .in(Singleton.class); bind(new TypeLiteral<Integer>() { }) http://git-wip-us.apache.org/repos/asf/aurora/blob/b0d24f4d/src/main/java/org/apache/aurora/scheduler/scheduling/SchedulingModule.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/aurora/scheduler/scheduling/SchedulingModule.java b/src/main/java/org/apache/aurora/scheduler/scheduling/SchedulingModule.java index 03a0e84..0415016 100644 --- a/src/main/java/org/apache/aurora/scheduler/scheduling/SchedulingModule.java +++ b/src/main/java/org/apache/aurora/scheduler/scheduling/SchedulingModule.java @@ -133,7 +133,7 @@ public class SchedulingModule extends AbstractModule { protected void configure() { bind(new TypeLiteral<BiCache<String, TaskGroupKey>>() { }).in(Singleton.class); bind(BiCache.BiCacheSettings.class).toInstance( - new BiCache.BiCacheSettings(RESERVATION_DURATION.get(), "reservation_cache_size")); + new BiCache.BiCacheSettings(RESERVATION_DURATION.get(), "reservation")); bind(TaskScheduler.class).to(TaskScheduler.TaskSchedulerImpl.class); bind(TaskScheduler.TaskSchedulerImpl.class).in(Singleton.class); expose(TaskScheduler.class); http://git-wip-us.apache.org/repos/asf/aurora/blob/b0d24f4d/src/test/java/org/apache/aurora/scheduler/preemptor/BiCacheTest.java ---------------------------------------------------------------------- diff --git a/src/test/java/org/apache/aurora/scheduler/preemptor/BiCacheTest.java b/src/test/java/org/apache/aurora/scheduler/preemptor/BiCacheTest.java index bac8f33..4e27fbb 100644 --- a/src/test/java/org/apache/aurora/scheduler/preemptor/BiCacheTest.java +++ b/src/test/java/org/apache/aurora/scheduler/preemptor/BiCacheTest.java @@ -31,7 +31,11 @@ import static org.junit.Assert.assertEquals; public class BiCacheTest { private static final Amount<Long, Time> HOLD_DURATION = Amount.of(1L, Time.MINUTES); - private static final String STAT_NAME = "cache_size_stat"; + private static final String CACHE_NAME = "TEST"; + private static final String CACHE_SIZE_STAT_NAME = "TEST_cache_size"; + private static final String CACHE_REMOVAL_STAT_NAME = "TEST_cache_removals"; + private static final String CACHE_EXPLICIT_REMOVAL_STAT_NAME = "TEST_cache_explicit_removals"; + private static final String CACHE_EXPIRATION_REMOVAL_STAT_NAME = "TEST_cache_expiration_removals"; private static final String KEY_1 = "Key 1"; private static final String KEY_2 = "Key 2"; private static final Optional<Integer> NO_VALUE = Optional.absent(); @@ -44,31 +48,43 @@ public class BiCacheTest { public void setUp() { statsProvider = new FakeStatsProvider(); clock = new FakeClock(); - biCache = new BiCache<>(statsProvider, new BiCacheSettings(HOLD_DURATION, STAT_NAME), clock); + biCache = new BiCache<>(statsProvider, new BiCacheSettings(HOLD_DURATION, CACHE_NAME), clock); } @Test public void testExpiration() { biCache.put(KEY_1, 1); assertEquals(Optional.of(1), biCache.get(KEY_1)); - assertEquals(1L, statsProvider.getLongValue(STAT_NAME)); + assertEquals(1L, statsProvider.getLongValue(CACHE_SIZE_STAT_NAME)); + assertEquals(0L, statsProvider.getLongValue(CACHE_REMOVAL_STAT_NAME)); + assertEquals(0L, statsProvider.getLongValue(CACHE_EXPIRATION_REMOVAL_STAT_NAME)); + assertEquals(0L, statsProvider.getLongValue(CACHE_EXPLICIT_REMOVAL_STAT_NAME)); clock.advance(HOLD_DURATION); assertEquals(NO_VALUE, biCache.get(KEY_1)); assertEquals(ImmutableSet.of(), biCache.getByValue(1)); - assertEquals(0L, statsProvider.getLongValue(STAT_NAME)); + assertEquals(0L, statsProvider.getLongValue(CACHE_SIZE_STAT_NAME)); + assertEquals(1L, statsProvider.getLongValue(CACHE_REMOVAL_STAT_NAME)); + assertEquals(1L, statsProvider.getLongValue(CACHE_EXPIRATION_REMOVAL_STAT_NAME)); + assertEquals(0L, statsProvider.getLongValue(CACHE_EXPLICIT_REMOVAL_STAT_NAME)); } @Test public void testRemoval() { biCache.put(KEY_1, 1); - assertEquals(1L, statsProvider.getLongValue(STAT_NAME)); + assertEquals(1L, statsProvider.getLongValue(CACHE_SIZE_STAT_NAME)); + assertEquals(0L, statsProvider.getLongValue(CACHE_REMOVAL_STAT_NAME)); + assertEquals(0L, statsProvider.getLongValue(CACHE_EXPIRATION_REMOVAL_STAT_NAME)); + assertEquals(0L, statsProvider.getLongValue(CACHE_EXPLICIT_REMOVAL_STAT_NAME)); assertEquals(Optional.of(1), biCache.get(KEY_1)); assertEquals(NO_VALUE, biCache.get(KEY_2)); biCache.remove(KEY_1, 1); assertEquals(NO_VALUE, biCache.get(KEY_1)); - assertEquals(0L, statsProvider.getLongValue(STAT_NAME)); + assertEquals(0L, statsProvider.getLongValue(CACHE_SIZE_STAT_NAME)); + assertEquals(1L, statsProvider.getLongValue(CACHE_REMOVAL_STAT_NAME)); + assertEquals(0L, statsProvider.getLongValue(CACHE_EXPIRATION_REMOVAL_STAT_NAME)); + assertEquals(1L, statsProvider.getLongValue(CACHE_EXPLICIT_REMOVAL_STAT_NAME)); } @Test(expected = NullPointerException.class) @@ -80,7 +96,7 @@ public class BiCacheTest { public void testDifferentKeysIdenticalValues() { biCache.put(KEY_1, 1); biCache.put(KEY_2, 1); - assertEquals(2L, statsProvider.getLongValue(STAT_NAME)); + assertEquals(2L, statsProvider.getLongValue(CACHE_SIZE_STAT_NAME)); assertEquals(Optional.of(1), biCache.get(KEY_1)); assertEquals(Optional.of(1), biCache.get(KEY_2)); @@ -90,13 +106,13 @@ public class BiCacheTest { assertEquals(NO_VALUE, biCache.get(KEY_1)); assertEquals(Optional.of(1), biCache.get(KEY_2)); assertEquals(ImmutableSet.of(KEY_2), biCache.getByValue(1)); - assertEquals(1L, statsProvider.getLongValue(STAT_NAME)); + assertEquals(1L, statsProvider.getLongValue(CACHE_SIZE_STAT_NAME)); clock.advance(HOLD_DURATION); assertEquals(NO_VALUE, biCache.get(KEY_1)); assertEquals(NO_VALUE, biCache.get(KEY_2)); assertEquals(ImmutableSet.of(), biCache.getByValue(1)); - assertEquals(0L, statsProvider.getLongValue(STAT_NAME)); + assertEquals(0L, statsProvider.getLongValue(CACHE_SIZE_STAT_NAME)); } @Test @@ -106,7 +122,7 @@ public class BiCacheTest { assertEquals(Optional.of(2), biCache.get(KEY_1)); assertEquals(ImmutableSet.of(), biCache.getByValue(1)); assertEquals(ImmutableSet.of(KEY_1), biCache.getByValue(2)); - assertEquals(1L, statsProvider.getLongValue(STAT_NAME)); + assertEquals(1L, statsProvider.getLongValue(CACHE_SIZE_STAT_NAME)); } @Test http://git-wip-us.apache.org/repos/asf/aurora/blob/b0d24f4d/src/test/java/org/apache/aurora/scheduler/preemptor/PendingTaskProcessorTest.java ---------------------------------------------------------------------- diff --git a/src/test/java/org/apache/aurora/scheduler/preemptor/PendingTaskProcessorTest.java b/src/test/java/org/apache/aurora/scheduler/preemptor/PendingTaskProcessorTest.java index 4da4e9d..c76b3e3 100644 --- a/src/test/java/org/apache/aurora/scheduler/preemptor/PendingTaskProcessorTest.java +++ b/src/test/java/org/apache/aurora/scheduler/preemptor/PendingTaskProcessorTest.java @@ -64,7 +64,8 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; public class PendingTaskProcessorTest extends EasyMockTest { - private static final String CACHE_STAT = "cache_size"; + private static final String CACHE_NAME = "TEST"; + private static final String CACHE_SIZE_STAT_NAME = "TEST_cache_size"; private static final String SLAVE_ID_1 = "slave_id_1"; private static final String SLAVE_ID_2 = "slave_id_2"; private static final IJobKey JOB_A = JobKeys.from("role_a", "env", "job_a"); @@ -98,7 +99,7 @@ public class PendingTaskProcessorTest extends EasyMockTest { clock = new FakeClock(); slotCache = new BiCache<>( statsProvider, - new BiCache.BiCacheSettings(EXPIRATION, CACHE_STAT), + new BiCache.BiCacheSettings(EXPIRATION, CACHE_NAME), clock); slotFinder = new PendingTaskProcessor( @@ -133,7 +134,7 @@ public class PendingTaskProcessorTest extends EasyMockTest { assertEquals(2L, statsProvider.getLongValue(slotSearchStatName(true, true))); assertEquals(0L, statsProvider.getLongValue(slotSearchStatName(false, true))); assertEquals(0L, statsProvider.getLongValue(UNMATCHED_TASKS)); - assertEquals(2L, statsProvider.getLongValue(CACHE_STAT)); + assertEquals(2L, statsProvider.getLongValue(CACHE_SIZE_STAT_NAME)); } @Test @@ -212,7 +213,7 @@ public class PendingTaskProcessorTest extends EasyMockTest { assertTrue(ImmutableSet.of(0L, 2L).contains( statsProvider.getLongValue(slotSearchStatName(false, true)))); assertEquals(1L, statsProvider.getLongValue(UNMATCHED_TASKS)); - assertEquals(2L, statsProvider.getLongValue(CACHE_STAT)); + assertEquals(2L, statsProvider.getLongValue(CACHE_SIZE_STAT_NAME)); } @Test
