package com.breakersoft.plow.dispatcher.dao;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;
import java.util.UUID;
import org.springframework.dao.DataAccessException;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.stereotype.Repository;
import com.breakersoft.plow.JobId;
import com.breakersoft.plow.Proc;
import com.breakersoft.plow.ProcE;
import com.breakersoft.plow.Task;
import com.breakersoft.plow.dao.AbstractDao;
import com.breakersoft.plow.dispatcher.domain.DispatchProc;
import com.breakersoft.plow.exceptions.PlowDispatcherException;
import com.breakersoft.plow.util.JdbcUtils;
@Repository
public class ProcDaoImpl extends AbstractDao implements ProcDao {
public static final RowMapper<Proc> MAPPER = new RowMapper<Proc>() {
@Override
public Proc mapRow(ResultSet rs, int rowNum)
throws SQLException {
ProcE proc = new ProcE();
proc.setProcId((UUID)rs.getObject(1));
proc.setJobId((UUID)rs.getObject(2));
proc.setNodeId((UUID)rs.getObject(3));
proc.setTaskId((UUID)rs.getObject(4));
proc.setHostname(rs.getString(5));
return proc;
}
};
private static final String GET =
"SELECT " +
"proc.pk_proc,"+
"proc.pk_job,"+
"proc.pk_node,"+
"proc.pk_task,"+
"node.str_name " +
"FROM " +
"plow.proc " +
"INNER JOIN plow.node " +
"ON " +
"proc.pk_node = node.pk_node " ;
private static final String GET_BY_ID = GET +"WHERE pk_proc = ?";
@Override
public Proc getProc(UUID procId) {
return jdbc.queryForObject(GET_BY_ID, MAPPER, procId);
}
private static final String GET_BY_FR = GET +"WHERE pk_task = ?";
@Override
public Proc getProc(Task task) {
return jdbc.queryForObject(GET_BY_FR, MAPPER, task.getTaskId());
}
private static final String INSERT =
JdbcUtils.Insert("plow.proc",
"pk_proc",
"pk_node",
"pk_cluster",
"pk_quota",
"pk_task",
"pk_layer",
"pk_job",
"int_cores",
"int_ram");
@Override
public void create(DispatchProc proc) {
proc.setProcId(UUID.randomUUID());
jdbc.update(INSERT,
proc.getProcId(),
proc.getNodeId(),
proc.getClusterId(),
proc.getQuotaId(),
proc.getTaskId(),
proc.getLayerId(),
proc.getJobId(),
proc.getIdleCores(),
proc.getIdleRam());
}
private static final String UNASSIGN =
"UPDATE " +
"plow.proc " +
"SET " +
"pk_task = NULL, " +
"time_updated = plow.txTimeMillis() " +
"WHERE " +
"pk_proc = ? " +
"AND " +
"pk_task IS NOT NULL";
@Override
public boolean unassign(Proc proc) {
if (proc == null) {
return false;
}
return jdbc.update(UNASSIGN, proc.getProcId()) == 1;
}
private static final String ASSIGN =
"UPDATE " +
"plow.proc " +
"SET " +
"pk_task = ?, " +
"pk_layer = ?, " +
"int_io_stats = '{0,0,0,0}',"+
"flt_cores_used = 0.0,"+
"flt_cores_high = 0.0," +
"int_ram_used = 0,"+
"int_ram_high = 0,"+
"int_progress = 0,"+
"str_last_log_line = NULL,"+
"time_updated = plow.txTimeMillis(), " +
"time_started = plow.txTimeMillis() " +
"WHERE " +
"pk_proc = ? " +
"AND " +
"pk_task IS NULL";
public boolean assign(Proc proc, Task task) {
try {
return jdbc.update(ASSIGN,
task.getTaskId(), task.getLayerId(), proc.getProcId()) == 1;
} catch (DataAccessException e) {
throw new PlowDispatcherException(
"Unable to assign proc " + proc + " to task " + task + "," + e, e);
}
}
@Override
public boolean delete(Proc proc) {
return jdbc.update(
"DELETE FROM plow.proc WHERE pk_proc=?", proc.getProcId()) == 1;
}
@Override
public List<Proc> getProcs(JobId job) {
return jdbc.query(GET +
" WHERE proc.pk_job=? ORDER BY proc.pk_proc", MAPPER, job.getJobId());
}
@Override
public boolean setProcUnbooked(Proc proc, boolean unbooked) {
return jdbc.update(
"UPDATE plow.proc SET bool_unbooked=? WHERE proc.pk_proc=?",
unbooked, proc.getProcId()) == 1;
}
@Override
public boolean setProcDeallocated(Proc proc) {
return jdbc.update(
"UPDATE plow.proc SET bool_dealloc=? WHERE proc.pk_proc=?",
true, proc.getProcId()) == 1;
}
@Override
public boolean unassignAndMarkForDeallocation(Proc proc) {
return jdbc.update(
"UPDATE plow.proc SET pk_task=NULL, bool_dealloc=?, time_updated=plow.txTimeMillis() WHERE proc.pk_proc=?",
true, proc.getProcId()) == 1;
}
}