You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@aurora.apache.org by wf...@apache.org on 2016/01/22 23:15:59 UTC

aurora git commit: Remove storage backfill and TaskStore mutateTasks.

Repository: aurora
Updated Branches:
  refs/heads/master eae686023 -> 4b3d7bca9


Remove storage backfill and TaskStore mutateTasks.

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


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

Branch: refs/heads/master
Commit: 4b3d7bca93adc7857820f997fc5d0b1831761e15
Parents: eae6860
Author: Bill Farner <wf...@apache.org>
Authored: Fri Jan 22 14:15:55 2016 -0800
Committer: Bill Farner <wf...@apache.org>
Committed: Fri Jan 22 14:15:55 2016 -0800

----------------------------------------------------------------------
 .../aurora/scheduler/SchedulerLifecycle.java    |  6 +-
 .../aurora/scheduler/base/TaskTestUtil.java     |  2 +-
 .../scheduler/storage/StorageBackfill.java      | 84 --------------------
 .../aurora/scheduler/storage/TaskStore.java     | 13 ---
 .../scheduler/storage/db/DbTaskStore.java       | 42 +++-------
 .../storage/log/WriteAheadStorage.java          | 21 -----
 .../scheduler/storage/mem/MemTaskStore.java     | 36 ++-------
 .../aurora/scheduler/app/SchedulerIT.java       |  8 +-
 .../storage/AbstractTaskStoreTest.java          | 43 +++++-----
 .../scheduler/storage/StorageBackfillTest.java  | 72 -----------------
 .../storage/log/WriteAheadStorageTest.java      | 30 +++----
 11 files changed, 51 insertions(+), 306 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/aurora/blob/4b3d7bca/src/main/java/org/apache/aurora/scheduler/SchedulerLifecycle.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/aurora/scheduler/SchedulerLifecycle.java b/src/main/java/org/apache/aurora/scheduler/SchedulerLifecycle.java
index 0d3874e..5ba5e73 100644
--- a/src/main/java/org/apache/aurora/scheduler/SchedulerLifecycle.java
+++ b/src/main/java/org/apache/aurora/scheduler/SchedulerLifecycle.java
@@ -56,7 +56,6 @@ import org.apache.aurora.scheduler.events.PubsubEvent.DriverRegistered;
 import org.apache.aurora.scheduler.events.PubsubEvent.EventSubscriber;
 import org.apache.aurora.scheduler.mesos.Driver;
 import org.apache.aurora.scheduler.storage.Storage.NonVolatileStorage;
