/*
* Copyright 2015-2016 OpenCB
*
* 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.opencb.opencga.catalog.monitor.daemons;
import org.opencb.commons.datastore.core.Query;
import org.opencb.commons.datastore.core.QueryOptions;
import org.opencb.commons.datastore.core.QueryResult;
import org.opencb.opencga.catalog.db.api.JobDBAdaptor;
import org.opencb.opencga.catalog.exceptions.CatalogException;
import org.opencb.opencga.catalog.managers.CatalogManager;
import org.opencb.opencga.catalog.managers.api.IJobManager;
import org.opencb.opencga.catalog.models.Job;
import org.opencb.opencga.core.common.TimeUtils;
import java.util.Map;
/**
* Created by imedina on 16/06/16.
*/
public class ExecutionDaemon extends MonitorParentDaemon {
private int runningJobs;
private String binHome;
public ExecutionDaemon(int interval, String sessionId, CatalogManager catalogManager, String appHome) {
super(interval, sessionId, catalogManager);
this.binHome = appHome + "/bin/";
}
@Override
public void run() {
IJobManager jobManager = catalogManager.getJobManager();
Query runningJobsQuery = new Query()
.append(JobDBAdaptor.QueryParams.STATUS_NAME.key(), Job.JobStatus.RUNNING)
.append(JobDBAdaptor.QueryParams.TYPE.key(), "!=" + Job.Type.INDEX);
Query queuedJobsQuery = new Query()
.append(JobDBAdaptor.QueryParams.STATUS_NAME.key(), Job.JobStatus.QUEUED)
.append(JobDBAdaptor.QueryParams.TYPE.key(), "!=" + Job.Type.INDEX);
Query preparedJobsQuery = new Query()
.append(JobDBAdaptor.QueryParams.STATUS_NAME.key(), Job.JobStatus.PREPARED)
.append(JobDBAdaptor.QueryParams.TYPE.key(), "!=" + Job.Type.INDEX);
// Sort jobs by creation date
QueryOptions queryOptions = new QueryOptions()
.append(QueryOptions.SORT, JobDBAdaptor.QueryParams.CREATION_DATE.key())
.append(QueryOptions.ORDER, QueryOptions.ASCENDING);
while (!exit) {
try {
Thread.sleep(interval);
} catch (InterruptedException e) {
if (!exit) {
e.printStackTrace();
}
}
logger.info("----- EXECUTION DAEMON -----", TimeUtils.getTimeMillis());
/*
RUNNING JOBS
*/
try {
QueryResult<Job> runningJobs = jobManager.get(runningJobsQuery, queryOptions, sessionId);
logger.debug("Checking running jobs. {} running jobs found", runningJobs.getNumResults());
for (Job job : runningJobs.getResult()) {
checkRunningJob(job);
}
} catch (CatalogException e) {
e.printStackTrace();
}
/*
QUEUED JOBS
*/
try {
QueryResult<Job> queuedJobs = jobManager.get(queuedJobsQuery, queryOptions, sessionId);
logger.debug("Checking queued jobs. {} running jobs found", queuedJobs.getNumResults());
for (Job job : queuedJobs.getResult()) {
checkQueuedJob(job);
}
} catch (CatalogException e) {
e.printStackTrace();
}
/*
PREPARED JOBS
*/
try {
QueryResult<Job> preparedJobs = jobManager.get(preparedJobsQuery, queryOptions, sessionId);
logger.debug("Checking prepared jobs. {} running jobs found", preparedJobs.getNumResults());
for (Job job : preparedJobs.getResult()) {
checkPreparedJob(job);
}
} catch (CatalogException e) {
e.printStackTrace();
}
}
}
private void checkRunningJob(Job job) {
logger.info("Updating job {} from {} to {}", job.getId(), Job.JobStatus.RUNNING, Job.JobStatus.READY);
try {
// catalogManager.getJobManager().update(
// job.getId(), new ObjectMap(JobDBAdaptor.QueryParams.STATUS_NAME.key(), Job.JobStatus.READY),
// new QueryOptions(), sessionId);
catalogManager.getJobManager().setStatus(Long.toString(job.getId()), Job.JobStatus.READY, null, sessionId);
} catch (CatalogException e) {
logger.error("Could not update job {}. {}", job.getId(), e.getMessage());
e.printStackTrace();
}
}
private void checkQueuedJob(Job job) {
logger.info("Updating job {} from {} to {}", job.getId(), Job.JobStatus.QUEUED, Job.JobStatus.RUNNING);
try {
logger.info("Running job {}" + job.getName());
// catalogManager.getJobManager().update(
// job.getId(), new ObjectMap(JobDBAdaptor.QueryParams.STATUS_NAME.key(), Job.JobStatus.RUNNING),
// new QueryOptions(), sessionId);
catalogManager.getJobManager().setStatus(Long.toString(job.getId()), Job.JobStatus.RUNNING, null, sessionId);
} catch (CatalogException e) {
logger.error("Could not update job {}. {}", job.getId(), e.getMessage());
e.printStackTrace();
}
}
private void checkPreparedJob(Job job) {
StringBuilder commandLine = new StringBuilder(binHome).append(job.getExecutable()).append(" ");
for (Map.Entry<String, String> param : job.getParams().entrySet()) {
commandLine
.append("--")
.append(param.getKey())
.append(" ")
.append(param.getValue())
.append(" ");
}
logger.info("Updating job {} from {} to {}", commandLine.toString(), Job.JobStatus.PREPARED, Job.JobStatus.QUEUED);
try {
// catalogManager.getJobManager().update(
// job.getId(), new ObjectMap(JobDBAdaptor.QueryParams.STATUS_NAME.key(), Job.JobStatus.QUEUED),
// new QueryOptions(), sessionId);
catalogManager.getJobManager().setStatus(Long.toString(job.getId()), Job.JobStatus.QUEUED, null, sessionId);
} catch (CatalogException e) {
logger.error("Could not update job {}. {}", job.getId(), e.getMessage());
e.printStackTrace();
}
}
}