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