Repository: aurora
Updated Branches:
  refs/heads/master 17ddc484f -> 9340d468f


Increase throughput of DbTaskStore

Profiling master indicated that the bottleneck was MyBatis populating ResultSets
and populating the resulting objects. This patch removes subselects, which
reduces the number of ResultSets and removes the population of an object via a
constructor which is slower than populating an object via setters.

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


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

Branch: refs/heads/master
Commit: 9340d468f446020250151d3da1c0d7c0e371b5bc
Parents: 17ddc48
Author: Zameer Manji <zma...@apache.org>
Authored: Fri Feb 12 13:32:54 2016 -0800
Committer: Zameer Manji <zma...@apache.org>
Committed: Fri Feb 12 13:32:54 2016 -0800

----------------------------------------------------------------------
 .../storage/db/views/DbAssginedPort.java        | 30 +++++++++++
 .../storage/db/views/DbAssignedTask.java        | 13 +++--
 .../storage/db/views/DbScheduledTask.java       | 12 +++++
 .../scheduler/storage/db/TaskConfigMapper.xml   | 34 +++++-------
 .../aurora/scheduler/storage/db/TaskMapper.xml  | 54 ++++++++------------
 5 files changed, 87 insertions(+), 56 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/aurora/blob/9340d468/src/main/java/org/apache/aurora/scheduler/storage/db/views/DbAssginedPort.java
----------------------------------------------------------------------
diff --git 
a/src/main/java/org/apache/aurora/scheduler/storage/db/views/DbAssginedPort.java
 
b/src/main/java/org/apache/aurora/scheduler/storage/db/views/DbAssginedPort.java
new file mode 100644
index 0000000..fdfff77
--- /dev/null
+++ 
b/src/main/java/org/apache/aurora/scheduler/storage/db/views/DbAssginedPort.java
@@ -0,0 +1,30 @@
+/**
+ * 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;
+
+public final class DbAssginedPort {
+  private String name;
+  private Integer port;
+
+  private DbAssginedPort() {
+  }
+
+  public Integer getPort() {
+    return port;
+  }
+
+  public String getName() {
+    return name;
+  }
+}

http://git-wip-us.apache.org/repos/asf/aurora/blob/9340d468/src/main/java/org/apache/aurora/scheduler/storage/db/views/DbAssignedTask.java
----------------------------------------------------------------------
diff --git 
a/src/main/java/org/apache/aurora/scheduler/storage/db/views/DbAssignedTask.java
 
b/src/main/java/org/apache/aurora/scheduler/storage/db/views/DbAssignedTask.java
index 9372239..cbc6a0c 100644
--- 
a/src/main/java/org/apache/aurora/scheduler/storage/db/views/DbAssignedTask.java
+++ 
b/src/main/java/org/apache/aurora/scheduler/storage/db/views/DbAssignedTask.java
@@ -14,8 +14,10 @@
 package org.apache.aurora.scheduler.storage.db.views;
 
 import java.util.List;
+import java.util.Map;
+
+import com.google.common.collect.Maps;
 
-import org.apache.aurora.common.collections.Pair;
 import org.apache.aurora.gen.AssignedTask;
 
 public final class DbAssignedTask {
@@ -23,19 +25,24 @@ public final class DbAssignedTask {
   private String slaveId;
   private String slaveHost;
   private DbTaskConfig task;
-  private List<Pair<String, Integer>> assignedPorts;
+  private List<DbAssginedPort> assignedPorts;
   private int instanceId;
 
   private DbAssignedTask() {
   }
 
   AssignedTask toThrift() {
+    Map<String, Integer> ports = Maps.newHashMap();
+    for (DbAssginedPort port: assignedPorts) {
+      ports.put(port.getName(), port.getPort());
+    }
+
     return new AssignedTask()
         .setTaskId(taskId)
         .setSlaveId(slaveId)
         .setSlaveHost(slaveHost)
         .setTask(task.toThrift())
-        .setAssignedPorts(Pairs.toMap(assignedPorts))
+        .setAssignedPorts(ports)
         .setInstanceId(instanceId);
   }
 }

http://git-wip-us.apache.org/repos/asf/aurora/blob/9340d468/src/main/java/org/apache/aurora/scheduler/storage/db/views/DbScheduledTask.java
----------------------------------------------------------------------
diff --git 
a/src/main/java/org/apache/aurora/scheduler/storage/db/views/DbScheduledTask.java
 
b/src/main/java/org/apache/aurora/scheduler/storage/db/views/DbScheduledTask.java
index 502a1fa..8d0dab0 100644
--- 
a/src/main/java/org/apache/aurora/scheduler/storage/db/views/DbScheduledTask.java
+++ 
b/src/main/java/org/apache/aurora/scheduler/storage/db/views/DbScheduledTask.java
@@ -13,8 +13,12 @@
  */
 package org.apache.aurora.scheduler.storage.db.views;
 
