diff --git a/src/core/tandem_run/tandemcondorprocess.cpp b/src/core/tandem_run/tandemcondorprocess.cpp index 3b81269283ac091b94a8fb55669dd3d2ad1a251b..dcbcb8b903f5ae326e99e1e2197d0c6bab34ff80 100644 --- a/src/core/tandem_run/tandemcondorprocess.cpp +++ b/src/core/tandem_run/tandemcondorprocess.cpp @@ -50,8 +50,9 @@ TandemCondorProcess::TandemCondorProcess(WorkMonitorInterface * p_monitor, const */ QSettings settings; - QString condor_tmp_dir = QString("%1/xtpcpp").arg(settings.value("condor/tmp_dir", "/gorgone/pappso/temp").toString()); + QString condor_tmp_dir = QString("%1/xtpcpp").arg(settings.value("condor/tmp_dir", "/tmp").toString()); _p_tmp_dir = new QTemporaryDir(condor_tmp_dir); + _p_tmp_dir->setAutoRemove(true); _condor_submit_command = settings.value("condor/submit", "/usr/bin/condor_submit").toString(); @@ -87,7 +88,7 @@ void TandemCondorProcess::prepareXmlDatabaseFile() { } void TandemCondorProcess::run() { - qDebug() << "TandeCondorProcess::run begin "; + qDebug() << "TandemCondorProcess::run begin "; QFileInfo preset_info(_tandem_run_batch._preset_file); _preset_file = QString("%1/%2").arg(_p_tmp_dir->path()).arg(preset_info.fileName()); QFile::copy(_tandem_run_batch._preset_file, _preset_file); @@ -111,9 +112,9 @@ void TandemCondorProcess::run() { *p_out << "request_memory= 50000" << endl; *p_out << "request_cpus = 1" << endl; *p_out << "Executable = " << _tandem_run_batch._tandem_bin_path << endl; - *p_out << "Log = \"" << _p_tmp_dir->path() << "/condor.log\"" << endl; - *p_out << "Output = \"" << _p_tmp_dir->path() << "/tandem.$(Process).out\"" << endl; - *p_out << "Error = \"" << _p_tmp_dir->path() << "/tandem.$(Process).error\"" << endl; + *p_out << "Log = " << _p_tmp_dir->path() << "/condor.log" << endl; + *p_out << "Output = " << _p_tmp_dir->path() << "/tandem.$(Process).out" << endl; + *p_out << "Error = " << _p_tmp_dir->path() << "/tandem.$(Process).error" << endl; /* Log = /gorgone/pappso/tmp/temp_condor_job93294001891239208719639434471283743/submit_condor.log Output = /gorgone/pappso/tmp/temp_condor_job93294001891239208719639434471283743/tandem.$(Process).out @@ -136,7 +137,7 @@ void TandemCondorProcess::run() { for (QString mz_file : _tandem_run_batch._mz_file_list) { - QTemporaryFile * p_xml_input_file = new QTemporaryFile(_p_tmp_dir->path()); + QTemporaryFile * p_xml_input_file = new QTemporaryFile(QString("%1/tandem").arg(_p_tmp_dir->path())); input_file_list.push_back(p_xml_input_file); p_xml_input_file->setAutoRemove(false); @@ -151,7 +152,7 @@ void TandemCondorProcess::run() { delete p_xml_out; - *p_out << "Arguments = \"" << QFileInfo( p_xml_input_file->fileName()).absolutePath() << "\"" << endl; + *p_out << "Arguments = " << QFileInfo( p_xml_input_file->fileName()).absoluteFilePath() << endl; *p_out << "Queue" << endl; } else { @@ -169,9 +170,9 @@ void TandemCondorProcess::run() { delete p_out; } - + //now run condor job on submit_file - + QStringList arguments; @@ -179,6 +180,7 @@ void TandemCondorProcess::run() { QProcess * condor_process = new QProcess(); //hk_process->setWorkingDirectory(QFileInfo(_hardklor_exe).absolutePath()); + qDebug() << "TandemCondorProcess::run command " << _condor_submit_command << " " << arguments.join(" "); condor_process->start(_condor_submit_command, arguments); @@ -186,10 +188,36 @@ void TandemCondorProcess::run() { throw pappso::PappsoException(QObject::tr("HTCondor X!Tandem process failed to start")); } - while(condor_process->waitForReadyRead(_max_xt_time_ms)) { - _p_monitor->appendText( condor_process->readAll().data()); - //data.append(xt_process->readAll()); + if (!condor_process->waitForFinished(_max_xt_time_ms)) { + throw pappso::PappsoException(QObject::tr("HTCondor X!Tandem process failed to finish")); + } + + QString perr = condor_process->readAllStandardError(); + if (perr.length()) { + + qDebug() << "TandemCondorProcess::run readAllStandardError " << perr; + throw pappso::PappsoException(QObject::tr("HTCondor X!Tandem process failed :\n%1").arg(perr)); + } + else { + qDebug() << "TandemCondorProcess::run readAllStandardError OK " << perr; + } + + QString pjob = condor_process->readAllStandardOutput(); + if (pjob.length()) { + qDebug() << "TandemCondorProcess::run readAllStandardOutput OK " << pjob; + } + else { + qDebug() << "TandemCondorProcess::run readAllStandardOutput " << pjob; + throw pappso::PappsoException(QObject::tr("HTCondor X!Tandem process failed :\n%1").arg(pjob)); } + + //Submitting job(s).\n1 job(s) submitted to cluster 29.\n + parseCondorJobNumber(pjob); + + _p_monitor->setProgressMaximumValue(_condor_job_size); + qDebug() << "TandemCondorProcess::run job=" << _condor_cluster_number << " size=" << _condor_job_size; + + /* if (!xt_process->waitForFinished(_max_xt_time_ms)) { throw pappso::PappsoException(QObject::tr("can't wait for X!Tandem process to finish : timeout at %1").arg(_max_xt_time_ms)); @@ -199,6 +227,7 @@ void TandemCondorProcess::run() { QProcess::ExitStatus Status = condor_process->exitStatus(); + qDebug() << "TandemCondorProcess::run ExitStatus " << Status << result.data(); if (Status != 0) { // != QProcess::NormalExit @@ -206,6 +235,177 @@ void TandemCondorProcess::run() { } delete condor_process; - - qDebug() << "TandeCondorProcess::run end" ; + + + //condor is running job : we have to survey condor job using "condor_q -xml _condor_cluster_number" + + surveyCondorJob(); + + qDebug() << "TandemCondorProcess::run end" ; } + +void TandemCondorProcess::surveyCondorJob() { + /* + package fr.inra.pappso.xtandempipeline.sax_parse; + + import org.apache.log4j.Logger; + import org.xml.sax.Attributes; + import org.xml.sax.SAXException; + + import fr.inra.pappso.xtandempipeline.MsException.MSMSException; + import fr.inra.pappso.xtandempipeline.thread.XtandemCondorAnalysis; + + public class HandlerHTCondorQueue extends SaxBaseHandler { + + private static final Logger logger = Logger + .getLogger(HandlerHTCondorQueue.class); + private Object inName; + private Integer currentProcId; + private Integer currentJobStatus; + private String currentRemoteHost; + private String currentLastRemoteHost; + private int junexpanded = 0; + private int jidle = 0; + private int jrunning = 0; + private int jremoved = 0; + private int jcompleted = 0; + private int jheld = 0; + private int jsubmission_error = 0; + private XtandemCondorAnalysis xtandemCondorAnalysis; + private boolean empty = true; + + public HandlerHTCondorQueue(XtandemCondorAnalysis xtandemCondorAnalysis) + throws MSMSException { + super(); + this.xtandemCondorAnalysis = xtandemCondorAnalysis; + } + + @Override + public void startDocument() throws SAXException { + this.empty = true; + } + + @Override + public void endDocument() throws SAXException { + int reallyCompletedJobs = 0; + if (this.empty) { + reallyCompletedJobs = xtandemCondorAnalysis.getCondorJobNumber(); + } else { + int totalJobs = junexpanded + jidle + jrunning + jremoved + + jcompleted + jheld + jsubmission_error; + int diffJobs = xtandemCondorAnalysis.getCondorJobNumber() + - totalJobs; + reallyCompletedJobs = jcompleted + diffJobs; + } + + xtandemCondorAnalysis.setJobCompleted(junexpanded, jidle, jrunning, + jremoved, reallyCompletedJobs, jheld, jsubmission_error); + + String statusMessage = "" + junexpanded + " unexpanded jobs\n"; + statusMessage += jidle + " idle jobs\n"; + statusMessage += jrunning + " running jobs\n"; + statusMessage += jremoved + " removed jobs\n"; + statusMessage += reallyCompletedJobs + " completed jobs\n"; + statusMessage += jheld + " held jobs\n"; + statusMessage += jsubmission_error + " submission_errors\n"; + + logger.debug(statusMessage); + xtandemCondorAnalysis.setStatusMessage(statusMessage); + + } + + // <c> + // <a n="ProcId"><i>0</i></a> + public void startElementc(String nameSpaceUri, Attributes attrs) { + this.empty = false; + currentProcId = null; + currentJobStatus = null; + currentRemoteHost = null; + currentLastRemoteHost = null; + + } + + public void startElementa(String nameSpaceUri, Attributes attrs) { + // logger.debug("startElementgroup begin"); + // <group label="performance parameters" type="parameters"> + this.inName = attrs.getValue("n"); + + } + + public void endElementi(String nameSpaceUri, String data) + throws MSMSException { + if (inName.equals("ProcId")) { + this.currentProcId = new Integer(data); + // logger.debug(currentProcId); + } else if (inName.equals("JobStatus")) { + // <a n="JobStatus"><i>2</i></a> + this.currentJobStatus = new Integer(data); + // logger.debug(currentProcId); + } + + } + + public void endElements(String nameSpaceUri, String data) + throws MSMSException { + if (inName.equals("RemoteHost")) { + // <a n="RemoteHost"><s>slot1@proteus3</s></a> + this.currentRemoteHost = data; + // logger.debug(currentProcId); + } else if (inName.equals("LastRemoteHost")) { + // <a n="LastRemoteHost"><s>slot1@proteus4</s></a> + this.currentLastRemoteHost = data; + // logger.debug(currentProcId); + } + + } + + public void endElementa(String nameSpaceUri, String data) { + this.inName = ""; + } + + public void endElementc(String nameSpaceUri, String data) + throws MSMSException { + /* + * 0 Unexpanded U 1 Idle I 2 Running R 3 Removed X 4 Completed C 5 Held + * H 6 Submission_err E + * + if (currentJobStatus == 0) { + this.junexpanded += 1; + } else if (currentJobStatus == 1) { + this.jidle += 1; + } else if (currentJobStatus == 2) { + this.jrunning += 1; + } else if (currentJobStatus == 3) { + this.jremoved += 1; + } else if (currentJobStatus == 4) { + this.jcompleted += 1; + } else if (currentJobStatus == 5) { + this.jheld += 1; + } else if (currentJobStatus == 6) { + this.jsubmission_error += 1; + } + + logger.debug("currentRemoteHost:" + this.currentRemoteHost + + " currentLastRemoteHost" + this.currentLastRemoteHost + " " + + currentJobStatus); + } + + } + */ +} + + +void TandemCondorProcess::parseCondorJobNumber(QString condor_job) { + // Submitting job(s)... + // 3 job(s) submitted to cluster 3. + QRegExp txt_submit("([0-9]*) job\\(s\\) submitted to cluster ([0-9]*)."); + + if (txt_submit.indexIn(condor_job, 0) != -1) { + _condor_cluster_number = txt_submit.cap(2).toUInt(); + _condor_job_size = txt_submit.cap(1).toUInt(); + } + else { + throw pappso::PappsoException(QObject::tr("unable to find HTCondor job numbers in %1").arg(condor_job)); + } +} + diff --git a/src/core/tandem_run/tandemcondorprocess.h b/src/core/tandem_run/tandemcondorprocess.h index 2747c2b5e779bbd70d55176e488efc0d0b63e611..2ebedea16e5f7b36db18294449bf9f92df553dad 100644 --- a/src/core/tandem_run/tandemcondorprocess.h +++ b/src/core/tandem_run/tandemcondorprocess.h @@ -41,9 +41,15 @@ public: virtual void prepareXmlDatabaseFile(); virtual void run(); +private : + void parseCondorJobNumber(QString condor_job); + void surveyCondorJob(); private: QTemporaryDir * _p_tmp_dir; QString _condor_submit_command; + + unsigned int _condor_cluster_number; + unsigned int _condor_job_size; }; diff --git a/src/gui/workerthread.cpp b/src/gui/workerthread.cpp index 75c13c08747f51f31c5978212baf0056b593fef7..265325d5a4f2317861b79290d010da1b41091295 100644 --- a/src/gui/workerthread.cpp +++ b/src/gui/workerthread.cpp @@ -38,6 +38,8 @@ #include "mainwindow.h" #include "project_view/projectwindow.h" #include "../core/tandem_run/tandembatchprocess.h" +#include "../core/tandem_run/tandemcondorprocess.h" +#include <QSettings> WorkerThread::WorkerThread(MainWindow * p_main_window) { @@ -51,10 +53,10 @@ WorkerThread::WorkerThread(MainWindow * p_main_window) connect(_p_work_monitor, &WorkMonitor::workerMessage, p_main_window,&MainWindow::doDisplayLoadingMessage); connect(_p_work_monitor, &WorkMonitor::workerMessagePercent, p_main_window,&MainWindow::doDisplayLoadingMessagePercent); connect(_p_work_monitor, &WorkMonitor::workerAppendText, p_main_window,&MainWindow::doWorkerAppendText); - + connect(p_main_window, &MainWindow::operateXpipFile, this,&WorkerThread::doXpipFileLoad); connect(this, &WorkerThread::projectReady, p_main_window,&MainWindow::doProjectReady); - + connect(p_main_window, &MainWindow::operateLoadingResults, this,&WorkerThread::doLoadingResults); connect(p_main_window, &MainWindow::operateRunningXtandem, this,&WorkerThread::doRunningXtandem); @@ -72,7 +74,7 @@ WorkerThread::WorkerThread(MainWindow * p_main_window) connect(p_main_window, &MainWindow::operateWritingOdsFile, this,&WorkerThread::doWritingOdsFile); connect(this, &WorkerThread::operationFailed, p_main_window,&MainWindow::doOperationFailed); connect(this, &WorkerThread::operationFinished, p_main_window,&MainWindow::doOperationFinished); - + #else // Qt4 code //worker message @@ -112,7 +114,7 @@ WorkerThread::WorkerThread(ProjectWindow * p_project_window) #if QT_VERSION >= 0x050000 // Qt5 code - + //worker message connect(_p_work_monitor, &WorkMonitor::workerMessage, p_project_window,&ProjectWindow::doDisplayLoadingMessage); connect(_p_work_monitor, &WorkMonitor::workerMessagePercent, p_project_window,&ProjectWindow::doDisplayLoadingMessagePercent); @@ -172,7 +174,7 @@ void WorkerThread::doXpipFileLoad(QString filename) { try { QFileInfo new_xpip_file(filename); emit loadingMessage(tr("loading XPIP file")); - qDebug() << "WorkerThread::doXpipFileLoad new_xpip_file "<< new_xpip_file.absoluteFilePath(); + qDebug() << "WorkerThread::doXpipFileLoad new_xpip_file "<< new_xpip_file.absoluteFilePath(); XpipFile xpip_file(new_xpip_file); ProjectSp project_sp = xpip_file.getProjectSp(_p_work_monitor); @@ -333,8 +335,17 @@ void WorkerThread::doRunningXtandem(TandemRunBatch tandem_run_batch) { emit loadingMessage(tr("Running X!Tandem, please wait")); qDebug() << "WorkerThread::doRunningXtandem tandem_run_batch " << tandem_run_batch._tandem_bin_path; - TandemBatchProcess xt_process (_p_work_monitor, tandem_run_batch); - xt_process.run(); + QSettings settings; + QString default_location = settings.value("condor/tmp_dir", "").toString(); + + if (default_location.isEmpty()) { + TandemBatchProcess xt_process (_p_work_monitor, tandem_run_batch); + xt_process.run(); + } + else { + TandemCondorProcess xt_process (_p_work_monitor, tandem_run_batch); + xt_process.run(); + } emit operationFinished(); }