I have a *BIG DOUBT* about this approach. The problem will lead to some really strange situations, as we change the LD_LIBRARY_PATH of a process in the middle of the run. As a result the place from where we load dynamic libraries before and after this call will potentially became different.

It looks to me that the correct fix should set the PATH and LD_LIBRARY_PATH only after the fork that will execve the child process and not before. So, instead of having this code in the orterun, we should have it in the ODLS ... But then the ODLS will have to different behaviors: the case where the ODLS inherit the environment from the orted [and then everything is already correctly set because the orted did it] and the case it inherit the environment from the orterun [and where the PATH and LD_LIBRARY_PATH are not yet set].

  george.


On Jul 19, 2007, at 3:00 PM, r...@osl.iu.edu wrote:

Author: rhc
Date: 2007-07-19 15:00:06 EDT (Thu, 19 Jul 2007)
New Revision: 15516
URL: https://svn.open-mpi.org/trac/ompi/changeset/15516

Log:
Ensure that the LD_LIBRARY_PATH and PATH get properly set for procs locally spawned by mpirun.

Text files modified:
trunk/orte/tools/orterun/orterun.c | 55 ++++++++++++++++++++++ +++++++++++++++--
   1 files changed, 52 insertions(+), 3 deletions(-)

Modified: trunk/orte/tools/orterun/orterun.c
====================================================================== ========
--- trunk/orte/tools/orterun/orterun.c  (original)
+++ trunk/orte/tools/orterun/orterun.c 2007-07-19 15:00:06 EDT (Thu, 19 Jul 2007)
@@ -22,6 +22,8 @@
  */

 #include "orte_config.h"
+#include "orte/orte_constants.h"
+

 #include <stdio.h>
 #ifdef HAVE_UNISTD_H
@@ -61,8 +63,7 @@

 #include "opal/version.h"
 #include "opal/runtime/opal.h"
-
-#include "orte/orte_constants.h"
+#include "opal/util/os_path.h"

 #include "orte/class/orte_pointer_array.h"
 #include "orte/util/proc_info.h"
@@ -351,7 +352,6 @@

     /* Setup MCA params */

-
     /* Check for some "global" command line params */
     parse_globals(argc, argv, &cmd_line);
     OBJ_DESTRUCT(&cmd_line);
@@ -400,6 +400,55 @@
         return rc;
     }

+    /* If we have a prefix, then modify the PATH and
+        LD_LIBRARY_PATH environment variables in our copy. This
+        will ensure that any locally-spawned children will
+        have our executables and libraries in their path
+
+ For now, default to the prefix_dir provided in the first app_context. + Since there always MUST be at least one app_context, we are safe in
+        doing this.
+    */
+    if (NULL != apps[0]->prefix_dir) {
+        char *oldenv, *newenv, *lib_base, *bin_base;
+
+        lib_base = opal_basename(opal_install_dirs.libdir);
+        bin_base = opal_basename(opal_install_dirs.bindir);
+
+        /* Reset PATH */
+ newenv = opal_os_path( false, apps[0]->prefix_dir, bin_base, NULL );
+        oldenv = getenv("PATH");
+        if (NULL != oldenv) {
+            char *temp;
+            asprintf(&temp, "%s:%s", newenv, oldenv );
+            free( newenv );
+            newenv = temp;
+        }
+        opal_setenv("PATH", newenv, true, &orte_launch_environ);
+        if (orte_debug_flag) {
+ opal_output(0, "%s: reset PATH: %s", orterun_basename, newenv);
+        }
+        free(newenv);
+        free(bin_base);
+
+        /* Reset LD_LIBRARY_PATH */
+ newenv = opal_os_path( false, apps[0]->prefix_dir, lib_base, NULL );
+        oldenv = getenv("LD_LIBRARY_PATH");
+        if (NULL != oldenv) {
+            char* temp;
+            asprintf(&temp, "%s:%s", newenv, oldenv);
+            free(newenv);
+            newenv = temp;
+        }
+ opal_setenv("LD_LIBRARY_PATH", newenv, true, &orte_launch_environ);
+        if (orte_debug_flag) {
+            opal_output(0, "%s: reset LD_LIBRARY_PATH: %s",
+                        orterun_basename, newenv);
+        }
+        free(newenv);
+        free(lib_base);
+    }
+
/* since we are a daemon, we should *always* yield the processor when idle */
     opal_progress_set_yield_when_idle(true);

_______________________________________________
svn mailing list
s...@open-mpi.org
http://www.open-mpi.org/mailman/listinfo.cgi/svn

Reply via email to