Skip to content
Permalink
Browse files
MDEV-16676 Using malloc-lib=jemalloc in MariaDB 10.2 causes non-criti…
…cal error about missing mysql_config on startup

- This commit is based on patch 84fe972 and suggestion of
Jean Weisbuch to use `ldconfig -p`
- Format of ldconfig output:
"libjemalloc.so.1 (libc6,x86-64) => /usr/lib/x86_64-linux-gnu/libjemalloc.so.1"

```
$ ./scripts/mysqld_safe
201013 13:36:50 mysqld_safe Adding '/usr/lib/x86_64-linux-gnu/libjemalloc.so.1' to LD_PRELOAD for mysqld
201013 13:36:50 mysqld_safe Logging to '/home/anel/builds/data-10.5/mysqld_safe_anel.err'.
201013 13:36:50 mysqld_safe Starting mysqld daemon with databases from /home/anel/builds/data-10.5
```
Reviewed by: Daniel Black, Faustin Lammler
  • Loading branch information
an3l committed Oct 17, 2020
1 parent db02c45 commit 95bb3cb
Showing 1 changed file with 19 additions and 35 deletions.
@@ -456,54 +456,39 @@ mysqld_ld_preload_text() {
echo "$text"
}


mysql_config=
get_mysql_config() {
if [ -z "$mysql_config" ]; then
mysql_config=`echo "$0" | sed 's,/[^/][^/]*$,/mysql_config,'`
if [ ! -x "$mysql_config" ]; then
log_error "Can not run mysql_config $@ from '$mysql_config'"
exit 1
fi
fi

"$mysql_config" "$@"
}


# set_malloc_lib LIB
# - If LIB is empty, do nothing and return
# - If LIB starts with 'tcmalloc' or 'jemalloc', look for the shared library in
# /usr/lib, /usr/lib64 and then pkglibdir.
# - If LIB starts with 'tcmalloc' or 'jemalloc', look for the shared library
# using `ldconfig`.
# tcmalloc is part of the Google perftools project.
# - If LIB is an absolute path, assume it is a malloc shared library
#
# Put LIB in mysqld_ld_preload, which will be added to LD_PRELOAD when
# running mysqld. See ld.so for details.
set_malloc_lib() {
malloc_lib="$1"

if expr "$malloc_lib" : "\(tcmalloc\|jemalloc\)" > /dev/null ; then
pkglibdir=`get_mysql_config --variable=pkglibdir`
where=''
# This list is kept intentionally simple. Simply set --malloc-lib
# to a full path if another location is desired.
for libdir in /usr/lib /usr/lib64 "$pkglibdir" "$pkglibdir/mysql"; do
tmp=`echo "$libdir/lib$malloc_lib.so".[0-9]`
where="$where $libdir"
# log_notice "DEBUG: Checking for malloc lib '$tmp'"
[ -r "$tmp" ] || continue
malloc_lib="$tmp"
where=''
break
done
if ! my_which ldconfig > /dev/null 2>&1
then
log_error "ldconfig command not found, required for ldconfig -p"
exit 1
fi
# format from ldconfig:
# "libjemalloc.so.1 (libc6,x86-64) => /usr/lib/x86_64-linux-gnu/libjemalloc.so.1"
libmalloc_path="$(ldconfig -p | sed -n "/lib${malloc_lib}/p" | cut -d '>' -f2)"

if [ -n "$where" ]; then
log_error "no shared library for lib$malloc_lib.so.[0-9] found in$where"
if [ -z "$libmalloc_path" ]; then
log_error "no shared library for lib$malloc_lib.so.[0-9] found."
exit 1
fi
fi

for f in $libmalloc_path; do
if [ -f "$f" ]; then
malloc_lib=$f # get the first path if many
break
fi
done
fi
# Allow --malloc-lib='' to override other settings
[ -z "$malloc_lib" ] && return

@@ -520,7 +505,6 @@ set_malloc_lib() {
exit 1
;;
esac

add_mysqld_ld_preload "$malloc_lib"
}

0 comments on commit 95bb3cb

Please sign in to comment.