+import java.util.Collections;
 import java.util.List;
 
+import com.google.common.collect.Ordering;
+import com.google.common.primitives.Longs;
+
 import org.apache.aurora.gen.ScheduleStatus;
 import org.apache.aurora.gen.ScheduledTask;
 import org.apache.aurora.gen.TaskEvent;
@@ -31,6 +35,7 @@ public final class DbScheduledTask {
   }
 
   public IScheduledTask toImmutable() {
+    Collections.sort(taskEvents, BY_TIMESTAMP);
     return IScheduledTask.build(
         new ScheduledTask()
             .setAssignedTask(assignedTask.toThrift())
@@ -39,4 +44,11 @@ public final class DbScheduledTask {
             .setTaskEvents(taskEvents)
             .setAncestorId(ancestorId));
   }
+
+  private static final Ordering<TaskEvent> BY_TIMESTAMP = new 
Ordering<TaskEvent>() {
+    @Override
+    public int compare(TaskEvent left, TaskEvent right) {
+      return Longs.compare(left.getTimestamp(), right.getTimestamp());
+    }
+  };
 }

http://git-wip-us.apache.org/repos/asf/aurora/blob/9340d468/src/main/resources/org/apache/aurora/scheduler/storage/db/TaskConfigMapper.xml
----------------------------------------------------------------------
diff --git 
a/src/main/resources/org/apache/aurora/scheduler/storage/db/TaskConfigMapper.xml
 
b/src/main/resources/org/apache/aurora/scheduler/storage/db/TaskConfigMapper.xml
index b1394cf..fd272cc 100644
--- 
a/src/main/resources/org/apache/aurora/scheduler/storage/db/TaskConfigMapper.xml
+++ 
b/src/main/resources/org/apache/aurora/scheduler/storage/db/TaskConfigMapper.xml
@@ -79,22 +79,6 @@
     <association property="constraint" resultMap="taskConstraintMap"/>
   </resultMap>
 
-  <select id="selectConstraints" resultMap="constraintMap">
-    SELECT
-      tc.id AS id,
-      tc.name AS name,
-      tlc.id AS l_id,
-      tlc.value AS l_limit,
-      tvc.id AS v_id,
-      tvc.negated AS v_negated,
-      tvcv.value AS v_v_value
-    FROM task_constraints AS tc
-    LEFT OUTER JOIN limit_constraints AS tlc ON tlc.constraint_id = tc.id
-    LEFT OUTER JOIN value_constraints AS tvc ON tvc.constraint_id = tc.id
-    LEFT OUTER JOIN value_constraint_values AS tvcv ON 
tvcv.value_constraint_id = tvc.id
-    WHERE tc.task_config_id = #{id}
-  </select>
-
   <resultMap id="dockerParameterMap" 
type="org.apache.aurora.gen.DockerParameter">
     <id column="id"/>
   </resultMap>
@@ -138,9 +122,8 @@
     <association property="container" resultMap="containerMap" 
columnPrefix="c_"/>
     <collection
         property="constraints"
-        select="selectConstraints"
-        column="id"
-        foreignColumn="task_config_id"/>
+        columnPrefix="constraint_"
+        resultMap="constraintMap"/>
     <collection property="requestedPorts" ofType="String" columnPrefix="p_">
       <result column="port_name" />
     </collection>
@@ -175,12 +158,23 @@
       d.image AS c_image,
       m.id AS m_id,
       m.key AS m_key,
-      m.value AS m_value
+      m.value AS m_value,
+      tc.id AS constraint_id,
+      tc.name AS constraint_name,
+      tlc.id AS constraint_l_id,
+      tlc.value AS constraint_l_limit,
+      tvc.id AS constraint_v_id,
+      tvc.negated AS constraint_v_negated,
+      tvcv.value as constraint_v_v_value
     FROM task_configs AS c
     INNER JOIN job_keys AS j ON j.id = c.job_key_id
     LEFT OUTER JOIN task_config_requested_ports AS p ON p.task_config_id = c.id
     LEFT OUTER JOIN task_config_docker_containers AS d ON d.task_config_id = 
c.id
     LEFT OUTER JOIN task_config_metadata AS m ON m.task_config_id = c.id
