Skip to content

Add checks for libevent.so conflict with LSF #7698

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 5 commits into from
May 19, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
75 changes: 74 additions & 1 deletion config/orte_check_lsf.m4
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ dnl Copyright (c) 2015 Research Organization for Information Science
dnl and Technology (RIST). All rights reserved.
dnl Copyright (c) 2016 Los Alamos National Security, LLC. All rights
dnl reserved.
dnl Copyright (c) 2017 IBM Corporation. All rights reserved.
dnl Copyright (c) 2017-2020 IBM Corporation. All rights reserved.
dnl $COPYRIGHT$
dnl
dnl Additional copyrights may follow
Expand Down Expand Up @@ -120,6 +120,79 @@ AC_DEFUN([ORTE_CHECK_LSF],[
[orte_check_lsf_happy="yes"],
[orte_check_lsf_happy="no"])])


# Some versions of LSF ship with a libevent.so in their library path.
# This is _not_ a copy of Libevent, but something specific to their project.
# The Open MPI components should not need to link against LSF's libevent.so
# However, the presence of it in the linker search path can cause a problem
# if there is a system installed Libevent and Open MPI chooses the 'external'
# event component prior to this stage.
#
# Add a check here to see if we are in a scenario where the two are conflicting.
# In which case the earlier checks for successful compile of an LSF program will
# have failed with messages like:
# lib64/libevent_pthreads.so: undefined reference to `evthread_set_condition_callbacks'
# lib64/libevent_pthreads.so: undefined reference to `event_mm_malloc_'
# lib64/libevent_pthreads.so: undefined reference to `event_mm_free_'
# lib64/libevent_pthreads.so: undefined reference to `evthread_set_id_callback'
# lib64/libevent_pthreads.so: undefined reference to `evthread_set_lock_callbacks'
# Because it picked up -levent from LSF, but -levent_pthreads from Libevent.
#
# So look for a function that libevent_pthreads is looking for from libevent.so.
# If it does appears then we have the correct libevent.so, otherwise then we picked
# up the LSF version and a conflict has been detected.
# If the external libevent component used 'event_core' instead of 'event'
orte_check_lsf_event_conflict=na
# Split libs into an array, see if -levent is in that list
orte_check_lsf_libevent_present=`echo "$LIBS" | awk '{split([$]0, a, " "); {for (k in a) {if (a[[k]] == "-levent") {print a[[k]]}}}}' | wc -l | tr -d '[[:space:]]'`
# (1) LSF check must have failed above. We need to know why...
AS_IF([test "$orte_check_lsf_happy" = "no"],
[# (2) If there is a -levent in the $LIBS then that might be the problem
AS_IF([test "$opal_event_external_support" = "yes" && test "$orte_check_lsf_libevent_present" != "0"],
[AS_IF([test "$orte_check_lsf_libdir" = "" ],
[],
[LDFLAGS="$LDFLAGS -L$orte_check_lsf_libdir"])
# Note that we do not want to set LIBS here to include -llsf since
# the check is not for an LSF library, but for the conflict with
# LDFLAGS.
# (3) Check to see if the -levent is from Libevent (check for a symbol it has)
AC_CHECK_LIB([event], [evthread_set_condition_callbacks],
[AC_MSG_CHECKING([for libevent conflict])
AC_MSG_RESULT([No. The correct libevent.so was linked.])
orte_check_lsf_event_conflict=no],
[# (4) The libevent.so is not from Libevent. Warn the user.
AC_MSG_CHECKING([for libevent conflict])
AC_MSG_RESULT([Yes. Detected a libevent.so that is not from Libevent.])
orte_check_lsf_event_conflict=yes])
],
[AC_MSG_CHECKING([for libevent conflict])
AC_MSG_RESULT([No. Internal Libevent or libevent_core is being used.])
orte_check_lsf_event_conflict=na])],
[AC_MSG_CHECKING([for libevent conflict])
AC_MSG_RESULT([No. LSF checks passed.])
orte_check_lsf_event_conflict=na])

