enter_chroot: speed up entering by backgrounding locale generation
Half of the current time is spent on calling locale-gen even when there is
nothing to be done (all locales already generated). Throw it into the bg
to unblock the main thread.
BUG=None
TEST=`cros_sdk` still works
TEST=`LANG=et_EE.UTF-8 cros_sdk` generates the new locale in the background
Change-Id: Ibe9a07bec60a59cab1cf4230358f7f8ff5b21c2e
Reviewed-on: https://gerrit.chromium.org/gerrit/58041
Reviewed-by: David James <davidjames@chromium.org>
Commit-Queue: Mike Frysinger <vapier@chromium.org>
Tested-by: Mike Frysinger <vapier@chromium.org>
diff --git a/sdk_lib/enter_chroot.sh b/sdk_lib/enter_chroot.sh
index ab5946d..56f073b 100755
--- a/sdk_lib/enter_chroot.sh
+++ b/sdk_lib/enter_chroot.sh
@@ -195,6 +195,38 @@
fi
}
+generate_locales() {
+ # Make sure user's requested locales are available
+ # http://crosbug.com/19139
+ # And make sure en_US{,.UTF-8} are always available as
+ # that what buildbot forces internally
+ local l locales gen_locales=()
+
+ locales=$(printf '%s\n' en_US en_US.UTF-8 ${LANG} \
+ $LC_{ADDRESS,ALL,COLLATE,CTYPE,IDENTIFICATION,MEASUREMENT,MESSAGES} \
+ $LC_{MONETARY,NAME,NUMERIC,PAPER,TELEPHONE,TIME} | \
+ sort -u | sed '/^C$/d')
+ for l in ${locales}; do
+ if [[ ${l} == *.* ]]; then
+ enc=${l#*.}
+ else
+ enc="ISO-8859-1"
+ fi
+ case $(echo ${enc//-} | tr '[:upper:]' '[:lower:]') in
+ utf8) enc="UTF-8";;
+ esac
+ gen_locales+=("${l} ${enc}")
+ done
+ if [[ ${#gen_locales[@]} -gt 0 ]] ; then
+ # Force LC_ALL=C to workaround slow string parsing in bash
+ # with long multibyte strings. Newer setups have this fixed,
+ # but locale-gen doesn't need to be run in any locale in the
+ # first place, so just go with C to keep it fast.
+ chroot "${FLAGS_chroot}" env LC_ALL=C locale-gen -q -u \
+ -G "$(printf '%s\n' "${gen_locales[@]}")"
+ fi
+}
+
setup_env() {
(
flock 200
@@ -219,6 +251,9 @@
fi
fi
+ # Do this early as it's slow and only needs basic mounts (above).
+ generate_locales &
+
setup_mount "${FLAGS_trunk}" "--rbind" "${CHROOT_TRUNK_DIR}"
debug "Setting up referenced repositories if required."
@@ -400,35 +435,6 @@
done
promote_api_keys
- # Make sure user's requested locales are available
- # http://crosbug.com/19139
- # And make sure en_US{,.UTF-8} are always available as
- # that what buildbot forces internally
- locales=$(printf '%s\n' en_US en_US.UTF-8 ${LANG} \
- $LC_{ADDRESS,ALL,COLLATE,CTYPE,IDENTIFICATION,MEASUREMENT,MESSAGES} \
- $LC_{MONETARY,NAME,NUMERIC,PAPER,TELEPHONE,TIME} | \
- sort -u | sed '/^C$/d')
- gen_locales=()
- for l in ${locales}; do
- if [[ ${l} == *.* ]]; then
- enc=${l#*.}
- else
- enc="ISO-8859-1"
- fi
- case $(echo ${enc//-} | tr '[:upper:]' '[:lower:]') in
- utf8) enc="UTF-8";;
- esac
- gen_locales=("${gen_locales[@]}" "${l} ${enc}")
- done
- if [[ ${#gen_locales[@]} -gt 0 ]] ; then
- # Force LC_ALL=C to workaround slow string parsing in bash
- # with long multibyte strings. Newer setups have this fixed,
- # but locale-gen doesn't need to be run in any locale in the
- # first place, so just go with C to keep it fast.
- chroot "$FLAGS_chroot" env LC_ALL=C locale-gen -q -u \
- -G "$(printf '%s\n' "${gen_locales[@]}")"
- fi
-
# Fix permissions on shared memory to allow non-root users access to POSIX
# semaphores.
chmod -R 777 "${FLAGS_chroot}/dev/shm"