You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@aurora.apache.org by dm...@apache.org on 2017/05/08 23:54:24 UTC

aurora git commit: Adding metrics for removals from BiCache

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 <re...@gmail.com>
Authored: Mon May 8 16:37:09 2017 -0700
Committer: David McLaughlin <dm...@twitter.com>
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