Salome HOME
Number of procs per node is now a job parameter instead of a BatchManager attribute
[tools/libbatch.git] / src / Local / Batch_BatchManager_Local.cxx
index 2098e1c91d8abe6520b81151cbcfcbf18ff7440b..8ca72e476f27e8b55aa889b72b55d1f244110deb 100644 (file)
@@ -62,10 +62,10 @@ namespace Batch {
 
 
   // 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)
+    : BatchManager(parent, host, username, protocolType, mpiImpl), _connect(0),
       _idCounter(0)
   {
     pthread_mutex_init(&_threads_mutex, NULL);
@@ -90,14 +90,12 @@ namespace Batch {
     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);
@@ -283,7 +281,11 @@ namespace Batch {
     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];
@@ -320,7 +322,7 @@ namespace Batch {
       user = string(it->second);
     }
 
-    return _protocol.getExecCommandArgs(exec_sub_cmd.str(), param[EXECUTIONHOST], user);
+    return _protocol.getExecCommandArgs(exec_sub_cmd.str(), _hostname, user);
   }
 
 
@@ -359,71 +361,6 @@ namespace Batch {
     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());
@@ -445,47 +382,6 @@ namespace Batch {
     }
 #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