You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@aurora.apache.org by jo...@apache.org on 2018/07/26 23:01:43 UTC

aurora git commit: Add size metric for memory stores, add MemSchedulerStoreTest

Repository: aurora
Updated Branches:
  refs/heads/master 4e28e73bb -> 3738c3e1a


Add size metric for memory stores, add MemSchedulerStoreTest

Currently, we only track the size metrics for:
- # of tasks via `task_store_index_(host|job)`
- # of crons via `mem_storage_cron_size`

I am hoping to add:
- # of attributes via `mem_storage_attributes_size`
- # of maintenance requests via `mem_storage_maintenance_size`
- # of job updates via `mem_storage_update_size`
- # of quotas via `mem_storage_quota_size`

This will help us track the growth of stores over time. Additionally, I added
a `MemSchedulerStoreTest` since one did not exist previously and nothing was
extending the abtract version of the test.

Reviewed at https://reviews.apache.org/r/68047/


Project: http://git-wip-us.apache.org/repos/asf/aurora/repo
Commit: http://git-wip-us.apache.org/repos/asf/aurora/commit/3738c3e1
Tree: http://git-wip-us.apache.org/repos/asf/aurora/tree/3738c3e1
Diff: http://git-wip-us.apache.org/repos/asf/aurora/diff/3738c3e1

Branch: refs/heads/master
Commit: 3738c3e1afc4b3835385116745088479a4cfac30
Parents: 4e28e73
Author: Jordan Ly <jo...@gmail.com>
Authored: Thu Jul 26 16:01:16 2018 -0700
Committer: Jordan Ly <jl...@twitter.com>
Committed: Thu Jul 26 16:01:16 2018 -0700

----------------------------------------------------------------------
 .../storage/mem/MemAttributeStore.java          | 11 ++++++
 .../scheduler/storage/mem/MemCronJobStore.java  |  4 +-
 .../storage/mem/MemHostMaintenanceStore.java    | 11 ++++++
 .../storage/mem/MemJobUpdateStore.java          | 10 +++++
 .../scheduler/storage/mem/MemQuotaStore.java    | 10 +++++
 .../storage/AbstractAttributeStoreTest.java     | 21 ++++++----
 .../storage/AbstractCronJobStoreTest.java       |  2 +-
 .../AbstractHostMaintenanceStoreTest.java       | 22 +++++++----
 .../storage/AbstractJobUpdateStoreTest.java     | 23 ++++++-----
 .../storage/AbstractQuotaStoreTest.java         | 27 +++++++------
 .../storage/AbstractSchedulerStoreTest.java     | 14 +++++--
 .../storage/AbstractTaskStoreTest.java          |  2 +-
 .../storage/mem/MemAttributeStoreTest.java      | 37 ++++++++++++++++--
 .../storage/mem/MemCronJobStoreTest.java        | 10 ++---
 .../mem/MemHostMaintenanceStoreTest.java        | 39 +++++++++++++++++--
 .../storage/mem/MemJobUpdateStoreTest.java      | 40 ++++++++++++++++----
 .../storage/mem/MemQuotaStoreTest.java          | 39 +++++++++++++++++--
 .../storage/mem/MemSchedulerStoreTest.java      | 40 ++++++++++++++++++++
 18 files changed, 296 insertions(+), 66 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/aurora/blob/3738c3e1/src/main/java/org/apache/aurora/scheduler/storage/mem/MemAttributeStore.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/aurora/scheduler/storage/mem/MemAttributeStore.java b/src/main/java/org/apache/aurora/scheduler/storage/mem/MemAttributeStore.java
index 67684cf..2dde04e 100644
--- a/src/main/java/org/apache/aurora/scheduler/storage/mem/MemAttributeStore.java
+++ b/src/main/java/org/apache/aurora/scheduler/storage/mem/MemAttributeStore.java
@@ -17,11 +17,14 @@ import java.util.Map;
 import java.util.Optional;
 import java.util.Set;
 
+import com.google.common.annotations.VisibleForTesting;
 import com.google.common.base.Preconditions;
 import com.google.common.collect.FluentIterable;
 import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Maps;
+import com.google.inject.Inject;
 
+import org.apache.aurora.common.stats.StatsProvider;
 import org.apache.aurora.gen.Attribute;
 import org.apache.aurora.gen.HostAttributes;
 import org.apache.aurora.gen.MaintenanceMode;