-import org.apache.aurora.scheduler.storage.StorageBackfill;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -242,7 +241,10 @@ public class SchedulerLifecycle implements EventSubscriber {
       @Override
       public void execute(Transition<State> transition) {
         LOG.info("Elected as leading scheduler!");
-        storage.start(StorageBackfill::backfill);
+
+        storage.start(stores -> {
+          // If storage backfill operations are necessary, they can be done here.
+        });
 
         driver.startAsync().awaitRunning();
 

http://git-wip-us.apache.org/repos/asf/aurora/blob/4b3d7bca/src/main/java/org/apache/aurora/scheduler/base/TaskTestUtil.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/aurora/scheduler/base/TaskTestUtil.java b/src/main/java/org/apache/aurora/scheduler/base/TaskTestUtil.java
index 376f485..02ba1e3 100644
--- a/src/main/java/org/apache/aurora/scheduler/base/TaskTestUtil.java
+++ b/src/main/java/org/apache/aurora/scheduler/base/TaskTestUtil.java
@@ -97,7 +97,7 @@ public final class TaskTestUtil {
 
   public static IScheduledTask makeTask(String id, ITaskConfig config) {
     return IScheduledTask.build(new ScheduledTask()
-        .setStatus(ScheduleStatus.PENDING)
+        .setStatus(ScheduleStatus.ASSIGNED)
         .setTaskEvents(ImmutableList.of(
             new TaskEvent(100L, ScheduleStatus.PENDING)
                 .setMessage("message")

http://git-wip-us.apache.org/repos/asf/aurora/blob/4b3d7bca/src/main/java/org/apache/aurora/scheduler/storage/StorageBackfill.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/aurora/scheduler/storage/StorageBackfill.java b/src/main/java/org/apache/aurora/scheduler/storage/StorageBackfill.java
deleted file mode 100644
index 609a624..0000000
--- a/src/main/java/org/apache/aurora/scheduler/storage/StorageBackfill.java
+++ /dev/null
@@ -1,84 +0,0 @@
-/**
- * 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;
-
-import java.util.concurrent.atomic.AtomicLong;
-
-import org.apache.aurora.common.stats.Stats;
-import org.apache.aurora.gen.JobConfiguration;
-import org.apache.aurora.gen.JobKey;
-import org.apache.aurora.gen.ScheduledTask;
-import org.apache.aurora.gen.TaskConfig;
-import org.apache.aurora.scheduler.base.JobKeys;
-import org.apache.aurora.scheduler.base.Query;
-import org.apache.aurora.scheduler.storage.Storage.MutableStoreProvider;
-import org.apache.aurora.scheduler.storage.entities.IJobConfiguration;
-import org.apache.aurora.scheduler.storage.entities.IJobKey;
-import org.apache.aurora.scheduler.storage.entities.IScheduledTask;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-/**
- * Utility class to contain and perform storage backfill operations.
- */
-public final class StorageBackfill {
-
-  private static final Logger LOG = LoggerFactory.getLogger(StorageBackfill.class);
-
-  private static final AtomicLong BACKFILLED_TASK_CONFIG_KEYS =
-      Stats.exportLong("task_config_keys_backfilled");
-
-  private static final AtomicLong BACKFILLED_JOB_CONFIG_KEYS =
-      Stats.exportLong("job_store_task_config_keys_backfilled");
-
-  private StorageBackfill() {
-    // Utility class.
-  }
-
-  private static void backfillJobDefaults(CronJobStore.Mutable jobStore) {
-    for (JobConfiguration job : IJobConfiguration.toBuildersList(jobStore.fetchJobs())) {
-      populateJobKey(job.getTaskConfig(), BACKFILLED_JOB_CONFIG_KEYS);
-      jobStore.saveAcceptedJob(IJobConfiguration.build(job));
-    }
-  }
-
-  private static void populateJobKey(TaskConfig config, AtomicLong counter) {
-    if (!config.isSetJob() || !JobKeys.isValid(IJobKey.build(config.getJob()))) {
-      config.setJob(new JobKey()
-          .setRole(config.getOwner().getRole())
-          .setEnvironment(config.getEnvironment())
-          .setName(config.getJobName()));
-
-      counter.incrementAndGet();
-    }
-  }
-
-  /**
-   * Backfills the storage to make it match any assumptions that may have changed since
-   * the structs were first written.
-   *
-   * @param storeProvider Storage provider.
-   */
-  public static void backfill(final MutableStoreProvider storeProvider) {
-    backfillJobDefaults(storeProvider.getCronJobStore());
-
-    // Backfilling job keys has to be done in a separate transaction to ensure follow up scoped
-    // Query calls work against upgraded MemTaskStore, which does not support deprecated fields.
-    LOG.info("Backfilling task config job keys.");
-    storeProvider.getUnsafeTaskStore().mutateTasks(Query.unscoped(), task -> {
-      ScheduledTask builder = task.newBuilder();
-      populateJobKey(builder.getAssignedTask().getTask(), BACKFILLED_TASK_CONFIG_KEYS);
-      return IScheduledTask.build(builder);
-    });
-  }
-}

http://git-wip-us.apache.org/repos/asf/aurora/blob/4b3d7bca/src/main/java/org/apache/aurora/scheduler/storage/TaskStore.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/aurora/scheduler/storage/TaskStore.java b/src/main/java/org/apache/aurora/scheduler/storage/TaskStore.java
index 4e4f8d2..3ab2d54 100644
--- a/src/main/java/org/apache/aurora/scheduler/storage/TaskStore.java
+++ b/src/main/java/org/apache/aurora/scheduler/storage/TaskStore.java
@@ -18,7 +18,6 @@ import java.util.Set;
 import com.google.common.base.Function;
 import com.google.common.base.Optional;
 import com.google.common.base.Predicate;
-import com.google.common.collect.ImmutableSet;
 
 import org.apache.aurora.gen.TaskQuery;
 import org.apache.aurora.scheduler.base.Query;
@@ -102,18 +101,6 @@ public interface TaskStore {
         Function<IScheduledTask, IScheduledTask> mutator);
 
     /**
-     * Offers temporary mutable access to tasks.  If a task ID is not found, it will be silently
-     * skipped, and no corresponding task will be returned.
-     *
-     * @param query Query to match tasks against.
-     * @param mutator The mutate operation.
-     * @return Immutable copies <em>of only the tasks that were mutated</em>.
-     */
-    ImmutableSet<IScheduledTask> mutateTasks(
-        Query.Builder query,
-        Function<IScheduledTask, IScheduledTask> mutator);
-
-    /**
      * Rewrites a task's configuration in-place.
      * <p>
      * <b>WARNING</b>: this is a dangerous operation, and should not be used without exercising

http://git-wip-us.apache.org/repos/asf/aurora/blob/4b3d7bca/src/main/java/org/apache/aurora/scheduler/storage/db/DbTaskStore.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/aurora/scheduler/storage/db/DbTaskStore.java b/src/main/java/org/apache/aurora/scheduler/storage/db/DbTaskStore.java
index 43fda1d..b899d0f 100644
--- a/src/main/java/org/apache/aurora/scheduler/storage/db/DbTaskStore.java
+++ b/src/main/java/org/apache/aurora/scheduler/storage/db/DbTaskStore.java
@@ -168,10 +168,16 @@ class DbTaskStore implements TaskStore.Mutable {
     }
   }
 
-  private Function<IScheduledTask, IScheduledTask> mutateAndSave(
+  @Timed("db_storage_mutate_task")
+  @Override
+  public Optional<IScheduledTask> mutateTask(
+      String taskId,
       Function<IScheduledTask, IScheduledTask> mutator) {
 
-    return original -> {
+    requireNonNull(taskId);
+    requireNonNull(mutator);
+
+    return fetchTask(taskId).transform(original -> {
       IScheduledTask maybeMutated = mutator.apply(original);
       requireNonNull(maybeMutated);
       if (!original.equals(maybeMutated)) {
@@ -181,37 +187,7 @@ class DbTaskStore implements TaskStore.Mutable {
         saveTasks(ImmutableSet.of(maybeMutated));
       }
       return maybeMutated;
-    };
-  }
-
-  @Timed("db_storage_mutate_task")
-  @Override
-  public Optional<IScheduledTask> mutateTask(
-      String taskId,
-      Function<IScheduledTask, IScheduledTask> mutator) {
-
-    requireNonNull(taskId);
-    requireNonNull(mutator);
-
-    return fetchTask(taskId).transform(mutateAndSave(mutator));
-  }
-
-  @Timed("db_storage_mutate_tasks")
-  @Override
-  public ImmutableSet<IScheduledTask> mutateTasks(
-      Builder query,
-      Function<IScheduledTask, IScheduledTask> mutator) {
-
-    requireNonNull(query);
-    requireNonNull(mutator);
-
-    Function<IScheduledTask, IScheduledTask> mutateFunction = mutateAndSave(mutator);
-    Iterable<Optional<IScheduledTask>> mutations = matches(query)
-        .transform(original -> {
-          IScheduledTask mutateResult = mutateFunction.apply(original);
-          return original.equals(mutateResult) ? Optional.absent() : Optional.of(mutateResult);
-        });
-    return ImmutableSet.copyOf(Optional.presentInstances(mutations));
+    });
   }
 
   @Timed("db_storage_unsafe_modify_in_place")

http://git-wip-us.apache.org/repos/asf/aurora/blob/4b3d7bca/src/main/java/org/apache/aurora/scheduler/storage/log/WriteAheadStorage.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/aurora/scheduler/storage/log/WriteAheadStorage.java b/src/main/java/org/apache/aurora/scheduler/storage/log/WriteAheadStorage.java
index 7283531..2f07afb 100644
--- a/src/main/java/org/apache/aurora/scheduler/storage/log/WriteAheadStorage.java
+++ b/src/main/java/org/apache/aurora/scheduler/storage/log/WriteAheadStorage.java
@@ -13,14 +13,12 @@
  */
 package org.apache.aurora.scheduler.storage.log;
 
-import java.util.Map;
 import java.util.Set;
 
 import com.google.common.base.Function;
 import com.google.common.base.Optional;
 import com.google.common.base.Preconditions;
 import com.google.common.collect.ImmutableSet;
-import com.google.common.collect.Maps;
 
 import org.apache.aurora.gen.storage.Op;
 import org.apache.aurora.gen.storage.PruneJobUpdateHistory;
@@ -38,8 +36,6 @@ import org.apache.aurora.gen.storage.SaveJobUpdateEvent;
 import org.apache.aurora.gen.storage.SaveLock;
 import org.apache.aurora.gen.storage.SaveQuota;
 import org.apache.aurora.gen.storage.SaveTasks;
-import org.apache.aurora.scheduler.base.Query;
-import org.apache.aurora.scheduler.base.Tasks;
 import org.apache.aurora.scheduler.events.EventSink;
 import org.apache.aurora.scheduler.events.PubsubEvent;
 import org.apache.aurora.scheduler.storage.AttributeStore;
@@ -205,23 +201,6 @@ class WriteAheadStorage extends WriteAheadStorageForwarder implements
   }
 
   @Override
-  public ImmutableSet<IScheduledTask> mutateTasks(
-      Query.Builder query,
-      Function<IScheduledTask, IScheduledTask> mutator) {
-
-    ImmutableSet<IScheduledTask> mutated = taskStore.mutateTasks(query, mutator);
-
-    Map<String, IScheduledTask> tasksById = Tasks.mapById(mutated);
-    log.debug(
-        "Storing updated tasks to log: {}",
-        Maps.transformValues(tasksById, IScheduledTask::getStatus));
-
-    // TODO(William Farner): Avoid writing an op when mutated is empty.
-    write(Op.saveTasks(new SaveTasks(IScheduledTask.toBuildersSet(mutated))));
-    return mutated;
-  }
-
-  @Override
   public void saveQuota(final String role, final IResourceAggregate quota) {
     requireNonNull(role);
     requireNonNull(quota);

http://git-wip-us.apache.org/repos/asf/aurora/blob/4b3d7bca/src/main/java/org/apache/aurora/scheduler/storage/mem/MemTaskStore.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/aurora/scheduler/storage/mem/MemTaskStore.java b/src/main/java/org/apache/aurora/scheduler/storage/mem/MemTaskStore.java
index 8fd024a..231a556 100644
--- a/src/main/java/org/apache/aurora/scheduler/storage/mem/MemTaskStore.java
+++ b/src/main/java/org/apache/aurora/scheduler/storage/mem/MemTaskStore.java
@@ -203,10 +203,13 @@ class MemTaskStore implements TaskStore.Mutable {
     }
   }
 
-  private Function<IScheduledTask, IScheduledTask> mutateAndSave(
+  @Timed("mem_storage_mutate_task")
+  @Override
+  public Optional<IScheduledTask> mutateTask(
+      String taskId,
       Function<IScheduledTask, IScheduledTask> mutator) {
 
-    return original -> {
+    return fetchTask(taskId).transform(original -> {
       IScheduledTask maybeMutated = mutator.apply(original);
       requireNonNull(maybeMutated);
       if (!original.equals(maybeMutated)) {
@@ -219,34 +222,7 @@ class MemTaskStore implements TaskStore.Mutable {
         }
       }
       return maybeMutated;
-    };
-  }
-
-  @Timed("mem_storage_mutate_task")
-  @Override
-  public Optional<IScheduledTask> mutateTask(
-      String taskId,
-      Function<IScheduledTask, IScheduledTask> mutator) {
-
-    return fetchTask(taskId).transform(mutateAndSave(mutator));
-  }
-
-  @Timed("mem_storage_mutate_tasks")
-  @Override
-  public ImmutableSet<IScheduledTask> mutateTasks(
-      Query.Builder query,
-      Function<IScheduledTask, IScheduledTask> mutator) {
-
-    requireNonNull(query);
-    requireNonNull(mutator);
-
-    Function<IScheduledTask, IScheduledTask> mutateFunction = mutateAndSave(mutator);
-    Iterable<Optional<IScheduledTask>> mutations = matches(query)
-        .transform(original -> {
-          IScheduledTask mutateResult = mutateFunction.apply(original);
-          return original.equals(mutateResult) ? Optional.absent() : Optional.of(mutateResult);
-        });
-    return ImmutableSet.copyOf(Optional.presentInstances(mutations));
+    });
   }
 
   @Timed("mem_storage_unsafe_modify_in_place")

http://git-wip-us.apache.org/repos/asf/aurora/blob/4b3d7bca/src/test/java/org/apache/aurora/scheduler/app/SchedulerIT.java
----------------------------------------------------------------------
diff --git a/src/test/java/org/apache/aurora/scheduler/app/SchedulerIT.java b/src/test/java/org/apache/aurora/scheduler/app/SchedulerIT.java
index 9fb8aad..83f4b7a 100644
--- a/src/test/java/org/apache/aurora/scheduler/app/SchedulerIT.java
+++ b/src/test/java/org/apache/aurora/scheduler/app/SchedulerIT.java
@@ -307,21 +307,17 @@ public class SchedulerIT extends BaseZooKeeperTest {
 
     expect(log.open()).andReturn(logStream);
     expect(logStream.readAll()).andReturn(recoveredEntries.iterator()).anyTimes();
-    // An empty saveTasks is an artifact of the fact that mutateTasks always writes a log operation
-    // even if nothing is changed.
-    streamMatcher.expectTransaction(Op.saveTasks(new SaveTasks(ImmutableSet.of())))
-        .andReturn(nextPosition());
     streamMatcher.expectTransaction(Op.saveFrameworkId(new SaveFrameworkId(FRAMEWORK_ID)))
         .andReturn(nextPosition());
 
-    final CountDownLatch driverStarted = new CountDownLatch(1);
+    CountDownLatch driverStarted = new CountDownLatch(1);
     expect(driver.start()).andAnswer(() -> {
       driverStarted.countDown();
       return Status.DRIVER_RUNNING;
     });
 
     // Try to be a good test suite citizen by releasing the blocked thread when the test case exits.
-    final CountDownLatch testCompleted = new CountDownLatch(1);
+    CountDownLatch testCompleted = new CountDownLatch(1);
     expect(driver.join()).andAnswer(() -> {
       testCompleted.await();
       return Status.DRIVER_STOPPED;

http://git-wip-us.apache.org/repos/asf/aurora/blob/4b3d7bca/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 1ac41d1..dee34e2 100644
--- a/src/test/java/org/apache/aurora/scheduler/storage/AbstractTaskStoreTest.java
+++ b/src/test/java/org/apache/aurora/scheduler/storage/AbstractTaskStoreTest.java
@@ -39,7 +39,6 @@ import org.apache.aurora.gen.HostAttributes;
 import org.apache.aurora.gen.MaintenanceMode;
 import org.apache.aurora.gen.MesosContainer;
 import org.apache.aurora.gen.Metadata;
-import org.apache.aurora.gen.ScheduleStatus;
 import org.apache.aurora.gen.ScheduledTask;
 import org.apache.aurora.gen.TaskQuery;
 import org.apache.aurora.scheduler.base.JobKeys;
@@ -57,6 +56,7 @@ import org.junit.Before;
 import org.junit.Ignore;
 import org.junit.Test;
 
+import static org.apache.aurora.gen.ScheduleStatus.ASSIGNED;
 import static org.apache.aurora.gen.ScheduleStatus.RUNNING;
 import static org.apache.aurora.scheduler.base.TaskTestUtil.makeTask;
 import static org.junit.Assert.assertEquals;
@@ -123,11 +123,6 @@ public abstract class AbstractTaskStoreTest extends TearDownTestCase {
         storeProvider -> storeProvider.getUnsafeTaskStore().mutateTask(taskId, mutation));
   }
 
-  private ImmutableSet<IScheduledTask> mutateTasks(Query.Builder query, TaskMutation mutation) {
-    return storage.write(
-        storeProvider -> storeProvider.getUnsafeTaskStore().mutateTasks(query, mutation));
-  }
-
   private boolean unsafeModifyInPlace(String taskId, ITaskConfig taskConfiguration) {
     return storage.write(storeProvider ->
         storeProvider.getUnsafeTaskStore().unsafeModifyInPlace(taskId, taskConfiguration));
@@ -183,7 +178,7 @@ public abstract class AbstractTaskStoreTest extends TearDownTestCase {
     assertQueryResults(Query.envScoped("role-c", "env-c"), TASK_C);
     assertQueryResults(Query.envScoped("role-c", "devel"));
     assertQueryResults(
-        Query.unscoped().byStatus(ScheduleStatus.PENDING),
+        Query.unscoped().byStatus(ASSIGNED),
         TASK_A, TASK_B, TASK_C, TASK_D);
     assertQueryResults(
         Query.instanceScoped(JobKeys.from("role-a", "env-a", "job-a"), 2).active(), TASK_A);
@@ -273,15 +268,17 @@ public abstract class AbstractTaskStoreTest extends TearDownTestCase {
         Query.statusScoped(RUNNING),
         IScheduledTask.build(TASK_A.newBuilder().setStatus(RUNNING)));
 
-    mutateTasks(
-        Query.unscoped(),
-        task -> IScheduledTask.build(task.newBuilder().setStatus(ScheduleStatus.ASSIGNED)));
+    assertEquals(
+        Optional.absent(),
+        mutateTask(
+            "nonexistent",
+            task -> IScheduledTask.build(task.newBuilder().setStatus(RUNNING))));
 
     assertStoreContents(
-        IScheduledTask.build(TASK_A.newBuilder().setStatus(ScheduleStatus.ASSIGNED)),
-        IScheduledTask.build(TASK_B.newBuilder().setStatus(ScheduleStatus.ASSIGNED)),
-        IScheduledTask.build(TASK_C.newBuilder().setStatus(ScheduleStatus.ASSIGNED)),
-        IScheduledTask.build(TASK_D.newBuilder().setStatus(ScheduleStatus.ASSIGNED)));
+        IScheduledTask.build(TASK_A.newBuilder().setStatus(RUNNING)),
+        IScheduledTask.build(TASK_B.newBuilder().setStatus(ASSIGNED)),
+        IScheduledTask.build(TASK_C.newBuilder().setStatus(ASSIGNED)),
+        IScheduledTask.build(TASK_D.newBuilder().setStatus(ASSIGNED)));
   }
 
   @Test
@@ -323,14 +320,14 @@ public abstract class AbstractTaskStoreTest extends TearDownTestCase {
 
   @Test
   public void testConsistentJobIndex() {
-    final IScheduledTask a = makeTask("a", JobKeys.from("jim", "test", "job"));
-    final IScheduledTask b = makeTask("b", JobKeys.from("jim", "test", "job"));
-    final IScheduledTask c = makeTask("c", JobKeys.from("jim", "test", "job2"));
-    final IScheduledTask d = makeTask("d", JobKeys.from("joe", "test", "job"));
-    final IScheduledTask e = makeTask("e", JobKeys.from("jim", "prod", "job"));
-    final Query.Builder jimsJob = Query.jobScoped(JobKeys.from("jim", "test", "job"));
-    final Query.Builder jimsJob2 = Query.jobScoped(JobKeys.from("jim", "test", "job2"));
-    final Query.Builder joesJob = Query.jobScoped(JobKeys.from("joe", "test", "job"));
+    IScheduledTask a = makeTask("a", JobKeys.from("jim", "test", "job"));
+    IScheduledTask b = makeTask("b", JobKeys.from("jim", "test", "job"));
+    IScheduledTask c = makeTask("c", JobKeys.from("jim", "test", "job2"));
+    IScheduledTask d = makeTask("d", JobKeys.from("joe", "test", "job"));
+    IScheduledTask e = makeTask("e", JobKeys.from("jim", "prod", "job"));
+    Query.Builder jimsJob = Query.jobScoped(JobKeys.from("jim", "test", "job"));
+    Query.Builder jimsJob2 = Query.jobScoped(JobKeys.from("jim", "test", "job2"));
+    Query.Builder joesJob = Query.jobScoped(JobKeys.from("joe", "test", "job"));
 
     saveTasks(a, b, c, d, e);
     assertQueryResults(jimsJob, a, b);
@@ -342,7 +339,7 @@ public abstract class AbstractTaskStoreTest extends TearDownTestCase {
     assertQueryResults(jimsJob2, c);
     assertQueryResults(joesJob, d);
 
-    mutateTasks(jimsJob, task -> IScheduledTask.build(task.newBuilder().setStatus(RUNNING)));
+    mutateTask(Tasks.id(a), task -> IScheduledTask.build(task.newBuilder().setStatus(RUNNING)));
     IScheduledTask aRunning = IScheduledTask.build(a.newBuilder().setStatus(RUNNING));
     assertQueryResults(jimsJob, aRunning);
     assertQueryResults(jimsJob2, c);

http://git-wip-us.apache.org/repos/asf/aurora/blob/4b3d7bca/src/test/java/org/apache/aurora/scheduler/storage/StorageBackfillTest.java
----------------------------------------------------------------------
diff --git a/src/test/java/org/apache/aurora/scheduler/storage/StorageBackfillTest.java b/src/test/java/org/apache/aurora/scheduler/storage/StorageBackfillTest.java
deleted file mode 100644
index 2570464..0000000
--- a/src/test/java/org/apache/aurora/scheduler/storage/StorageBackfillTest.java
+++ /dev/null
@@ -1,72 +0,0 @@
-/**
- * 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;
-
-import java.util.Set;
-
-import com.google.common.collect.ImmutableSet;
-
-import org.apache.aurora.gen.Container;
-import org.apache.aurora.gen.MesosContainer;
-import org.apache.aurora.gen.ScheduledTask;
-import org.apache.aurora.scheduler.base.Query;
-import org.apache.aurora.scheduler.base.TaskTestUtil;
-import org.apache.aurora.scheduler.storage.Storage.MutateWork.NoResult;
-import org.apache.aurora.scheduler.storage.Storage.MutateWork.NoResult.Quiet;
-import org.apache.aurora.scheduler.storage.db.DbUtil;
-import org.apache.aurora.scheduler.storage.entities.IScheduledTask;
-import org.junit.Before;
-import org.junit.Test;
-
-import static org.junit.Assert.assertEquals;
-
-/**
- * TODO(wfarner): Data store constraints (not null, valid relations) have made this test of little
- * value other than for coverage.  Rethink.
- */
-public class StorageBackfillTest {
-  // By default, only the mesos container is allowed by ConfigurationManager.
-  private static final IScheduledTask TASK =
-      setMesosContainer(TaskTestUtil.makeTask("task_id", TaskTestUtil.JOB));
-
-  private Storage storage;
-
-  @Before
-  public void setUp() {
-    storage = DbUtil.createStorage();
-  }
-
-  @Test
-  public void testBackfillTask() {
-    final Set<IScheduledTask> backfilledTasks = ImmutableSet.of(TASK);
-    storage.write((NoResult.Quiet)
-        storeProvider -> storeProvider.getUnsafeTaskStore().saveTasks(backfilledTasks));
-
-    backfill();
-
-    assertEquals(
-        ImmutableSet.of(TASK),
-        Storage.Util.fetchTasks(storage, Query.unscoped()));
-  }
-
-  private void backfill() {
-    storage.write((Quiet) StorageBackfill::backfill);
-  }
-
-  private static IScheduledTask setMesosContainer(IScheduledTask task) {
-    ScheduledTask builder = task.newBuilder();
-    builder.getAssignedTask().getTask().setContainer(Container.mesos(new MesosContainer()));
-    return IScheduledTask.build(builder);
-  }
-}

http://git-wip-us.apache.org/repos/asf/aurora/blob/4b3d7bca/src/test/java/org/apache/aurora/scheduler/storage/log/WriteAheadStorageTest.java
----------------------------------------------------------------------
diff --git a/src/test/java/org/apache/aurora/scheduler/storage/log/WriteAheadStorageTest.java b/src/test/java/org/apache/aurora/scheduler/storage/log/WriteAheadStorageTest.java
index 3c4e2bd..13726cc 100644
--- a/src/test/java/org/apache/aurora/scheduler/storage/log/WriteAheadStorageTest.java
+++ b/src/test/java/org/apache/aurora/scheduler/storage/log/WriteAheadStorageTest.java
@@ -16,21 +16,20 @@ package org.apache.aurora.scheduler.storage.log;
 import java.util.Set;
 
 import com.google.common.base.Function;
+import com.google.common.base.Optional;
 import com.google.common.collect.ImmutableSet;
 
 import org.apache.aurora.common.testing.easymock.EasyMockTest;
-import org.apache.aurora.gen.AssignedTask;
 import org.apache.aurora.gen.Attribute;
 import org.apache.aurora.gen.HostAttributes;
 import org.apache.aurora.gen.JobUpdateKey;
 import org.apache.aurora.gen.MaintenanceMode;
-import org.apache.aurora.gen.ScheduledTask;
 import org.apache.aurora.gen.storage.Op;
 import org.apache.aurora.gen.storage.PruneJobUpdateHistory;
 import org.apache.aurora.gen.storage.SaveHostAttributes;
 import org.apache.aurora.gen.storage.SaveTasks;
 import org.apache.aurora.scheduler.base.JobKeys;
-import org.apache.aurora.scheduler.base.Query;
+import org.apache.aurora.scheduler.base.TaskTestUtil;
 import org.apache.aurora.scheduler.events.EventSink;
 import org.apache.aurora.scheduler.events.PubsubEvent;
 import org.apache.aurora.scheduler.storage.AttributeStore;
@@ -43,10 +42,9 @@ import org.apache.aurora.scheduler.storage.TaskStore;
 import org.apache.aurora.scheduler.storage.entities.IHostAttributes;
 import org.apache.aurora.scheduler.storage.entities.IJobUpdateKey;
 import org.apache.aurora.scheduler.storage.entities.IScheduledTask;
-import org.easymock.EasyMock;
 import org.junit.Before;
 import org.junit.Test;
-import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 import static org.easymock.EasyMock.expect;
 import static org.junit.Assert.assertEquals;
@@ -59,7 +57,6 @@ public class WriteAheadStorageTest extends EasyMockTest {
   private TaskStore.Mutable taskStore;
   private AttributeStore.Mutable attributeStore;
   private JobUpdateStore.Mutable jobUpdateStore;
-  private Logger log;
   private EventSink eventSink;
   private WriteAheadStorage storage;
 
@@ -69,7 +66,6 @@ public class WriteAheadStorageTest extends EasyMockTest {
     taskStore = createMock(TaskStore.Mutable.class);
     attributeStore = createMock(AttributeStore.Mutable.class);
     jobUpdateStore = createMock(JobUpdateStore.Mutable.class);
-    log = createMock(Logger.class);
     eventSink = createMock(EventSink.class);
 
     storage = new WriteAheadStorage(
@@ -81,7 +77,7 @@ public class WriteAheadStorageTest extends EasyMockTest {
         createMock(QuotaStore.Mutable.class),
         attributeStore,
         jobUpdateStore,
-        log,
+        LoggerFactory.getLogger(WriteAheadStorageTest.class),
         eventSink);
   }
 
@@ -115,25 +111,17 @@ public class WriteAheadStorageTest extends EasyMockTest {
 
   @Test
   public void testMutate() {
-    Query.Builder query = Query.taskScoped("a");
+    String taskId = "a";
     Function<IScheduledTask, IScheduledTask> mutator =
         createMock(new Clazz<Function<IScheduledTask, IScheduledTask>>() { });
-    ImmutableSet<IScheduledTask> mutated = ImmutableSet.of(IScheduledTask.build(
-            new ScheduledTask().setAssignedTask(new AssignedTask().setTaskId("a"))));
+    Optional<IScheduledTask> mutated = Optional.of(TaskTestUtil.makeTask(taskId, TaskTestUtil.JOB));
 
-    expect(taskStore.mutateTasks(query, mutator)).andReturn(mutated);
-    log.debug(EasyMock.anyString(), EasyMock.<Object>anyObject());
-    expectOp(Op.saveTasks(new SaveTasks(IScheduledTask.toBuildersSet(mutated))));
-
-    // With increased logging.
-    expect(taskStore.mutateTasks(query, mutator)).andReturn(mutated);
-    expectOp(Op.saveTasks(new SaveTasks(IScheduledTask.toBuildersSet(mutated))));
-    log.debug(EasyMock.anyString(), EasyMock.<Object>anyObject());
+    expect(taskStore.mutateTask(taskId, mutator)).andReturn(mutated);
+    expectOp(Op.saveTasks(new SaveTasks(ImmutableSet.of(mutated.get().newBuilder()))));
 
     control.replay();
 
-    assertEquals(mutated, storage.mutateTasks(query, mutator));
-    assertEquals(mutated, storage.mutateTasks(query, mutator));
+    assertEquals(mutated, storage.mutateTask(taskId, mutator));
   }
 
   @Test