// Constructeur
- BatchManager_Local::BatchManager_Local(const FactBatchManager * parent, const char * host,
- CommunicationProtocolType protocolType)
- : BatchManager(parent, host), _connect(0),
- _protocol(CommunicationProtocol::getInstance(protocolType)),
+ BatchManager_Local::BatchManager_Local(const Batch::FactBatchManager * parent, const char * host,
+ const char * username,
+ CommunicationProtocolType protocolType, const char * mpiImpl,
+ int nb_proc_per_node)
+ : BatchManager(parent, host, username, protocolType, mpiImpl), _connect(0),
_idCounter(0)
{
pthread_mutex_init(&_threads_mutex, NULL);
pthread_cond_destroy(&_threadSyncCondition);
}
- const CommunicationProtocol & BatchManager_Local::getProtocol() const
- {
- return _protocol;
- }
-
// Methode pour le controle des jobs : soumet un job au gestionnaire
const JobId BatchManager_Local::submitJob(const Job & job)
{
+ // export input files in the working directory of the execution host
+ exportInputFiles(job);
+
Job_Local jobLocal = job;
Id id = _idCounter++;
ThreadAdapter * p_ta = new ThreadAdapter(*this, job, id);
if (strlen(drive) > 0) exec_sub_cmd << drive << " && ";
#endif
- exec_sub_cmd << "cd " << param[WORKDIR] << " && " << param[EXECUTABLE];
+ string fileToExecute = param[EXECUTABLE].str();
+ string::size_type p1 = fileToExecute.find_last_of("/");
+ string fileNameToExecute = fileToExecute.substr(p1+1);
+
+ exec_sub_cmd << "cd " << param[WORKDIR] << " && ./" << fileNameToExecute;
if (param.find(ARGUMENTS) != param.end()) {
Versatile V = param[ARGUMENTS];
user = string(it->second);
}
- return _protocol.getExecCommandArgs(exec_sub_cmd.str(), param[EXECUTIONHOST], user);
+ return _protocol.getExecCommandArgs(exec_sub_cmd.str(), _hostname, user);
}
pthread_cleanup_push(BatchManager_Local::setFailedOnCancel, arg);
pthread_cleanup_push(BatchManager_Local::kill_child_on_exit, static_cast<void *> (&child));
-
- // Le code retour cumule (ORed) de tous les appels
- // Nul en cas de reussite de l'ensemble des operations
- int rc = 0;
-
- // Cette table contient la liste des fichiers a detruire a la fin du processus
- std::vector<string> files_to_delete;
-
-
-
- // On copie les fichiers d'entree pour le fils
- const Parametre param = p_ta->_job.getParametre();
- Parametre::const_iterator it;
-
- // On initialise la variable workdir a la valeur du Current Working Directory
- char * cwd =
-#ifdef WIN32
- _getcwd(NULL, 0);
-#else
- new char [PATH_MAX];
- getcwd(cwd, PATH_MAX);
-#endif
- string workdir = cwd;
- delete [] cwd;
-
- if ( (it = param.find(WORKDIR)) != param.end() ) {
- workdir = static_cast<string>( (*it).second );
- }
-
- string executionhost = string(param[EXECUTIONHOST]);
- string user;
- if ( (it = param.find(USER)) != param.end() ) {
- user = string(it->second);
- }
-
- if ( (it = param.find(INFILE)) != param.end() ) {
- Versatile V = (*it).second;
- Versatile::iterator Vit;
-
- for(Vit=V.begin(); Vit!=V.end(); Vit++) {
- CoupleType cpt = *static_cast< CoupleType * >(*Vit);
- Couple cp = cpt;
- string local = cp.getLocal();
- string remote = cp.getRemote();
-
- std::cerr << workdir << std::endl;
- std::cerr << remote << std::endl;
-
- int status = p_ta->getBatchManager().getProtocol().copyFile(local, "", "",
- workdir + "/" + remote,
- executionhost, user);
- if (status) {
- // Echec de la copie
- rc |= 1;
- } else {
- // On enregistre le fichier comme etant a detruire
- files_to_delete.push_back(workdir + "/" + remote);
- }
-
- }
- }
-
-
-
-
// On forke/exec un nouveau process pour pouvoir controler le fils
// (plus finement qu'avec un appel system)
// int rc = system(commande.c_str());
}
#endif
-
- // On copie les fichiers de sortie du fils
- if ( (it = param.find(OUTFILE)) != param.end() ) {
- Versatile V = (*it).second;
- Versatile::iterator Vit;
-
- for(Vit=V.begin(); Vit!=V.end(); Vit++) {
- CoupleType cpt = *static_cast< CoupleType * >(*Vit);
- Couple cp = cpt;
- string local = cp.getLocal();
- string remote = cp.getRemote();
-
- int status = p_ta->getBatchManager().getProtocol().copyFile(workdir + "/" + remote,
- executionhost, user,
- local, "", "");
- if (status) {
- // Echec de la copie
- rc |= 1;
- } else {
- // On enregistre le fichier comme etant a detruire
- files_to_delete.push_back(workdir + "/" + remote);
- }
-
- }
- }
-
- // On efface les fichiers d'entree et de sortie du fils si les copies precedentes ont reussi
- // ou si la creation du fils n'a pu avoir lieu
- if ( (rc == 0) || (child < 0) ) {
- std::vector<string>::const_iterator it;
- for(it=files_to_delete.begin(); it!=files_to_delete.end(); it++) {
- p_ta->getBatchManager().getProtocol().removeFile(*it, executionhost, user);
-/* string remove_cmd = p_ta->getBatchManager().remove_command(user, executionhost, *it);
- UNDER_LOCK( cout << "Removing : " << remove_cmd << endl );
-#ifdef WIN32
- remove_cmd = string("\"") + remove_cmd + string("\"");
-#endif
- system(remove_cmd.c_str());*/
- }
- }
-
pthread_mutex_lock(&p_ta->_bm._threads_mutex);
// Set the job state to FINISHED or FAILED