@@ -32,8 +35,16 @@ import org.apache.aurora.scheduler.storage.entities.IHostAttributes;
  * An in-memory attribute store.
  */
 class MemAttributeStore implements AttributeStore.Mutable {
+  @VisibleForTesting
+  static final String ATTRIBUTE_STORE_SIZE = "mem_storage_attribute_size";
+
   private final Map<String, IHostAttributes> hostAttributes = Maps.newConcurrentMap();
 
+  @Inject
+  MemAttributeStore(StatsProvider statsProvider) {
+    statsProvider.makeGauge(ATTRIBUTE_STORE_SIZE, hostAttributes::size);
+  }
+
   @Override
   public void deleteHostAttributes() {
     hostAttributes.clear();

http://git-wip-us.apache.org/repos/asf/aurora/blob/3738c3e1/src/main/java/org/apache/aurora/scheduler/storage/mem/MemCronJobStore.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/aurora/scheduler/storage/mem/MemCronJobStore.java b/src/main/java/org/apache/aurora/scheduler/storage/mem/MemCronJobStore.java
index a1e1f1e..0062c9d 100644
--- a/src/main/java/org/apache/aurora/scheduler/storage/mem/MemCronJobStore.java
+++ b/src/main/java/org/apache/aurora/scheduler/storage/mem/MemCronJobStore.java
@@ -34,13 +34,13 @@ import org.apache.aurora.scheduler.storage.entities.IJobKey;
  */
 class MemCronJobStore implements CronJobStore.Mutable {
   @VisibleForTesting
-  static final String CRON_JOBS_SIZE = "mem_storage_cron_size";
+  static final String CRON_STORE_SIZE = "mem_storage_cron_size";
 
   private final Map<IJobKey, IJobConfiguration> jobs = Maps.newConcurrentMap();
 
   @Inject
   MemCronJobStore(StatsProvider statsProvider) {
-    statsProvider.makeGauge(CRON_JOBS_SIZE, () -> jobs.size());
+    statsProvider.makeGauge(CRON_STORE_SIZE, jobs::size);
   }
 
   @Timed("mem_storage_cron_save_accepted_job")

http://git-wip-us.apache.org/repos/asf/aurora/blob/3738c3e1/src/main/java/org/apache/aurora/scheduler/storage/mem/MemHostMaintenanceStore.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/aurora/scheduler/storage/mem/MemHostMaintenanceStore.java b/src/main/java/org/apache/aurora/scheduler/storage/mem/MemHostMaintenanceStore.java
index c8d96f2..9afc892 100644
--- a/src/main/java/org/apache/aurora/scheduler/storage/mem/MemHostMaintenanceStore.java
+++ b/src/main/java/org/apache/aurora/scheduler/storage/mem/MemHostMaintenanceStore.java
@@ -17,17 +17,28 @@ import java.util.Map;
 import java.util.Optional;
 import java.util.Set;
 
+import javax.inject.Inject;
+
+import com.google.common.annotations.VisibleForTesting;
 import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Maps;
 
+import org.apache.aurora.common.stats.StatsProvider;
 import org.apache.aurora.scheduler.storage.HostMaintenanceStore;
 import org.apache.aurora.scheduler.storage.entities.IHostMaintenanceRequest;
 
 public class MemHostMaintenanceStore implements HostMaintenanceStore.Mutable {
+  @VisibleForTesting
+  static final String MAINTENANCE_STORE_SIZE = "mem_storage_maintenance_size";
 
   private final Map<String, IHostMaintenanceRequest> hostMaintenanceRequests =
       Maps.newConcurrentMap();
 
+  @Inject
+  MemHostMaintenanceStore(StatsProvider statsProvider) {
+    statsProvider.makeGauge(MAINTENANCE_STORE_SIZE, hostMaintenanceRequests::size);
+  }
+
   @Override
   public Optional<IHostMaintenanceRequest> getHostMaintenanceRequest(String host) {
     return Optional.ofNullable(hostMaintenanceRequests.get(host));

http://git-wip-us.apache.org/repos/asf/aurora/blob/3738c3e1/src/main/java/org/apache/aurora/scheduler/storage/mem/MemJobUpdateStore.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/aurora/scheduler/storage/mem/MemJobUpdateStore.java b/src/main/java/org/apache/aurora/scheduler/storage/mem/MemJobUpdateStore.java
index 9e86b9e..d6b42e8 100644
--- a/src/main/java/org/apache/aurora/scheduler/storage/mem/MemJobUpdateStore.java
+++ b/src/main/java/org/apache/aurora/scheduler/storage/mem/MemJobUpdateStore.java
@@ -22,15 +22,18 @@ import java.util.function.Predicate;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
+import com.google.common.annotations.VisibleForTesting;
 import com.google.common.base.Preconditions;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Iterables;
 import com.google.common.collect.Maps;
 import com.google.common.collect.Ordering;
 import com.google.common.primitives.Longs;
+import com.google.inject.Inject;
 
 import org.apache.aurora.common.base.MorePreconditions;
 import org.apache.aurora.common.inject.TimedInterceptor.Timed;
+import org.apache.aurora.common.stats.StatsProvider;
 import org.apache.aurora.gen.JobInstanceUpdateEvent;
 import org.apache.aurora.gen.JobUpdateDetails;
 import org.apache.aurora.gen.JobUpdateEvent;
@@ -48,6 +51,8 @@ import org.apache.aurora.scheduler.storage.entities.IJobUpdateQuery;
 import static java.util.Objects.requireNonNull;
 
 public class MemJobUpdateStore implements JobUpdateStore.Mutable {
+  @VisibleForTesting
+  static final String UPDATE_STORE_SIZE = "mem_storage_update_size";
 
   private static final Ordering<IJobUpdateDetails> REVERSE_LAST_MODIFIED_ORDER = Ordering.natural()
       .reverse()
@@ -55,6 +60,11 @@ public class MemJobUpdateStore implements JobUpdateStore.Mutable {
 
   private final Map<IJobUpdateKey, IJobUpdateDetails> updates = Maps.newConcurrentMap();
 
+  @Inject
+  MemJobUpdateStore(StatsProvider statsProvider) {
+    statsProvider.makeGauge(UPDATE_STORE_SIZE, updates::size);
+  }
+
   @Timed("job_update_store_fetch_details_query")
   @Override
   public synchronized List<IJobUpdateDetails> fetchJobUpdates(IJobUpdateQuery query) {

http://git-wip-us.apache.org/repos/asf/aurora/blob/3738c3e1/src/main/java/org/apache/aurora/scheduler/storage/mem/MemQuotaStore.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/aurora/scheduler/storage/mem/MemQuotaStore.java b/src/main/java/org/apache/aurora/scheduler/storage/mem/MemQuotaStore.java
index afb29fc..b8f79e9 100644
--- a/src/main/java/org/apache/aurora/scheduler/storage/mem/MemQuotaStore.java
+++ b/src/main/java/org/apache/aurora/scheduler/storage/mem/MemQuotaStore.java
@@ -16,9 +16,12 @@ package org.apache.aurora.scheduler.storage.mem;
 import java.util.Map;
 import java.util.Optional;
 
+import com.google.common.annotations.VisibleForTesting;
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.Maps;
+import com.google.inject.Inject;
 
+import org.apache.aurora.common.stats.StatsProvider;
 import org.apache.aurora.scheduler.storage.QuotaStore;
 import org.apache.aurora.scheduler.storage.entities.IResourceAggregate;
 
@@ -26,9 +29,16 @@ import org.apache.aurora.scheduler.storage.entities.IResourceAggregate;
  * An in-memory quota store.
  */
 class MemQuotaStore implements QuotaStore.Mutable {
+  @VisibleForTesting
+  static final String QUOTA_STORE_SIZE = "mem_storage_quota_size";
 
   private final Map<String, IResourceAggregate> quotas = Maps.newConcurrentMap();
 
+  @Inject
+  MemQuotaStore(StatsProvider statsProvider) {
+    statsProvider.makeGauge(QUOTA_STORE_SIZE, quotas::size);
+  }
+
   @Override
   public void deleteQuotas() {
     quotas.clear();

http://git-wip-us.apache.org/repos/asf/aurora/blob/3738c3e1/src/test/java/org/apache/aurora/scheduler/storage/AbstractAttributeStoreTest.java
----------------------------------------------------------------------
diff --git a/src/test/java/org/apache/aurora/scheduler/storage/AbstractAttributeStoreTest.java b/src/test/java/org/apache/aurora/scheduler/storage/AbstractAttributeStoreTest.java
index 687fd96..952d58b 100644
--- a/src/test/java/org/apache/aurora/scheduler/storage/AbstractAttributeStoreTest.java
+++ b/src/test/java/org/apache/aurora/scheduler/storage/AbstractAttributeStoreTest.java
@@ -13,11 +13,13 @@
  */
 package org.apache.aurora.scheduler.storage;
 
-import java.io.IOException;
 import java.util.Optional;
 import java.util.Set;
 
 import com.google.common.collect.ImmutableSet;
+import com.google.inject.Guice;
+import com.google.inject.Injector;
+import com.google.inject.Module;
 
 import org.apache.aurora.gen.Attribute;
 import org.apache.aurora.gen.HostAttributes;
@@ -45,25 +47,28 @@ public abstract class AbstractAttributeStoreTest {
   private static final Attribute ATTR1 = new Attribute("attr1", ImmutableSet.of("a", "b", "c"));
   private static final Attribute ATTR2 = new Attribute("attr2", ImmutableSet.of("d", "e", "f"));
   private static final Attribute ATTR3 = new Attribute("attr3", ImmutableSet.of("a", "d", "g"));
-  private static final IHostAttributes HOST_A_ATTRS =
+  protected static final IHostAttributes HOST_A_ATTRS =
       IHostAttributes.build(new HostAttributes(HOST_A, ImmutableSet.of(ATTR1, ATTR2))
           .setSlaveId(SLAVE_A)
           .setAttributes(ImmutableSet.of())
           .setMode(MaintenanceMode.NONE));
-  private static final IHostAttributes HOST_B_ATTRS =
+  protected static final IHostAttributes HOST_B_ATTRS =
       IHostAttributes.build(new HostAttributes(HOST_B, ImmutableSet.of(ATTR2, ATTR3))
           .setSlaveId(SLAVE_B)
           .setAttributes(ImmutableSet.of())
           .setMode(MaintenanceMode.DRAINING));
 
+  protected Injector injector;
   private Storage storage;
 
   @Before
-  public void setUp() throws IOException {
-    storage = createStorage();
+  public void setUp() {
+    injector = Guice.createInjector(getStorageModule());
+    storage = injector.getInstance(Storage.class);
+    storage.prepare();
   }
 
-  protected abstract Storage createStorage();
+  protected abstract Module getStorageModule();
 
   @Test
   public void testSaveAttributes() {
@@ -170,7 +175,7 @@ public abstract class AbstractAttributeStoreTest {
     assertEquals(Optional.of(hostAUpdated), read(HOST_A));
   }
 
-  private boolean insert(IHostAttributes attributes) {
+  protected boolean insert(IHostAttributes attributes) {
     return storage.write(
         storeProvider -> storeProvider.getAttributeStore().saveHostAttributes(attributes));
   }
@@ -183,7 +188,7 @@ public abstract class AbstractAttributeStoreTest {
     return storage.read(storeProvider -> storeProvider.getAttributeStore().getHostAttributes());
   }
 
-  private void truncate() {
+  protected void truncate() {
     storage.write(
         (NoResult.Quiet) storeProvider -> storeProvider.getAttributeStore().deleteHostAttributes());
   }

http://git-wip-us.apache.org/repos/asf/aurora/blob/3738c3e1/src/test/java/org/apache/aurora/scheduler/storage/AbstractCronJobStoreTest.java
----------------------------------------------------------------------
diff --git a/src/test/java/org/apache/aurora/scheduler/storage/AbstractCronJobStoreTest.java b/src/test/java/org/apache/aurora/scheduler/storage/AbstractCronJobStoreTest.java
index 889cb01..ccfd428 100644
--- a/src/test/java/org/apache/aurora/scheduler/storage/AbstractCronJobStoreTest.java
+++ b/src/test/java/org/apache/aurora/scheduler/storage/AbstractCronJobStoreTest.java
@@ -53,7 +53,7 @@ public abstract class AbstractCronJobStoreTest {
   protected abstract Module getStorageModule();
 
   @Before
-  public void baseSetUp() {
+  public void setUp() {
     injector = Guice.createInjector(getStorageModule());
     storage = injector.getInstance(Storage.class);
     storage.prepare();

http://git-wip-us.apache.org/repos/asf/aurora/blob/3738c3e1/src/test/java/org/apache/aurora/scheduler/storage/AbstractHostMaintenanceStoreTest.java
----------------------------------------------------------------------
diff --git a/src/test/java/org/apache/aurora/scheduler/storage/AbstractHostMaintenanceStoreTest.java b/src/test/java/org/apache/aurora/scheduler/storage/AbstractHostMaintenanceStoreTest.java
index e95955c..17f4385 100644
--- a/src/test/java/org/apache/aurora/scheduler/storage/AbstractHostMaintenanceStoreTest.java
+++ b/src/test/java/org/apache/aurora/scheduler/storage/AbstractHostMaintenanceStoreTest.java
@@ -18,6 +18,9 @@ import java.util.Optional;
 import java.util.Set;
 
 import com.google.common.collect.ImmutableSet;
+import com.google.inject.Guice;
+import com.google.inject.Injector;
+import com.google.inject.Module;
 
 import org.apache.aurora.gen.CountSlaPolicy;
 import org.apache.aurora.gen.HostMaintenanceRequest;
@@ -31,8 +34,8 @@ import static org.junit.Assert.assertEquals;
 
 public abstract class AbstractHostMaintenanceStoreTest {
 
-  private static final String HOST_A = "hostA";
-  private static final String HOST_B = "hostB";
+  protected static final String HOST_A = "hostA";
+  protected static final String HOST_B = "hostB";
 
   private static final SlaPolicy PERCENTAGE_SLA_POLICY = SlaPolicy.percentageSlaPolicy(
       new PercentageSlaPolicy()
@@ -46,7 +49,7 @@ public abstract class AbstractHostMaintenanceStoreTest {
           .setDurationSecs(1800)
   );
 
-  private static final IHostMaintenanceRequest HOST_A_MAINTENANCE_REQUEST =
+  protected static final IHostMaintenanceRequest HOST_A_MAINTENANCE_REQUEST =
       IHostMaintenanceRequest.build(new HostMaintenanceRequest()
           .setHost(HOST_A)
           .setDefaultSlaPolicy(PERCENTAGE_SLA_POLICY)
@@ -54,7 +57,7 @@ public abstract class AbstractHostMaintenanceStoreTest {
           .setTimeoutSecs(1800)
       );
 
-  private static final IHostMaintenanceRequest HOST_B_MAINTENANCE_REQUEST =
+  protected static final IHostMaintenanceRequest HOST_B_MAINTENANCE_REQUEST =
       IHostMaintenanceRequest.build(new HostMaintenanceRequest()
           .setHost(HOST_B)
           .setDefaultSlaPolicy(COUNT_SLA_POLICY)
@@ -62,14 +65,17 @@ public abstract class AbstractHostMaintenanceStoreTest {
           .setTimeoutSecs(1800)
       );
 
+  protected Injector injector;
   private Storage storage;
 
   @Before
   public void setUp() {
-    storage = createStorage();
+    injector = Guice.createInjector(getStorageModule());
+    storage = injector.getInstance(Storage.class);
+    storage.prepare();
   }
 
-  protected abstract Storage createStorage();
+  protected abstract Module getStorageModule();
 
   @Test
   public void testReadHostMaintenanceRequestNonExistant() {
@@ -135,7 +141,7 @@ public abstract class AbstractHostMaintenanceStoreTest {
     assertEquals(Optional.empty(), read(HOST_A));
   }
 
-  private void insert(IHostMaintenanceRequest hostMaintenanceRequest) {
+  protected void insert(IHostMaintenanceRequest hostMaintenanceRequest) {
     storage.write(
         store -> {
           store.getHostMaintenanceStore().saveHostMaintenanceRequest(hostMaintenanceRequest);
@@ -151,7 +157,7 @@ public abstract class AbstractHostMaintenanceStoreTest {
     return storage.read(store -> store.getHostMaintenanceStore().getHostMaintenanceRequests());
   }
 
-  private void truncate(String host) {
+  protected void truncate(String host) {
     storage.write(
         (Storage.MutateWork.NoResult.Quiet) store -> store
             .getHostMaintenanceStore()

http://git-wip-us.apache.org/repos/asf/aurora/blob/3738c3e1/src/test/java/org/apache/aurora/scheduler/storage/AbstractJobUpdateStoreTest.java
----------------------------------------------------------------------
diff --git a/src/test/java/org/apache/aurora/scheduler/storage/AbstractJobUpdateStoreTest.java b/src/test/java/org/apache/aurora/scheduler/storage/AbstractJobUpdateStoreTest.java
index 6af66aa..3a93650 100644
--- a/src/test/java/org/apache/aurora/scheduler/storage/AbstractJobUpdateStoreTest.java
+++ b/src/test/java/org/apache/aurora/scheduler/storage/AbstractJobUpdateStoreTest.java
@@ -11,7 +11,6 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-
 package org.apache.aurora.scheduler.storage;
 
 import java.util.List;
@@ -22,7 +21,9 @@ import java.util.stream.Stream;
 
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableSet;
+import com.google.inject.Guice;
 import com.google.inject.Injector;
+import com.google.inject.Module;
 
 import org.apache.aurora.gen.InstanceTaskConfig;
 import org.apache.aurora.gen.JobInstanceUpdateEvent;
@@ -80,16 +81,18 @@ public abstract class AbstractJobUpdateStoreTest {
   private static final ImmutableSet<Metadata> METADATA =
       ImmutableSet.of(new Metadata("k1", "v1"), new Metadata("k2", "v2"), new Metadata("k3", "v3"));
 
-  private Storage storage;
+  protected Injector injector;
+  protected Storage storage;
+
+  protected abstract Module getStorageModule();
 
   @Before
-  public void setUp() throws Exception {
-    Injector injector = createStorageInjector();
+  public void setUp() {
+    injector = Guice.createInjector(getStorageModule());
     storage = injector.getInstance(Storage.class);
+    storage.prepare();
   }
 
-  protected abstract Injector createStorageInjector();
-
   @After
   public void tearDown() throws Exception {
     truncateUpdates();
@@ -486,7 +489,7 @@ public abstract class AbstractJobUpdateStoreTest {
     return makeKey(JOB, id);
   }
 
-  private static IJobUpdateKey makeKey(IJobKey job, String id) {
+  protected static IJobUpdateKey makeKey(IJobKey job, String id) {
     return IJobUpdateKey.build(new JobUpdateKey(job.newBuilder(), id));
   }
 
@@ -515,7 +518,7 @@ public abstract class AbstractJobUpdateStoreTest {
         storeProvider.getJobUpdateStore().fetchJobUpdates(IJobUpdateQuery.build(query)));
   }
 
-  private void saveUpdate(IJobUpdateDetails update) {
+  protected void saveUpdate(IJobUpdateDetails update) {
     storage.write((NoResult.Quiet) storeProvider -> {
       JobUpdateStore.Mutable store = storeProvider.getJobUpdateStore();
       store.saveJobUpdate(update.getUpdate());
@@ -539,7 +542,7 @@ public abstract class AbstractJobUpdateStoreTest {
         storeProvider -> storeProvider.getJobUpdateStore().saveJobInstanceUpdateEvent(key, event));
   }
 
-  private void truncateUpdates() {
+  protected void truncateUpdates() {
     storage.write((NoResult.Quiet)
         storeProvider -> storeProvider.getJobUpdateStore().deleteAllUpdates());
   }
@@ -603,7 +606,7 @@ public abstract class AbstractJobUpdateStoreTest {
         .setMetadata(METADATA));
   }
 
-  private static IJobUpdateDetails makeJobUpdate(IJobUpdateKey key) {
+  protected static IJobUpdateDetails makeJobUpdate(IJobUpdateKey key) {
     return IJobUpdateDetails.build(new JobUpdateDetails()
         .setUpdateEvents(ImmutableList.of(FIRST_EVENT.newBuilder()))
         .setUpdate(new JobUpdate()

http://git-wip-us.apache.org/repos/asf/aurora/blob/3738c3e1/src/test/java/org/apache/aurora/scheduler/storage/AbstractQuotaStoreTest.java
----------------------------------------------------------------------
diff --git a/src/test/java/org/apache/aurora/scheduler/storage/AbstractQuotaStoreTest.java b/src/test/java/org/apache/aurora/scheduler/storage/AbstractQuotaStoreTest.java
index e1d7da5..8328247 100644
--- a/src/test/java/org/apache/aurora/scheduler/storage/AbstractQuotaStoreTest.java
+++ b/src/test/java/org/apache/aurora/scheduler/storage/AbstractQuotaStoreTest.java
@@ -13,11 +13,13 @@
  */
 package org.apache.aurora.scheduler.storage;
 
-import java.io.IOException;
 import java.util.Map;
 import java.util.Optional;
 
 import com.google.common.collect.ImmutableMap;
+import com.google.inject.Guice;
+import com.google.inject.Injector;
+import com.google.inject.Module;
 
 import org.apache.aurora.scheduler.resources.ResourceTestUtil;
 import org.apache.aurora.scheduler.storage.Storage.MutateWork.NoResult;
@@ -30,19 +32,22 @@ import static org.junit.Assert.assertEquals;
 
 public abstract class AbstractQuotaStoreTest {
 
-  private static final String ROLE_A = "roleA";
-  private static final String ROLE_B = "roleB";
-  private static final IResourceAggregate QUOTA_A = ResourceTestUtil.aggregate(1.0, 2, 3);
-  private static final IResourceAggregate QUOTA_B = ResourceTestUtil.aggregate(2.0, 4, 6);
+  protected static final String ROLE_A = "roleA";
+  protected static final String ROLE_B = "roleB";
+  protected static final IResourceAggregate QUOTA_A = ResourceTestUtil.aggregate(1.0, 2, 3);
+  protected static final IResourceAggregate QUOTA_B = ResourceTestUtil.aggregate(2.0, 4, 6);
 
+  protected Injector injector;
   private Storage storage;
 
   @Before
-  public void setUp() throws IOException {
-    storage = createStorage();
+  public void setUp() {
+    injector = Guice.createInjector(getStorageModule());
+    storage = injector.getInstance(Storage.class);
+    storage.prepare();
   }
 
-  protected abstract Storage createStorage();
+  protected abstract Module getStorageModule();
 
   @Test
   public void testCrud() {
@@ -84,7 +89,7 @@ public abstract class AbstractQuotaStoreTest {
     assertQuotas(ImmutableMap.of(ROLE_A, QUOTA_B));
   }
 
-  private void save(String role, IResourceAggregate quota) {
+  protected void save(String role, IResourceAggregate quota) {
     storage.write(
         (NoResult.Quiet) storeProvider -> storeProvider.getQuotaStore().saveQuota(role, quota));
   }
@@ -100,12 +105,12 @@ public abstract class AbstractQuotaStoreTest {
     );
   }
 
-  private void delete(String role) {
+  protected void delete(String role) {
     storage.write(
         (NoResult.Quiet) storeProvider -> storeProvider.getQuotaStore().removeQuota(role));
   }
 
-  private void deleteAll() {
+  protected void deleteAll() {
     storage.write((NoResult.Quiet) storeProvider -> storeProvider.getQuotaStore().deleteQuotas());
   }
 }

http://git-wip-us.apache.org/repos/asf/aurora/blob/3738c3e1/src/test/java/org/apache/aurora/scheduler/storage/AbstractSchedulerStoreTest.java
----------------------------------------------------------------------
diff --git a/src/test/java/org/apache/aurora/scheduler/storage/AbstractSchedulerStoreTest.java b/src/test/java/org/apache/aurora/scheduler/storage/AbstractSchedulerStoreTest.java
index cb80519..74d2448 100644
--- a/src/test/java/org/apache/aurora/scheduler/storage/AbstractSchedulerStoreTest.java
+++ b/src/test/java/org/apache/aurora/scheduler/storage/AbstractSchedulerStoreTest.java
@@ -13,9 +13,12 @@
  */
 package org.apache.aurora.scheduler.storage;
 
-import java.io.IOException;
 import java.util.Optional;
 
+import com.google.inject.Guice;
+import com.google.inject.Injector;
+import com.google.inject.Module;
+
 import org.apache.aurora.scheduler.storage.Storage.MutateWork.NoResult;
 import org.junit.Before;
 import org.junit.Test;
@@ -24,14 +27,17 @@ import static org.junit.Assert.assertEquals;
 
 public abstract class AbstractSchedulerStoreTest {
 
+  protected Injector injector;
   private Storage storage;
 
   @Before
-  public void setUp() throws IOException {
-    storage = createStorage();
+  public void setUp() {
+    injector = Guice.createInjector(getStorageModule());
+    storage = injector.getInstance(Storage.class);
+    storage.prepare();
   }
 
-  protected abstract Storage createStorage();
+  protected abstract Module getStorageModule();
 
   @Test
   public void testSchedulerStore() {

http://git-wip-us.apache.org/repos/asf/aurora/blob/3738c3e1/src/test/java/org/apache/aurora/scheduler/storage/AbstractTaskStoreTest.java
----------------------------------------------------------------------
diff --git a/src/test/java/org/apache/aurora/scheduler/storage/AbstractTaskStoreTest.java b/src/test/java/org/apache/aurora/scheduler/storage/AbstractTaskStoreTest.java
index c53e584..bb714ee 100644
--- a/src/test/java/org/apache/aurora/scheduler/storage/AbstractTaskStoreTest.java
+++ b/src/test/java/org/apache/aurora/scheduler/storage/AbstractTaskStoreTest.java
@@ -100,7 +100,7 @@ public abstract class AbstractTaskStoreTest extends TearDownTestCase {
   protected abstract Module getStorageModule();
 
   @Before
-  public void baseSetUp() {
+  public void setUp() {
     injector = Guice.createInjector(getStorageModule());
     storage = injector.getInstance(Storage.class);
     storage.prepare();

http://git-wip-us.apache.org/repos/asf/aurora/blob/3738c3e1/src/test/java/org/apache/aurora/scheduler/storage/mem/MemAttributeStoreTest.java
----------------------------------------------------------------------
diff --git a/src/test/java/org/apache/aurora/scheduler/storage/mem/MemAttributeStoreTest.java b/src/test/java/org/apache/aurora/scheduler/storage/mem/MemAttributeStoreTest.java
index 64b19a9..795950e 100644
--- a/src/test/java/org/apache/aurora/scheduler/storage/mem/MemAttributeStoreTest.java
+++ b/src/test/java/org/apache/aurora/scheduler/storage/mem/MemAttributeStoreTest.java
@@ -13,12 +13,43 @@
  */
 package org.apache.aurora.scheduler.storage.mem;
 
+import com.google.inject.AbstractModule;
+import com.google.inject.Module;
+import com.google.inject.util.Modules;
+
+import org.apache.aurora.common.stats.StatsProvider;
 import org.apache.aurora.scheduler.storage.AbstractAttributeStoreTest;
-import org.apache.aurora.scheduler.storage.Storage;
+import org.apache.aurora.scheduler.testing.FakeStatsProvider;
+import org.junit.Test;
+
+import static org.apache.aurora.scheduler.storage.mem.MemAttributeStore.ATTRIBUTE_STORE_SIZE;
+import static org.junit.Assert.assertEquals;
 
 public class MemAttributeStoreTest extends AbstractAttributeStoreTest {
+
+  private FakeStatsProvider statsProvider;
+
   @Override
-  protected Storage createStorage() {
-    return MemStorageModule.newEmptyStorage();
+  protected Module getStorageModule() {
+    statsProvider = new FakeStatsProvider();
+    return Modules.combine(
+        new MemStorageModule(),
+        new AbstractModule() {
+          @Override
+          protected void configure() {
+            bind(StatsProvider.class).toInstance(statsProvider);
+          }
+        });
+  }
+
+  @Test
+  public void testStoreSize() {
+    assertEquals(0L, statsProvider.getLongValue(ATTRIBUTE_STORE_SIZE));
+    insert(HOST_A_ATTRS);
+    assertEquals(1L, statsProvider.getLongValue(ATTRIBUTE_STORE_SIZE));
+    insert(HOST_B_ATTRS);
+    assertEquals(2L, statsProvider.getLongValue(ATTRIBUTE_STORE_SIZE));
+    truncate();
+    assertEquals(0L, statsProvider.getLongValue(ATTRIBUTE_STORE_SIZE));
   }
 }

http://git-wip-us.apache.org/repos/asf/aurora/blob/3738c3e1/src/test/java/org/apache/aurora/scheduler/storage/mem/MemCronJobStoreTest.java
----------------------------------------------------------------------
diff --git a/src/test/java/org/apache/aurora/scheduler/storage/mem/MemCronJobStoreTest.java b/src/test/java/org/apache/aurora/scheduler/storage/mem/MemCronJobStoreTest.java
index 15e0e30..c56c706 100644
--- a/src/test/java/org/apache/aurora/scheduler/storage/mem/MemCronJobStoreTest.java
+++ b/src/test/java/org/apache/aurora/scheduler/storage/mem/MemCronJobStoreTest.java
@@ -22,7 +22,7 @@ import org.apache.aurora.scheduler.storage.AbstractCronJobStoreTest;
 import org.apache.aurora.scheduler.testing.FakeStatsProvider;
 import org.junit.Test;
 
-import static org.apache.aurora.scheduler.storage.mem.MemCronJobStore.CRON_JOBS_SIZE;
+import static org.apache.aurora.scheduler.storage.mem.MemCronJobStore.CRON_STORE_SIZE;
 import static org.junit.Assert.assertEquals;
 
 public class MemCronJobStoreTest extends AbstractCronJobStoreTest {
@@ -44,12 +44,12 @@ public class MemCronJobStoreTest extends AbstractCronJobStoreTest {
 
   @Test
   public void testStoreSize() {
-    assertEquals(0L, statsProvider.getLongValue(CRON_JOBS_SIZE));
+    assertEquals(0L, statsProvider.getLongValue(CRON_STORE_SIZE));
     saveAcceptedJob(JOB_A);
-    assertEquals(1L, statsProvider.getLongValue(CRON_JOBS_SIZE));
+    assertEquals(1L, statsProvider.getLongValue(CRON_STORE_SIZE));
     saveAcceptedJob(JOB_B);
-    assertEquals(2L, statsProvider.getLongValue(CRON_JOBS_SIZE));
+    assertEquals(2L, statsProvider.getLongValue(CRON_STORE_SIZE));
     deleteJobs();
-    assertEquals(0L, statsProvider.getLongValue(CRON_JOBS_SIZE));
+    assertEquals(0L, statsProvider.getLongValue(CRON_STORE_SIZE));
   }
 }

http://git-wip-us.apache.org/repos/asf/aurora/blob/3738c3e1/src/test/java/org/apache/aurora/scheduler/storage/mem/MemHostMaintenanceStoreTest.java
----------------------------------------------------------------------
diff --git a/src/test/java/org/apache/aurora/scheduler/storage/mem/MemHostMaintenanceStoreTest.java b/src/test/java/org/apache/aurora/scheduler/storage/mem/MemHostMaintenanceStoreTest.java
index ce1a9d6..f259657 100644
--- a/src/test/java/org/apache/aurora/scheduler/storage/mem/MemHostMaintenanceStoreTest.java
+++ b/src/test/java/org/apache/aurora/scheduler/storage/mem/MemHostMaintenanceStoreTest.java
@@ -13,13 +13,46 @@
  */
 package org.apache.aurora.scheduler.storage.mem;
 
+import com.google.inject.AbstractModule;
+import com.google.inject.Module;
+import com.google.inject.util.Modules;
+
+import org.apache.aurora.common.stats.StatsProvider;
 import org.apache.aurora.scheduler.storage.AbstractHostMaintenanceStoreTest;
-import org.apache.aurora.scheduler.storage.Storage;
+import org.apache.aurora.scheduler.testing.FakeStatsProvider;
+import org.junit.Test;
+
+import static org.apache.aurora.scheduler.storage.mem.MemHostMaintenanceStore.MAINTENANCE_STORE_SIZE;
+import static org.junit.Assert.assertEquals;
 
 public class MemHostMaintenanceStoreTest extends AbstractHostMaintenanceStoreTest {
+
+  private FakeStatsProvider statsProvider;
+
   @Override
-  protected Storage createStorage() {
-    return MemStorageModule.newEmptyStorage();
+  protected Module getStorageModule() {
+    statsProvider = new FakeStatsProvider();
+    return Modules.combine(
+        new MemStorageModule(),
+        new AbstractModule() {
+          @Override
+          protected void configure() {
+            bind(StatsProvider.class).toInstance(statsProvider);
+          }
+        });
+  }
+
+  @Test
+  public void testStoreSize() {
+    assertEquals(0L, statsProvider.getLongValue(MAINTENANCE_STORE_SIZE));
+    insert(HOST_A_MAINTENANCE_REQUEST);
+    assertEquals(1L, statsProvider.getLongValue(MAINTENANCE_STORE_SIZE));
+    insert(HOST_B_MAINTENANCE_REQUEST);
+    assertEquals(2L, statsProvider.getLongValue(MAINTENANCE_STORE_SIZE));
+    truncate(HOST_A);
+    assertEquals(1L, statsProvider.getLongValue(MAINTENANCE_STORE_SIZE));
+    truncate(HOST_B);
+    assertEquals(0L, statsProvider.getLongValue(MAINTENANCE_STORE_SIZE));
   }
 }
 

http://git-wip-us.apache.org/repos/asf/aurora/blob/3738c3e1/src/test/java/org/apache/aurora/scheduler/storage/mem/MemJobUpdateStoreTest.java
----------------------------------------------------------------------
diff --git a/src/test/java/org/apache/aurora/scheduler/storage/mem/MemJobUpdateStoreTest.java b/src/test/java/org/apache/aurora/scheduler/storage/mem/MemJobUpdateStoreTest.java
index cbf1bc4..bddd557 100644
--- a/src/test/java/org/apache/aurora/scheduler/storage/mem/MemJobUpdateStoreTest.java
+++ b/src/test/java/org/apache/aurora/scheduler/storage/mem/MemJobUpdateStoreTest.java
@@ -14,25 +14,51 @@
 package org.apache.aurora.scheduler.storage.mem;
 
 import com.google.inject.AbstractModule;
-import com.google.inject.Guice;
-import com.google.inject.Injector;
+import com.google.inject.Module;
+import com.google.inject.util.Modules;
 
 import org.apache.aurora.common.stats.StatsProvider;
+import org.apache.aurora.scheduler.base.JobKeys;
 import org.apache.aurora.scheduler.storage.AbstractJobUpdateStoreTest;
+import org.apache.aurora.scheduler.storage.entities.IJobUpdateDetails;
+import org.apache.aurora.scheduler.storage.entities.IJobUpdateKey;
 import org.apache.aurora.scheduler.testing.FakeStatsProvider;
+import org.junit.Test;
+
+import static org.apache.aurora.scheduler.storage.mem.MemJobUpdateStore.UPDATE_STORE_SIZE;
+import static org.junit.Assert.assertEquals;
 
 public class MemJobUpdateStoreTest extends AbstractJobUpdateStoreTest {
+
+  private FakeStatsProvider statsProvider;
+
   @Override
-  protected Injector createStorageInjector() {
-    return Guice.createInjector(
+  protected Module getStorageModule() {
+    statsProvider = new FakeStatsProvider();
+    return Modules.combine(
         new MemStorageModule(),
         new AbstractModule() {
           @Override
           protected void configure() {
-            FakeStatsProvider stats = new FakeStatsProvider();
-            bind(StatsProvider.class).toInstance(stats);
-            bind(FakeStatsProvider.class).toInstance(stats);
+            bind(StatsProvider.class).toInstance(statsProvider);
           }
         });
   }
+
+  @Test
+  public void testStoreSize() {
+    IJobUpdateKey updateId1 = makeKey(JobKeys.from("role", "env", "name1"), "u1");
+    IJobUpdateKey updateId2 = makeKey(JobKeys.from("role", "env", "name2"), "u2");
+
+    IJobUpdateDetails update1 = makeJobUpdate(updateId1);
+    IJobUpdateDetails update2 = makeJobUpdate(updateId2);
+
+    assertEquals(0L, statsProvider.getLongValue(UPDATE_STORE_SIZE));
+    saveUpdate(update1);
+    assertEquals(1L, statsProvider.getLongValue(UPDATE_STORE_SIZE));
+    saveUpdate(update2);
+    assertEquals(2L, statsProvider.getLongValue(UPDATE_STORE_SIZE));
+    truncateUpdates();
+    assertEquals(0L, statsProvider.getLongValue(UPDATE_STORE_SIZE));
+  }
 }

http://git-wip-us.apache.org/repos/asf/aurora/blob/3738c3e1/src/test/java/org/apache/aurora/scheduler/storage/mem/MemQuotaStoreTest.java
----------------------------------------------------------------------
diff --git a/src/test/java/org/apache/aurora/scheduler/storage/mem/MemQuotaStoreTest.java b/src/test/java/org/apache/aurora/scheduler/storage/mem/MemQuotaStoreTest.java
index e8324ee..7ff2ceb 100644
--- a/src/test/java/org/apache/aurora/scheduler/storage/mem/MemQuotaStoreTest.java
+++ b/src/test/java/org/apache/aurora/scheduler/storage/mem/MemQuotaStoreTest.java
@@ -13,12 +13,45 @@
  */
 package org.apache.aurora.scheduler.storage.mem;
 
+import com.google.inject.AbstractModule;
+import com.google.inject.Module;
+import com.google.inject.util.Modules;
+
+import org.apache.aurora.common.stats.StatsProvider;
 import org.apache.aurora.scheduler.storage.AbstractQuotaStoreTest;
-import org.apache.aurora.scheduler.storage.Storage;
+import org.apache.aurora.scheduler.testing.FakeStatsProvider;
+import org.junit.Test;
+
+import static org.apache.aurora.scheduler.storage.mem.MemQuotaStore.QUOTA_STORE_SIZE;
+import static org.junit.Assert.assertEquals;
 
 public class MemQuotaStoreTest extends AbstractQuotaStoreTest {
+
+  private FakeStatsProvider statsProvider;
+
   @Override
-  protected Storage createStorage() {
-    return MemStorageModule.newEmptyStorage();
+  protected Module getStorageModule() {
+    statsProvider = new FakeStatsProvider();
+    return Modules.combine(
+        new MemStorageModule(),
+        new AbstractModule() {
+          @Override
+          protected void configure() {
+            bind(StatsProvider.class).toInstance(statsProvider);
+          }
+        });
+  }
+
+  @Test
+  public void testStoreSize() {
+    assertEquals(0L, statsProvider.getLongValue(QUOTA_STORE_SIZE));
+    save(ROLE_A, QUOTA_A);
+    assertEquals(1L, statsProvider.getLongValue(QUOTA_STORE_SIZE));
+    save(ROLE_B, QUOTA_B);
+    assertEquals(2L, statsProvider.getLongValue(QUOTA_STORE_SIZE));
+    delete(ROLE_A);
+    assertEquals(1L, statsProvider.getLongValue(QUOTA_STORE_SIZE));
+    deleteAll();
+    assertEquals(0L, statsProvider.getLongValue(QUOTA_STORE_SIZE));
   }
 }

http://git-wip-us.apache.org/repos/asf/aurora/blob/3738c3e1/src/test/java/org/apache/aurora/scheduler/storage/mem/MemSchedulerStoreTest.java
----------------------------------------------------------------------
diff --git a/src/test/java/org/apache/aurora/scheduler/storage/mem/MemSchedulerStoreTest.java b/src/test/java/org/apache/aurora/scheduler/storage/mem/MemSchedulerStoreTest.java
new file mode 100644
index 0000000..d9a2fdb
--- /dev/null
+++ b/src/test/java/org/apache/aurora/scheduler/storage/mem/MemSchedulerStoreTest.java
@@ -0,0 +1,40 @@
+/**
+ * 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.aurora.scheduler.storage.mem;
+
+import com.google.inject.AbstractModule;
+import com.google.inject.Module;
+import com.google.inject.util.Modules;
+
+import org.apache.aurora.common.stats.StatsProvider;
+import org.apache.aurora.scheduler.storage.AbstractSchedulerStoreTest;
+import org.apache.aurora.scheduler.testing.FakeStatsProvider;
+
+public class MemSchedulerStoreTest extends AbstractSchedulerStoreTest {
+
+  private FakeStatsProvider statsProvider;
+
+  @Override
+  protected Module getStorageModule() {
+    statsProvider = new FakeStatsProvider();
+    return Modules.combine(
+        new MemStorageModule(),
+        new AbstractModule() {
+          @Override
+          protected void configure() {
+            bind(StatsProvider.class).toInstance(statsProvider);
+          }
+        });
+  }
+}