+    LEFT OUTER JOIN task_constraints AS tc ON tc.task_config_id = c.id
+    LEFT OUTER JOIN limit_constraints as tlc ON tlc.constraint_id = tc.id
+    LEFT OUTER JOIN value_constraints as tvc ON tvc.constraint_id = tc.id
+    LEFT OUTER JOIN value_constraint_values AS tvcv ON 
tvcv.value_constraint_id = tvc.id
   </sql>
 
   <select id="selectConfig" resultMap="taskConfigMap">

http://git-wip-us.apache.org/repos/asf/aurora/blob/9340d468/src/main/resources/org/apache/aurora/scheduler/storage/db/TaskMapper.xml
----------------------------------------------------------------------
diff --git 
a/src/main/resources/org/apache/aurora/scheduler/storage/db/TaskMapper.xml 
b/src/main/resources/org/apache/aurora/scheduler/storage/db/TaskMapper.xml
index ea469cc..684614f 100644
--- a/src/main/resources/org/apache/aurora/scheduler/storage/db/TaskMapper.xml
+++ b/src/main/resources/org/apache/aurora/scheduler/storage/db/TaskMapper.xml
@@ -48,20 +48,11 @@
     <result property="status"
             column="status"
             
typeHandler="org.apache.aurora.scheduler.storage.db.typehandlers.ScheduleStatusTypeHandler"
 />
+    <result column="timestamp_ms" property="timestamp" />
+    <result column="message" property="message" />
+    <result column="scheduler_host" property="scheduler" />
   </resultMap>
 
-  <select id="selectTaskEvents" resultMap="taskEventMap">
-    SELECT
-      e.id AS id,
-      e.timestamp_ms AS timestamp,
-      e.status AS status,
-      e.message AS message,
-      e.scheduler_host AS scheduler
-    FROM task_events AS e
-    WHERE e.task_row_id = (SELECT id FROM tasks WHERE task_id = #{task_id})
-    ORDER BY e.timestamp_ms ASC
-  </select>
-
   <resultMap id="scheduledTaskMap" 
type="org.apache.aurora.scheduler.storage.db.views.DbScheduledTask">
     <id column="row_id"/>
     <result property="status"
@@ -78,14 +69,13 @@
         foreignColumn="row_id"/>
     <collection
         property="assignedTask.assignedPorts"
-        select="selectPorts"
-        column="task_id"
-        foreignColumn="task_row_id"/>
+        resultMap="portMap"
+        columnPrefix="tp_"/>
     <collection
         property="taskEvents"
-        select="selectTaskEvents"
-        column="task_id"
-        foreignColumn="task_row_id"/>
+        resultMap="taskEventMap"
+        columnPrefix="te_"
+        notNullColumn="status"/>
   </resultMap>
 
   <sql id="unscopedSelect">
@@ -101,10 +91,18 @@
       j.environment AS c_j_environment,
       j.name AS c_j_name,
       h.slave_id AS slave_id,
-      h.host AS slave_host
+      h.host AS slave_host,
+      tp.name as tp_name,
+      tp.port as tp_port,
+      te.timestamp_ms as te_timestamp,
+      te.status as te_status,
+      te.message as te_message,
+      te.scheduler_host as te_scheduler
     FROM tasks AS t
     INNER JOIN task_configs as c ON c.id = t.task_config_row_id
     INNER JOIN job_keys AS j ON j.id = c.job_key_id
+    LEFT OUTER JOIN task_ports as tp ON tp.task_row_id = t.id
+    LEFT OUTER JOIN task_events as te ON te.task_row_id = t.id
     LEFT OUTER JOIN host_attributes AS h ON h.id = t.slave_row_id
   </sql>
 
@@ -208,22 +206,12 @@
     )
   </insert>
 
-  <resultMap id="portMap" type="org.apache.aurora.common.collections.Pair">
-    <constructor>
-      <arg column="name"/>
-      <arg column="port"/>
-    </constructor>
+  <resultMap id="portMap" 
type="org.apache.aurora.scheduler.storage.db.views.DbAssginedPort">
+    <id column="id"/>
+    <result column="name" property="name" />
+    <result column="port" property="port" />
   </resultMap>
 
-  <select id="selectPorts" resultMap="portMap">
-    SELECT
-      id,
-      name,
-      port
-    FROM task_ports
-    WHERE task_row_id = (SELECT id FROM tasks WHERE task_id = #{task_id})
-  </select>
-
   <delete id="truncate">
     <!--
     This assumes cascading deletes will clean up all references.  Also, once 
the job store is

Reply via email to