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 2015/09/03 00:27:33 UTC

aurora git commit: Revert "Refer to shared task_configs table for job updates."

Repository: aurora
Updated Branches:
  refs/heads/master 85f93a70d -> a45952785


Revert "Refer to shared task_configs table for job updates."

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


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

Branch: refs/heads/master
Commit: a45952785ffad9c7146d79dcaced517bc70439d9
Parents: 85f93a7
Author: Bill Farner <wf...@apache.org>
Authored: Wed Sep 2 15:26:56 2015 -0700
Committer: Bill Farner <wf...@apache.org>
Committed: Wed Sep 2 15:27:20 2015 -0700

----------------------------------------------------------------------
 .../org/apache/aurora/benchmark/JobUpdates.java |   8 +-
 .../scheduler/storage/db/DbJobUpdateStore.java  |  62 ++++---
 .../storage/db/JobUpdateDetailsMapper.java      |  22 +--
 .../db/typehandlers/TaskConfigTypeHandler.java  |  73 ++++++++
 .../storage/db/typehandlers/TypeHandlers.java   |   1 +
 .../storage/db/views/DbInstanceTaskConfig.java  |  33 ----
 .../scheduler/storage/db/views/DbJobUpdate.java |  36 ----
 .../storage/db/views/DbJobUpdateDetails.java    |  33 ----
 .../db/views/DbJobUpdateInstructions.java       |  45 -----
 .../db/views/DbStoredJobUpdateDetails.java      |  30 ---
 .../storage/db/JobUpdateDetailsMapper.xml       |  35 ++--
 .../aurora/scheduler/storage/db/schema.sql      | 182 +++++++++----------
 .../storage/db/DbJobUpdateStoreTest.java        |   4 +-
 13 files changed, 232 insertions(+), 332 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/aurora/blob/a4595278/src/jmh/java/org/apache/aurora/benchmark/JobUpdates.java
----------------------------------------------------------------------
diff --git a/src/jmh/java/org/apache/aurora/benchmark/JobUpdates.java b/src/jmh/java/org/apache/aurora/benchmark/JobUpdates.java
index 493f75d..48bee50 100644
--- a/src/jmh/java/org/apache/aurora/benchmark/JobUpdates.java
+++ b/src/jmh/java/org/apache/aurora/benchmark/JobUpdates.java
@@ -20,6 +20,7 @@ import java.util.UUID;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableSet;
 
+import org.apache.aurora.gen.ExecutorConfig;
 import org.apache.aurora.gen.InstanceTaskConfig;
 import org.apache.aurora.gen.JobInstanceUpdateEvent;
 import org.apache.aurora.gen.JobKey;
@@ -34,8 +35,6 @@ import org.apache.aurora.gen.JobUpdateStatus;
 import org.apache.aurora.gen.JobUpdateSummary;
 import org.apache.aurora.gen.Range;
 import org.apache.aurora.gen.TaskConfig;