AS_IF([test "$orte_check_lsf_event_conflict" = "yes"],
[AC_MSG_WARN([===================================================================])
AC_MSG_WARN([Conflicting libevent.so libraries detected on the system.])
AC_MSG_WARN([])
AC_MSG_WARN([A system-installed Libevent library was detected and the Open MPI])
AC_MSG_WARN([build system chose to use the 'external' component expecting to])
AC_MSG_WARN([link against the Libevent in the linker search path.])
AC_MSG_WARN([If LSF is present on the system and in the default search path then])
AC_MSG_WARN([it _may be_ the source of the conflict.])
AC_MSG_WARN([LSF provides a libevent.so that is not from Libevent in its])
AC_MSG_WARN([library path. At this point the linker is attempting to resolve])
AC_MSG_WARN([Libevent symbols using the LSF library because of the lack of])
AC_MSG_WARN([an explicit linker path pointing to the system-installed Libevent.])
AC_MSG_WARN([])
AC_MSG_WARN([To resolve this issue either (A) explicitly pass the Libevent])
AC_MSG_WARN([library path on the configure line (--with-libevent-libdir), or])
AC_MSG_WARN([(B) use the internal libevent by requesting it from configure ])
AC_MSG_WARN([with the --with-libevent=internal option.])
AC_MSG_WARN([===================================================================])
])

CPPFLAGS="$orte_check_lsf_$1_save_CPPFLAGS"
LDFLAGS="$orte_check_lsf_$1_save_LDFLAGS"
LIBS="$orte_check_lsf_$1_save_LIBS"
Expand Down
36 changes: 33 additions & 3 deletions opal/mca/event/external/configure.m4
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
# and Technology (RIST). All rights reserved.
#
# Copyright (c) 2017-2018 Intel, Inc. All rights reserved.
# Copyright (c) 2020 IBM Corporation. All rights reserved.
# $COPYRIGHT$
#
# Additional copyrights may follow
Expand Down Expand Up @@ -107,20 +108,49 @@ AC_DEFUN([MCA_opal_event_external_CONFIG],[

OPAL_CHECK_PACKAGE([opal_event_external],
[event2/event.h],
[event],
[event_core],
[event_config_new],
[-levent_pthreads],
[$opal_event_dir],
[$opal_event_libdir],
[opal_event_external_support=yes],
[opal_event_external_support=no])

# Check to see if the above check failed because it conflicted with LSF's libevent.so
# This can happen if LSF's library is in the LDFLAGS envar or default search
# path. The 'event_getcode4name' function is only defined in LSF's libevent.so and not
# in Libevent's libevent.so
AS_IF([test "$opal_event_external_support" = "no"],
[AC_CHECK_LIB([event], [event_getcode4name],
[AC_MSG_WARN([===================================================================])
AC_MSG_WARN([Possible conflicting libevent.so libraries detected on the system.])
AC_MSG_WARN([])
AC_MSG_WARN([LSF provides a libevent.so that is not from Libevent in its])
AC_MSG_WARN([library path. It is possible that you have installed Libevent])
AC_MSG_WARN([on the system, but the linker is picking up the wrong version.])
AC_MSG_WARN([])
AC_MSG_WARN([Configure may continue and attempt to use the 'internal' libevent])
AC_MSG_WARN([instead of the 'external' libevent if you did not explicitly request])
AC_MSG_WARN([the 'external' component.])
AC_MSG_WARN([])
AC_MSG_WARN([If your intention was to use the 'external' libevent then you need])
AC_MSG_WARN([to address this linker path ordering issue. One way to do so is])
AC_MSG_WARN([to make sure the libevent system library path occurs before the])
AC_MSG_WARN([LSF library path.])
AC_MSG_WARN([===================================================================])
opal_event_external_support=no
])
])

AS_IF([test "$opal_event_external_support" = "yes"],
[LDFLAGS="$opal_event_external_LDFLAGS $LDFLAGS"
CPPFLAGS="$opal_event_external_CPPFLAGS $CPPFLAGS"])

AS_IF([test "$opal_event_external_support" = "yes"],
[# Ensure that this libevent has the symbol
# "evthread_set_lock_callbacks", which will only exist if
# libevent was configured with thread support.
LIBS="$opal_event_external_LDFLAGS $LIBS"
AC_CHECK_LIB([event], [evthread_set_lock_callbacks],
AC_CHECK_LIB([event_core], [evthread_set_lock_callbacks],
[],
[AC_MSG_WARN([External libevent does not have thread support])
AC_MSG_WARN([Open MPI requires libevent to be compiled with])
Expand Down