package com.breakersoft.plow.thrift.dao.pgsql; import java.sql.ResultSet; import java.sql.SQLException; import java.util.List; import java.util.UUID; import org.apache.commons.lang.StringUtils; import org.springframework.jdbc.core.RowMapper; import org.springframework.stereotype.Repository; import org.springframework.transaction.annotation.Transactional; import com.breakersoft.plow.dao.AbstractDao; import com.breakersoft.plow.thrift.TaskFilterT; import com.breakersoft.plow.thrift.TaskState; import com.breakersoft.plow.thrift.TaskStatsT; import com.breakersoft.plow.thrift.TaskT; import com.breakersoft.plow.thrift.dao.ThriftTaskDao; import com.breakersoft.plow.util.JdbcUtils; import com.breakersoft.plow.util.PlowUtils; import com.google.common.collect.Lists; @Repository @Transactional(readOnly=true) public class ThriftTaskDaoImpl extends AbstractDao implements ThriftTaskDao { public static final RowMapper<TaskT> MAPPER = new RowMapper<TaskT>() { @Override public TaskT mapRow(ResultSet rs, int rowNum) throws SQLException { final TaskT task = new TaskT(); task.id = rs.getString("pk_task"); task.layerId = rs.getString("pk_layer"); task.jobId = rs.getString("pk_job"); task.state = TaskState.findByValue(rs.getInt("int_state")); task.name = rs.getString("str_name"); task.number = rs.getInt("int_number"); task.order = rs.getInt("int_task_order"); task.retries = rs.getInt("int_retry"); task.minCores = rs.getInt("int_cores_min"); task.minRam = rs.getInt("int_ram_min"); final TaskStatsT stats = new TaskStatsT(); stats.setStartTime(rs.getLong("time_started")); stats.setStopTime(rs.getLong("time_stopped")); stats.setExitSignal(rs.getInt("int_exit_signal")); stats.setExitStatus(rs.getInt("int_exit_status")); stats.setLastNode(rs.getString("str_last_node_name")); stats.setRam(rs.getInt("int_last_ram")); stats.setHighRam(rs.getInt("int_last_ram_high")); stats.setCores(rs.getInt("int_last_cores")); stats.setHighCores(rs.getDouble("flt_last_cores_high")); stats.setRetryNum(rs.getInt("int_retry")); stats.setActive(false); if (rs.getInt("p_cores") > 0) { stats.setCores(rs.getInt("p_cores")); stats.setHighCores(rs.getDouble("p_cores_used")); stats.setUsedCores(rs.getDouble("p_cores_high")); stats.setRam(rs.getInt("p_ram")); stats.setUsedRam(rs.getInt("p_ram_high")); stats.setHighRam(rs.getInt("p_ram_used")); stats.setProgress(rs.getInt("p_progress")); stats.setLastLogLine(rs.getString("p_last_log_line")); stats.active = true; } task.setStats(stats); return task; } }; // Make a func off task to gret the cores private static final String GET = "SELECT " + "task.pk_task,"+ "task.pk_layer,"+ "task.pk_job,"+ "task.str_name,"+ "task.int_number,"+ "task.int_task_order,"+ "task.int_state,"+ "task.time_started, " + "task.time_stopped," + "task.int_retry,"+ "task.int_last_ram,"+ "task.int_last_ram_high,"+ "task.int_last_cores,"+ "task.flt_last_cores_high,"+ "layer.int_cores_min,"+ "task.int_ram_min,"+ "task.str_last_node_name, " + "task.int_exit_signal,"+ "task.int_exit_status,"+ "proc.int_cores p_cores,"+ "proc.flt_cores_used AS p_cores_used,"+ "proc.flt_cores_high AS p_cores_high,"+ "proc.int_ram AS p_ram,"+ "proc.int_ram_high AS p_ram_high,"+ "proc.int_ram_used AS p_ram_used,"+ "proc.int_progress AS p_progress,"+ "proc.str_last_log_line AS p_last_log_line " + "FROM " + "task "+ "INNER JOIN " + "layer ON task.pk_layer = layer.pk_layer " + "LEFT JOIN " + "plow.proc ON task.pk_task = proc.pk_task "; private static final String GET_BY_ID = GET + " WHERE task.pk_task=?"; @Override public TaskT getTask(UUID id) { return jdbc.queryForObject(GET_BY_ID, MAPPER, id); } private static final String GET_LOG_PATH = "SELECT " + "job.str_log_path || '/' || task.str_name || '.' || task.int_retry || '.log' " + "FROM " + "plow.task " + "INNER JOIN " + "plow.job " + "ON task.pk_job = job.pk_job " + "WHERE " + "task.pk_task = ?"; @Override public String getLogPath(UUID id) { return jdbc.queryForObject(GET_LOG_PATH, String.class, id); } @Override public List<TaskT> getTasks(TaskFilterT filter) { final List<String> where = Lists.newArrayList(); final List<Object> values = Lists.newArrayList(); if (PlowUtils.isValid(filter.jobId)) { where.add("task.pk_job = ? "); values.add(UUID.fromString(filter.jobId)); } if (PlowUtils.isValid(filter.layerIds)) { where.add(JdbcUtils.In( "task.pk_layer", filter.layerIds.size(), "uuid")); values.addAll(filter.layerIds); } if (PlowUtils.isValid(filter.nodeIds)) { where.add(JdbcUtils.In( "proc.pk_node", filter.nodeIds.size(), "uuid")); values.addAll(filter.nodeIds); } if (PlowUtils.isValid(filter.taskIds)) { where.add(JdbcUtils.In( "task.pk_task", filter.taskIds.size(), "uuid")); values.addAll(filter.taskIds); } if (where.isEmpty()) { throw new RuntimeException("A job, layer, task, or node ID must be set."); } if (filter.getLastUpdateTime() > 0) { where.add("task.time_updated >= ?"); values.add(filter.getLastUpdateTime()); } if (PlowUtils.isValid(filter.states)) { where.add(JdbcUtils.In( "task.int_state", filter.states.size())); for (TaskState state: filter.states) { values.add(state.ordinal()); } } final StringBuilder sb = new StringBuilder(512); sb.append(GET); sb.append(" WHERE "); sb.append(StringUtils.join(where, " AND ")); sb.append(" ORDER BY int_task_order ASC"); return jdbc.query(sb.toString(), MAPPER, values.toArray()); } public static final RowMapper<TaskStatsT> STATS_MAPPER = new RowMapper<TaskStatsT>() { @Override public TaskStatsT mapRow(ResultSet rs, int rowNum) throws SQLException { final TaskStatsT stats = new TaskStatsT(); stats.cores = rs.getInt("int_cores"); stats.highCores = rs.getDouble("flt_cores_high"); stats.usedCores = 0; stats.ram = rs.getInt("int_ram"); stats.usedRam = 0; stats.highRam = rs.getInt("int_ram_high"); stats.startTime = rs.getLong("time_started"); stats.stopTime = rs.getLong("time_stopped"); stats.retryNum = rs.getInt("int_retry"); stats.progress = rs.getInt("int_progress"); stats.lastLogLine = ""; stats.exitSignal = rs.getInt("int_exit_signal"); stats.exitStatus = rs.getInt("int_exit_status"); stats.active = true; return stats; } }; private static final String TASK_HISTORY = "SELECT " + "int_cores,"+ "int_cores,"+ "flt_cores_high,"+ "int_ram,"+ "int_ram_high,"+ "time_started,"+ "time_stopped,"+ "int_retry,"+ "int_progress,"+ "int_exit_signal,"+ "int_exit_status "+ "FROM " + "task_history " + "WHERE " + "pk_task = ?"; @Override public List<TaskStatsT> getTaskStats(UUID taskId) { return jdbc.query(TASK_HISTORY, STATS_MAPPER, taskId); } }