-import org.apache.aurora.scheduler.base.TaskTestUtil;
-import org.apache.aurora.scheduler.storage.entities.IJobKey;
 import org.apache.aurora.scheduler.storage.entities.IJobUpdateDetails;
 
 /**
@@ -64,8 +63,9 @@ final class JobUpdates {
         JobKey job = new JobKey("role", "env", UUID.randomUUID().toString());
         JobUpdateKey key = new JobUpdateKey().setJob(job).setId(UUID.randomUUID().toString());
 
-        TaskConfig task = TaskTestUtil.makeConfig(IJobKey.build(job)).newBuilder();
-        task.getExecutorConfig().setData(string(10000));
+        TaskConfig task = new TaskConfig()
+            .setJob(job)
+            .setExecutorConfig(new ExecutorConfig("cfg", string(10000)));
 
         JobUpdate update = new JobUpdate()
             .setSummary(new JobUpdateSummary()

http://git-wip-us.apache.org/repos/asf/aurora/blob/a4595278/src/main/java/org/apache/aurora/scheduler/storage/db/DbJobUpdateStore.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/aurora/scheduler/storage/db/DbJobUpdateStore.java b/src/main/java/org/apache/aurora/scheduler/storage/db/DbJobUpdateStore.java
index 7652132..fd46c3f 100644
--- a/src/main/java/org/apache/aurora/scheduler/storage/db/DbJobUpdateStore.java
+++ b/src/main/java/org/apache/aurora/scheduler/storage/db/DbJobUpdateStore.java
@@ -25,13 +25,12 @@ import com.google.common.collect.FluentIterable;
 import com.google.common.collect.ImmutableSet;
 
 import org.apache.aurora.common.base.MorePreconditions;
+import org.apache.aurora.gen.JobUpdate;
+import org.apache.aurora.gen.JobUpdateInstructions;
 import org.apache.aurora.gen.JobUpdateStatus;
 import org.apache.aurora.gen.storage.StoredJobUpdateDetails;
 import org.apache.aurora.scheduler.stats.CachedCounters;
 import org.apache.aurora.scheduler.storage.JobUpdateStore;
-import org.apache.aurora.scheduler.storage.db.views.DbJobUpdate;
-import org.apache.aurora.scheduler.storage.db.views.DbJobUpdateInstructions;
-import org.apache.aurora.scheduler.storage.db.views.DbStoredJobUpdateDetails;
 import org.apache.aurora.scheduler.storage.entities.IInstanceTaskConfig;
 import org.apache.aurora.scheduler.storage.entities.IJobInstanceUpdateEvent;
 import org.apache.aurora.scheduler.storage.entities.IJobUpdate;
@@ -56,7 +55,6 @@ public class DbJobUpdateStore implements JobUpdateStore.Mutable {
   private final JobUpdateDetailsMapper detailsMapper;
   private final JobUpdateEventMapper jobEventMapper;
   private final JobInstanceUpdateEventMapper instanceEventMapper;
-  private final TaskConfigManager taskConfigManager;
   private final CachedCounters stats;
 
   @Inject
@@ -65,14 +63,12 @@ public class DbJobUpdateStore implements JobUpdateStore.Mutable {
       JobUpdateDetailsMapper detailsMapper,
       JobUpdateEventMapper jobEventMapper,
       JobInstanceUpdateEventMapper instanceEventMapper,
-      TaskConfigManager taskConfigManager,
       CachedCounters stats) {
 
     this.jobKeyMapper = requireNonNull(jobKeyMapper);
     this.detailsMapper = requireNonNull(detailsMapper);
     this.jobEventMapper = requireNonNull(jobEventMapper);
     this.instanceEventMapper = requireNonNull(instanceEventMapper);
-    this.taskConfigManager = requireNonNull(taskConfigManager);
     this.stats = requireNonNull(stats);
   }
 
@@ -107,7 +103,7 @@ public class DbJobUpdateStore implements JobUpdateStore.Mutable {
       IInstanceTaskConfig desired = update.getInstructions().getDesiredState();
       detailsMapper.insertTaskConfig(
           key,
-          taskConfigManager.insert(desired.getTask()),
+          desired.getTask().newBuilder(),
           true,
           new InsertResult());
 
@@ -120,11 +116,7 @@ public class DbJobUpdateStore implements JobUpdateStore.Mutable {
     if (!update.getInstructions().getInitialState().isEmpty()) {
       for (IInstanceTaskConfig config : update.getInstructions().getInitialState()) {
         InsertResult result = new InsertResult();
-        detailsMapper.insertTaskConfig(
-            key,
-            taskConfigManager.insert(config.getTask()),
-            false,
-            result);
+        detailsMapper.insertTaskConfig(key, config.getTask().newBuilder(), false, result);
 
         detailsMapper.insertTaskConfigInstances(
             result.getId(),
@@ -157,6 +149,13 @@ public class DbJobUpdateStore implements JobUpdateStore.Mutable {
     detailsMapper.truncate();
   }
 
+  private static final Function<PruneVictim, Long> GET_ROW_ID = new Function<PruneVictim, Long>() {
+    @Override
+    public Long apply(PruneVictim victim) {
+      return victim.getRowId();
+    }
+  };
+
   private static final Function<PruneVictim, IJobUpdateKey> GET_UPDATE_KEY =
       new Function<PruneVictim, IJobUpdateKey>() {
         @Override
@@ -181,7 +180,7 @@ public class DbJobUpdateStore implements JobUpdateStore.Mutable {
           historyPruneThresholdMs);
 
       detailsMapper.deleteCompletedUpdates(
-          FluentIterable.from(pruneVictims).transform(PruneVictim::getRowId).toSet());
+          FluentIterable.from(pruneVictims).transform(GET_ROW_ID).toSet());
       pruned.addAll(FluentIterable.from(pruneVictims).transform(GET_UPDATE_KEY));
     }
 
@@ -199,41 +198,54 @@ public class DbJobUpdateStore implements JobUpdateStore.Mutable {
   public List<IJobUpdateDetails> fetchJobUpdateDetails(IJobUpdateQuery query) {
     return FluentIterable
         .from(detailsMapper.selectDetailsList(query.newBuilder()))
-        .transform(DbStoredJobUpdateDetails::toThrift)
-        .transform(StoredJobUpdateDetails::getDetails)
-        .transform(IJobUpdateDetails::build)
-        .toList();
+        .transform(new Function<StoredJobUpdateDetails, IJobUpdateDetails>() {
+          @Override
+          public IJobUpdateDetails apply(StoredJobUpdateDetails input) {
+            return IJobUpdateDetails.build(input.getDetails());
+          }
+        }).toList();
   }
 
   @Timed("job_update_store_fetch_details")
   @Override
   public Optional<IJobUpdateDetails> fetchJobUpdateDetails(final IJobUpdateKey key) {
     return Optional.fromNullable(detailsMapper.selectDetails(key))
-        .transform(DbStoredJobUpdateDetails::toThrift)
-        .transform(StoredJobUpdateDetails::getDetails)
-        .transform(IJobUpdateDetails::build);
+        .transform(new Function<StoredJobUpdateDetails, IJobUpdateDetails>() {
+          @Override
+          public IJobUpdateDetails apply(StoredJobUpdateDetails input) {
+            return IJobUpdateDetails.build(input.getDetails());
+          }
+        });
   }
 
   @Timed("job_update_store_fetch_update")
   @Override
   public Optional<IJobUpdate> fetchJobUpdate(IJobUpdateKey key) {
     return Optional.fromNullable(detailsMapper.selectUpdate(key))
-        .transform(DbJobUpdate::toImmutable);
+        .transform(new Function<JobUpdate, IJobUpdate>() {
+          @Override
+          public IJobUpdate apply(JobUpdate input) {
+            return IJobUpdate.build(input);
+          }
+        });
   }
 
   @Timed("job_update_store_fetch_instructions")
   @Override
   public Optional<IJobUpdateInstructions> fetchJobUpdateInstructions(IJobUpdateKey key) {
     return Optional.fromNullable(detailsMapper.selectInstructions(key))
-        .transform(DbJobUpdateInstructions::toImmutable);
+        .transform(new Function<JobUpdateInstructions, IJobUpdateInstructions>() {
+          @Override
+          public IJobUpdateInstructions apply(JobUpdateInstructions input) {
+            return IJobUpdateInstructions.build(input);
+          }
+        });
   }
 
   @Timed("job_update_store_fetch_all_details")
   @Override
   public Set<StoredJobUpdateDetails> fetchAllJobUpdateDetails() {
-    return FluentIterable.from(detailsMapper.selectAllDetails())
-        .transform(DbStoredJobUpdateDetails::toThrift)
-        .toSet();
+    return ImmutableSet.copyOf(detailsMapper.selectAllDetails());
   }
 
   @Timed("job_update_store_get_lock_token")

http://git-wip-us.apache.org/repos/asf/aurora/blob/a4595278/src/main/java/org/apache/aurora/scheduler/storage/db/JobUpdateDetailsMapper.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/aurora/scheduler/storage/db/JobUpdateDetailsMapper.java b/src/main/java/org/apache/aurora/scheduler/storage/db/JobUpdateDetailsMapper.java
index a3b0494..02ea355 100644
--- a/src/main/java/org/apache/aurora/scheduler/storage/db/JobUpdateDetailsMapper.java
+++ b/src/main/java/org/apache/aurora/scheduler/storage/db/JobUpdateDetailsMapper.java
@@ -20,12 +20,12 @@ import javax.annotation.Nullable;
 
 import org.apache.aurora.gen.JobInstanceUpdateEvent;
 import org.apache.aurora.gen.JobUpdate;
+import org.apache.aurora.gen.JobUpdateInstructions;
 import org.apache.aurora.gen.JobUpdateQuery;
 import org.apache.aurora.gen.JobUpdateSummary;
 import org.apache.aurora.gen.Range;
-import org.apache.aurora.scheduler.storage.db.views.DbJobUpdate;
-import org.apache.aurora.scheduler.storage.db.views.DbJobUpdateInstructions;
-import org.apache.aurora.scheduler.storage.db.views.DbStoredJobUpdateDetails;
+import org.apache.aurora.gen.TaskConfig;
+import org.apache.aurora.gen.storage.StoredJobUpdateDetails;
 import org.apache.aurora.scheduler.storage.entities.IJobUpdateKey;
 import org.apache.ibatis.annotations.Param;
 
@@ -56,21 +56,21 @@ interface JobUpdateDetailsMapper {
    * Inserts a task configuration entry for an update.
    *
    * @param key Update to insert task configs for.
-   * @param taskConfigRow task configuration row.
+   * @param taskConfig task configuration to insert.
    * @param isNew Flag to identify if the task config is existing {@code false} or
    *              desired {@code true}.
    * @param result Container for auto-generated ID of the inserted job update row.
    */
   void insertTaskConfig(
       @Param("key") IJobUpdateKey key,
-      @Param("taskConfigRow") long taskConfigRow,
+      @Param("config") TaskConfig taskConfig,
       @Param("isNew") boolean isNew,
       @Param("result") InsertResult result);
 
   /**
    * Maps inserted task config with a set of associated instance ranges.
    *
-   * @param configId ID of the task config stored.
+   * @param configId ID of the {@link TaskConfig} stored.
    * @param ranges Set of instance ID ranges.
    */
   void insertTaskConfigInstances(
@@ -150,7 +150,7 @@ interface JobUpdateDetailsMapper {
    * @return Job update details for the provided update ID, if it exists.
    */
   @Nullable
-  DbStoredJobUpdateDetails selectDetails(@Param("key") IJobUpdateKey key);
+  StoredJobUpdateDetails selectDetails(@Param("key") IJobUpdateKey key);
 
   /**
    * Gets all job update details matching the provided {@code query}.
@@ -159,7 +159,7 @@ interface JobUpdateDetailsMapper {
    * @param query Query to filter results by.
    * @return Job update details matching the query.
    */
-  List<DbStoredJobUpdateDetails> selectDetailsList(JobUpdateQuery query);
+  List<StoredJobUpdateDetails> selectDetailsList(JobUpdateQuery query);
 
   /**
    * Gets job update for the provided {@code update}.
@@ -168,7 +168,7 @@ interface JobUpdateDetailsMapper {
    * @return Job update for the provided update ID, if it exists.
    */
   @Nullable
-  DbJobUpdate selectUpdate(@Param("key") IJobUpdateKey key);
+  JobUpdate selectUpdate(@Param("key") IJobUpdateKey key);
 
   /**
    * Gets job update instructions for the provided {@code update}.
@@ -177,14 +177,14 @@ interface JobUpdateDetailsMapper {
    * @return Job update instructions for the provided update ID, if it exists.
    */
   @Nullable
-  DbJobUpdateInstructions selectInstructions(@Param("key") IJobUpdateKey key);
+  JobUpdateInstructions selectInstructions(@Param("key") IJobUpdateKey key);
 
   /**
    * Gets all stored job update details.
    *
    * @return All stored job update details.
    */
-  Set<DbStoredJobUpdateDetails> selectAllDetails();
+  Set<StoredJobUpdateDetails> selectAllDetails();
 
   /**
    * Gets the token associated with an update.

http://git-wip-us.apache.org/repos/asf/aurora/blob/a4595278/src/main/java/org/apache/aurora/scheduler/storage/db/typehandlers/TaskConfigTypeHandler.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/aurora/scheduler/storage/db/typehandlers/TaskConfigTypeHandler.java b/src/main/java/org/apache/aurora/scheduler/storage/db/typehandlers/TaskConfigTypeHandler.java
new file mode 100644
index 0000000..2f58357
--- /dev/null
+++ b/src/main/java/org/apache/aurora/scheduler/storage/db/typehandlers/TaskConfigTypeHandler.java
@@ -0,0 +1,73 @@
+/**
+ * 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.db.typehandlers;
+
+import java.sql.CallableStatement;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+
+import org.apache.aurora.codec.ThriftBinaryCodec;
+import org.apache.aurora.codec.ThriftBinaryCodec.CodingException;
+import org.apache.aurora.gen.TaskConfig;
+import org.apache.ibatis.type.JdbcType;
+import org.apache.ibatis.type.TypeHandler;
+
+/**
+ * Type handler for objects of type {@link TaskConfig}. Converts {@link TaskConfig} to/from byte
+ * array to be stored in SQL as BINARY type.
+ *
+ * <p/>
+ * NOTE: We don't want to store serialized thrift objects long-term, but instead plan to reference
+ * a canonical table of task configurations. This class will go away with AURORA-647.
+ */
+class TaskConfigTypeHandler implements TypeHandler<TaskConfig> {
+
+  @Override
+  public final void setParameter(
+      PreparedStatement ps,
+      int i,
+      TaskConfig parameter,
+      JdbcType jdbcType) throws SQLException {
+
+    try {
+      ps.setBytes(i, ThriftBinaryCodec.encodeNonNull(parameter));
+    } catch (CodingException e) {
+      throw new SQLException("Failed to encode thrift struct.", e);
+    }
+  }
+
+  @Override
+  public final TaskConfig getResult(ResultSet rs, String columnName) throws SQLException {
+    return decodeOrThrow(rs.getBytes(columnName));
+  }
+
+  @Override
+  public final TaskConfig getResult(ResultSet rs, int columnIndex) throws SQLException {
+    return decodeOrThrow(rs.getBytes(columnIndex));
+  }
+
+  @Override
+  public final TaskConfig getResult(CallableStatement cs, int columnIndex) throws SQLException {
+    return decodeOrThrow(cs.getBytes(columnIndex));
+  }
+
+  private TaskConfig decodeOrThrow(byte[] value) throws SQLException {
+    try {
+      return ThriftBinaryCodec.decode(TaskConfig.class, value);
+    } catch (CodingException e) {
+      throw new SQLException("Failed to decode thrift struct.", e);
+    }
+  }
+}

http://git-wip-us.apache.org/repos/asf/aurora/blob/a4595278/src/main/java/org/apache/aurora/scheduler/storage/db/typehandlers/TypeHandlers.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/aurora/scheduler/storage/db/typehandlers/TypeHandlers.java b/src/main/java/org/apache/aurora/scheduler/storage/db/typehandlers/TypeHandlers.java
index ed561c6..9afc3f3 100644
--- a/src/main/java/org/apache/aurora/scheduler/storage/db/typehandlers/TypeHandlers.java
+++ b/src/main/java/org/apache/aurora/scheduler/storage/db/typehandlers/TypeHandlers.java
@@ -34,6 +34,7 @@ public final class TypeHandlers {
         .add(JobUpdateStatusTypeHandler.class)
         .add(MaintenanceModeTypeHandler.class)
         .add(ScheduleStatusTypeHandler.class)
+        .add(TaskConfigTypeHandler.class)
         .build();
   }
 }

http://git-wip-us.apache.org/repos/asf/aurora/blob/a4595278/src/main/java/org/apache/aurora/scheduler/storage/db/views/DbInstanceTaskConfig.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/aurora/scheduler/storage/db/views/DbInstanceTaskConfig.java b/src/main/java/org/apache/aurora/scheduler/storage/db/views/DbInstanceTaskConfig.java
deleted file mode 100644
index f3fd7a9..0000000
--- a/src/main/java/org/apache/aurora/scheduler/storage/db/views/DbInstanceTaskConfig.java
+++ /dev/null
@@ -1,33 +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.db.views;
-
-import java.util.Set;
-
-import org.apache.aurora.gen.InstanceTaskConfig;
-import org.apache.aurora.gen.Range;
-
-public final class DbInstanceTaskConfig {
-  private DbTaskConfig task;
-  private Set<Range> instances;
-
-  private DbInstanceTaskConfig() {
-  }
-
-  InstanceTaskConfig toThrift() {
-    return new InstanceTaskConfig()
-        .setTask(task.toThrift())
-        .setInstances(instances);
-  }
-}

http://git-wip-us.apache.org/repos/asf/aurora/blob/a4595278/src/main/java/org/apache/aurora/scheduler/storage/db/views/DbJobUpdate.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/aurora/scheduler/storage/db/views/DbJobUpdate.java b/src/main/java/org/apache/aurora/scheduler/storage/db/views/DbJobUpdate.java
deleted file mode 100644
index 78703e9..0000000
--- a/src/main/java/org/apache/aurora/scheduler/storage/db/views/DbJobUpdate.java
+++ /dev/null
@@ -1,36 +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.db.views;
-
-import org.apache.aurora.gen.JobUpdate;
-import org.apache.aurora.gen.JobUpdateSummary;
-import org.apache.aurora.scheduler.storage.entities.IJobUpdate;
-
-public final class DbJobUpdate {
-  private JobUpdateSummary summary;
-  private DbJobUpdateInstructions instructions;
-
-  private DbJobUpdate() {
-  }
-
-  JobUpdate toThrift() {
-    return new JobUpdate()
-        .setSummary(summary)
-        .setInstructions(instructions.toThrift());
-  }
-
-  public IJobUpdate toImmutable() {
-    return IJobUpdate.build(toThrift());
-  }
-}

http://git-wip-us.apache.org/repos/asf/aurora/blob/a4595278/src/main/java/org/apache/aurora/scheduler/storage/db/views/DbJobUpdateDetails.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/aurora/scheduler/storage/db/views/DbJobUpdateDetails.java b/src/main/java/org/apache/aurora/scheduler/storage/db/views/DbJobUpdateDetails.java
deleted file mode 100644
index 3a52724..0000000
--- a/src/main/java/org/apache/aurora/scheduler/storage/db/views/DbJobUpdateDetails.java
+++ /dev/null
@@ -1,33 +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.db.views;
-
-import java.util.List;
-
-import org.apache.aurora.gen.JobInstanceUpdateEvent;
-import org.apache.aurora.gen.JobUpdateDetails;
-import org.apache.aurora.gen.JobUpdateEvent;
-
-public final class DbJobUpdateDetails {
-  private DbJobUpdate update;
-  private List<JobUpdateEvent> updateEvents;
-  private List<JobInstanceUpdateEvent> instanceEvents;
-
-  public JobUpdateDetails toThrift() {
-    return new JobUpdateDetails()
-        .setUpdate(update.toThrift())
-        .setUpdateEvents(updateEvents)
-        .setInstanceEvents(instanceEvents);
-  }
-}

http://git-wip-us.apache.org/repos/asf/aurora/blob/a4595278/src/main/java/org/apache/aurora/scheduler/storage/db/views/DbJobUpdateInstructions.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/aurora/scheduler/storage/db/views/DbJobUpdateInstructions.java b/src/main/java/org/apache/aurora/scheduler/storage/db/views/DbJobUpdateInstructions.java
deleted file mode 100644
index d19aa85..0000000
--- a/src/main/java/org/apache/aurora/scheduler/storage/db/views/DbJobUpdateInstructions.java
+++ /dev/null
@@ -1,45 +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.db.views;
-
-import java.util.Set;
-
-import com.google.common.collect.FluentIterable;
-
-import org.apache.aurora.gen.JobUpdateInstructions;
-import org.apache.aurora.gen.JobUpdateSettings;
-import org.apache.aurora.scheduler.storage.entities.IJobUpdateInstructions;
-
-public final class DbJobUpdateInstructions {
-  private Set<DbInstanceTaskConfig> initialState;
-  private DbInstanceTaskConfig desiredState;
-  private JobUpdateSettings settings;
-
-  private DbJobUpdateInstructions() {
-  }
-
-  JobUpdateInstructions toThrift() {
-    return new JobUpdateInstructions()
-        .setInitialState(
-            FluentIterable.from(initialState)
-                .transform(DbInstanceTaskConfig::toThrift)
-                .toSet())
-        .setDesiredState(desiredState == null ? null : desiredState.toThrift())
-        .setSettings(settings);
-  }
-
-  public IJobUpdateInstructions toImmutable() {
-    return IJobUpdateInstructions.build(toThrift());
-  }
-}

http://git-wip-us.apache.org/repos/asf/aurora/blob/a4595278/src/main/java/org/apache/aurora/scheduler/storage/db/views/DbStoredJobUpdateDetails.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/aurora/scheduler/storage/db/views/DbStoredJobUpdateDetails.java b/src/main/java/org/apache/aurora/scheduler/storage/db/views/DbStoredJobUpdateDetails.java
deleted file mode 100644
index 8ec6d47..0000000
--- a/src/main/java/org/apache/aurora/scheduler/storage/db/views/DbStoredJobUpdateDetails.java
+++ /dev/null
@@ -1,30 +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.db.views;
-
-import org.apache.aurora.gen.storage.StoredJobUpdateDetails;
-
-public final class DbStoredJobUpdateDetails {
-  private DbJobUpdateDetails details;
-  private String lockToken;
-
-  private DbStoredJobUpdateDetails() {
-  }
-
-  public StoredJobUpdateDetails toThrift() {
-    return new StoredJobUpdateDetails()
-        .setDetails(details.toThrift())
-        .setLockToken(lockToken);
-  }
-}

http://git-wip-us.apache.org/repos/asf/aurora/blob/a4595278/src/main/resources/org/apache/aurora/scheduler/storage/db/JobUpdateDetailsMapper.xml
----------------------------------------------------------------------
diff --git a/src/main/resources/org/apache/aurora/scheduler/storage/db/JobUpdateDetailsMapper.xml b/src/main/resources/org/apache/aurora/scheduler/storage/db/JobUpdateDetailsMapper.xml
index 69e11b6..6ffb54f 100644
--- a/src/main/resources/org/apache/aurora/scheduler/storage/db/JobUpdateDetailsMapper.xml
+++ b/src/main/resources/org/apache/aurora/scheduler/storage/db/JobUpdateDetailsMapper.xml
@@ -88,11 +88,11 @@
   <insert id="insertTaskConfig" useGeneratedKeys="true" keyColumn="id" keyProperty="result.id">
     INSERT INTO job_update_configs (
       update_row_id,
-      task_config_row_id,
+      task_config,
       is_new
     ) VALUES (
       <include refid="select_update_row_id"/>,
-      #{taskConfigRow},
+      #{config, typeHandler=org.apache.aurora.scheduler.storage.db.typehandlers.TaskConfigTypeHandler},
       #{isNew}
     )
   </insert>
@@ -157,15 +157,11 @@
     <id column="id" />
   </resultMap>
 
-  <resultMap
-      id="instanceConfigMap"
-      type="org.apache.aurora.scheduler.storage.db.views.DbInstanceTaskConfig">
+  <resultMap id="instanceConfigMap" type="org.apache.aurora.gen.InstanceTaskConfig">
     <id column="id" />
-    <association
-        property="task"
-        select="org.apache.aurora.scheduler.storage.db.TaskConfigMapper.selectConfig"
-        column="task_config_row_id"
-        foreignColumn="row_id"/>
+    <result property="task"
+            column="task"
+            typeHandler="org.apache.aurora.scheduler.storage.db.typehandlers.TaskConfigTypeHandler" />
     <collection property="instances" resultMap="rangeMap" columnPrefix="r_" notNullColumn="id" />
   </resultMap>
 
@@ -177,9 +173,7 @@
                 notNullColumn="id" />
   </resultMap>
 
-  <resultMap
-      id="jobUpdateInstructionMap"
-      type="org.apache.aurora.scheduler.storage.db.views.DbJobUpdateInstructions">
+  <resultMap id="jobUpdateInstructionMap" type="org.apache.aurora.gen.JobUpdateInstructions">
     <id column="id" />
     <association property="desiredState" resultMap="instanceConfigMap" columnPrefix="ditc_" />
     <association property="settings" resultMap="jobUpdateSettingsMap" columnPrefix="juse_"/>
@@ -189,7 +183,7 @@
                 notNullColumn="id" />
   </resultMap>
 
-  <resultMap id="jobUpdateMap" type="org.apache.aurora.scheduler.storage.db.views.DbJobUpdate">
+  <resultMap id="jobUpdateMap" type="org.apache.aurora.gen.JobUpdate">
     <id column="u_id" />
     <association property="summary" resultMap="jobUpdateSummaryMap" columnPrefix="jusm_"/>
     <association property="instructions" resultMap="jobUpdateInstructionMap" columnPrefix="jui_"/>
@@ -209,9 +203,8 @@
             typeHandler="org.apache.aurora.scheduler.storage.db.typehandlers.JobUpdateStatusTypeHandler"/>
   </resultMap>
 
-  <resultMap
-      id="jobUpdateDetailsMap"
-      type="org.apache.aurora.scheduler.storage.db.views.DbStoredJobUpdateDetails">
+
+  <resultMap id="jobUpdateDetailsMap" type="org.apache.aurora.gen.storage.StoredJobUpdateDetails">
     <id column="u_id" />
     <association property="details.update" resultMap="jobUpdateMap" />
     <collection property="details.updateEvents"
@@ -350,12 +343,12 @@
       u.block_if_no_pulses_after_ms AS jui_juse_block_if_no_pulses_after_ms,
       u.id AS jui_id,
       cn.id AS jui_ditc_id,
-      cn.task_config_row_id AS jui_ditc_task_config_row_id,
+      cn.task_config AS jui_ditc_task,
       di.id AS jui_ditc_r_id,
       di.first AS jui_ditc_r_first,
       di.last AS jui_ditc_r_last,
       co.id AS jui_iitc_id,
-      co.task_config_row_id AS jui_iitc_task_config_row_id,
+      co.task_config AS jui_iitc_task,
       ci.id AS jui_iitc_r_id,
       ci.first AS jui_iitc_r_first,
       ci.last AS jui_iitc_r_last,
@@ -403,12 +396,12 @@
       u.block_if_no_pulses_after_ms AS juse_block_if_no_pulses_after_ms,
       u.id AS id,
       cn.id AS ditc_id,
-      cn.task_config_row_id AS ditc_task_config_row_id,
+      cn.task_config AS ditc_task,
       di.id AS ditc_r_id,
       di.first AS ditc_r_first,
       di.last AS ditc_r_last,
       co.id AS iitc_id,
-      co.task_config_row_id AS iitc_task_config_row_id,
+      co.task_config AS iitc_task,
       ci.id AS iitc_r_id,
       ci.first AS iitc_r_first,
       ci.last AS iitc_r_last,

http://git-wip-us.apache.org/repos/asf/aurora/blob/a4595278/src/main/resources/org/apache/aurora/scheduler/storage/db/schema.sql
----------------------------------------------------------------------
diff --git a/src/main/resources/org/apache/aurora/scheduler/storage/db/schema.sql b/src/main/resources/org/apache/aurora/scheduler/storage/db/schema.sql
index 4df685a..d971aa1 100644
--- a/src/main/resources/org/apache/aurora/scheduler/storage/db/schema.sql
+++ b/src/main/resources/org/apache/aurora/scheduler/storage/db/schema.sql
@@ -79,6 +79,97 @@ CREATE TABLE host_attribute_values(
   UNIQUE(host_attribute_id, name, value)
 );
 
+CREATE TABLE job_instance_update_actions(
+  id INT PRIMARY KEY,
+  name VARCHAR NOT NULL,
+
+  UNIQUE(name)
+);
+
+CREATE TABLE job_update_statuses(
+  id INT PRIMARY KEY,
+  name VARCHAR NOT NULL,
+
+  UNIQUE(name)
+);
+
+CREATE TABLE job_updates(
+  id IDENTITY,
+  job_key_id BIGINT NOT NULL REFERENCES job_keys(id),
+  update_id VARCHAR NOT NULL,
+  user VARCHAR NOT NULL,
+  update_group_size INT NOT NULL,
+  max_per_instance_failures INT NOT NULL,
+  max_failed_instances INT NOT NULL,
+  max_wait_to_instance_running_ms INT NOT NULL,
+  min_wait_in_instance_running_ms INT NOT NULL,
+  rollback_on_failure BOOLEAN NOT NULL,
+  wait_for_batch_completion BOOLEAN NOT NULL,
+  block_if_no_pulses_after_ms INT NULL,
+
+  UNIQUE(update_id, job_key_id)
+);
+
+CREATE TABLE job_update_locks(
+  id IDENTITY,
+  update_row_id BIGINT NOT NULL REFERENCES job_updates(id) ON DELETE CASCADE,
+  lock_token VARCHAR NOT NULL REFERENCES locks(token) ON DELETE CASCADE,
+
+  UNIQUE(update_row_id),
+  UNIQUE(lock_token)
+);
+
+CREATE TABLE job_update_configs(
+  id IDENTITY,
+  update_row_id BIGINT NOT NULL REFERENCES job_updates(id) ON DELETE CASCADE,
+  task_config BINARY NOT NULL,
+  is_new BOOLEAN NOT NULL
+);
+
+CREATE TABLE job_updates_to_instance_overrides(
+  id IDENTITY,
+  update_row_id BIGINT NOT NULL REFERENCES job_updates(id) ON DELETE CASCADE,
+  first INT NOT NULL,
+  last INT NOT NULL,
+
+  UNIQUE(update_row_id, first, last)
+);
+
+CREATE TABLE job_updates_to_desired_instances(
+  id IDENTITY,
+  update_row_id BIGINT NOT NULL REFERENCES job_updates(id) ON DELETE CASCADE,
+  first INT NOT NULL,
+  last INT NOT NULL,
+
+  UNIQUE(update_row_id, first, last)
+);
+
+CREATE TABLE job_update_configs_to_instances(
+  id IDENTITY,
+  config_id BIGINT NOT NULL REFERENCES job_update_configs(id) ON DELETE CASCADE,
+  first INT NOT NULL,
+  last INT NOT NULL,
+
+  UNIQUE(config_id, first, last)
+);
+
+CREATE TABLE job_update_events(
+  id IDENTITY,
+  update_row_id BIGINT NOT NULL REFERENCES job_updates(id) ON DELETE CASCADE,
+  status INT NOT NULL REFERENCES job_update_statuses(id),
+  timestamp_ms BIGINT NOT NULL,
+  user VARCHAR,
+  message VARCHAR
+);
+
+CREATE TABLE job_instance_update_events(
+  id IDENTITY,
+  update_row_id BIGINT NOT NULL REFERENCES job_updates(id) ON DELETE CASCADE,
+  action INT NOT NULL REFERENCES job_instance_update_actions(id),
+  instance_id INT NOT NULL,
+  timestamp_ms BIGINT NOT NULL
+);
+
 /**
  * NOTE: This table is truncated by TaskMapper, which will cause a conflict when the table is shared
  * with the forthcoming jobs table.  See note in TaskMapper about this before migrating MemJobStore.
@@ -227,94 +318,3 @@ CREATE TABLE cron_jobs(
 
   UNIQUE(job_key_id)
 );
-
-CREATE TABLE job_instance_update_actions(
-  id INT PRIMARY KEY,
-  name VARCHAR NOT NULL,
-
-  UNIQUE(name)
-);
-
-CREATE TABLE job_update_statuses(
-  id INT PRIMARY KEY,
-  name VARCHAR NOT NULL,
-
-  UNIQUE(name)
-);
-
-CREATE TABLE job_updates(
-  id IDENTITY,
-  job_key_id BIGINT NOT NULL REFERENCES job_keys(id),
-  update_id VARCHAR NOT NULL,
-  user VARCHAR NOT NULL,
-  update_group_size INT NOT NULL,
-  max_per_instance_failures INT NOT NULL,
-  max_failed_instances INT NOT NULL,
-  max_wait_to_instance_running_ms INT NOT NULL,
-  min_wait_in_instance_running_ms INT NOT NULL,
-  rollback_on_failure BOOLEAN NOT NULL,
-  wait_for_batch_completion BOOLEAN NOT NULL,
-  block_if_no_pulses_after_ms INT NULL,
-
-  UNIQUE(update_id, job_key_id)
-);
-
-CREATE TABLE job_update_locks(
-  id IDENTITY,
-  update_row_id BIGINT NOT NULL REFERENCES job_updates(id) ON DELETE CASCADE,
-  lock_token VARCHAR NOT NULL REFERENCES locks(token) ON DELETE CASCADE,
-
-  UNIQUE(update_row_id),
-  UNIQUE(lock_token)
-);
-
-CREATE TABLE job_update_configs(
-  id IDENTITY,
-  update_row_id BIGINT NOT NULL REFERENCES job_updates(id) ON DELETE CASCADE,
-  task_config_row_id INT NOT NULL REFERENCES task_configs(id),
-  is_new BOOLEAN NOT NULL
-);
-
-CREATE TABLE job_updates_to_instance_overrides(
-  id IDENTITY,
-  update_row_id BIGINT NOT NULL REFERENCES job_updates(id) ON DELETE CASCADE,
-  first INT NOT NULL,
-  last INT NOT NULL,
-
-  UNIQUE(update_row_id, first, last)
-);
-
-CREATE TABLE job_updates_to_desired_instances(
-  id IDENTITY,
-  update_row_id BIGINT NOT NULL REFERENCES job_updates(id) ON DELETE CASCADE,
-  first INT NOT NULL,
-  last INT NOT NULL,
-
-  UNIQUE(update_row_id, first, last)
-);
-
-CREATE TABLE job_update_configs_to_instances(
-  id IDENTITY,
-  config_id BIGINT NOT NULL REFERENCES job_update_configs(id) ON DELETE CASCADE,
-  first INT NOT NULL,
-  last INT NOT NULL,
-
-  UNIQUE(config_id, first, last)
-);
-
-CREATE TABLE job_update_events(
-  id IDENTITY,
-  update_row_id BIGINT NOT NULL REFERENCES job_updates(id) ON DELETE CASCADE,
-  status INT NOT NULL REFERENCES job_update_statuses(id),
-  timestamp_ms BIGINT NOT NULL,
-  user VARCHAR,
-  message VARCHAR
-);
-
-CREATE TABLE job_instance_update_events(
-  id IDENTITY,
-  update_row_id BIGINT NOT NULL REFERENCES job_updates(id) ON DELETE CASCADE,
-  action INT NOT NULL REFERENCES job_instance_update_actions(id),
-  instance_id INT NOT NULL,
-  timestamp_ms BIGINT NOT NULL
-);

http://git-wip-us.apache.org/repos/asf/aurora/blob/a4595278/src/test/java/org/apache/aurora/scheduler/storage/db/DbJobUpdateStoreTest.java
----------------------------------------------------------------------
diff --git a/src/test/java/org/apache/aurora/scheduler/storage/db/DbJobUpdateStoreTest.java b/src/test/java/org/apache/aurora/scheduler/storage/db/DbJobUpdateStoreTest.java
index 4c7133f..3e78c09 100644
--- a/src/test/java/org/apache/aurora/scheduler/storage/db/DbJobUpdateStoreTest.java
+++ b/src/test/java/org/apache/aurora/scheduler/storage/db/DbJobUpdateStoreTest.java
@@ -186,9 +186,7 @@ public class DbJobUpdateStoreTest {
   public void testSaveEmptyInitialStateRangesThrows() {
     JobUpdate builder = makeJobUpdate(makeKey("u1")).newBuilder();
     builder.getInstructions().getInitialState().add(
-        new InstanceTaskConfig(
-            TaskTestUtil.makeConfig(TaskTestUtil.JOB).newBuilder(),
-            ImmutableSet.of()));
+        new InstanceTaskConfig(new TaskConfig(), ImmutableSet.of()));
 
     saveUpdate(IJobUpdate.build(builder), Optional.of("lock"));
   }