From ee6224acf93eee2d157e35fcd2789a0dd9519ba3 Mon Sep 17 00:00:00 2001 From: Manav Sanghavi Date: Tue, 14 Jul 2026 13:32:49 -0700 Subject: [PATCH 1/2] feat(startup_scripts): add looker21 script for JDK 21 support Add a new startup script `looker21` specifically for running Looker on JDK 21. This script: - Enforces JDK 21 version check. - Adds JVM flags required for JRuby compatibility on JDK 21: - `--add-opens=java.base/sun.nio.ch=ALL-UNNAMED` - `--add-opens=java.base/java.io=ALL-UNNAMED` - `--add-opens=java.base/java.nio=ALL-UNNAMED` - Removes obsolete Nashorn flags. This allows on-premise customers to transition to JDK 21. --- startup_scripts/looker21 | 166 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 166 insertions(+) create mode 100755 startup_scripts/looker21 diff --git a/startup_scripts/looker21 b/startup_scripts/looker21 new file mode 100755 index 0000000..953bf00 --- /dev/null +++ b/startup_scripts/looker21 @@ -0,0 +1,166 @@ +#!/bin/sh + +# +# This is the startup script for Looker using OpenJDK 21. Looker supports +# OpenJDK 21 starting with the 26.4 release +# + +JAVA_VER=$(java -version 2>&1 | grep 'version "' | head -1 | cut -d'"' -f2 | sed '/^1\./s///' | cut -d'.' -f1) +if [ "$JAVA_VER" -ne 21 ]; then + WHERE=`which java` + echo "This script runs with OpenJDK 21, your executable $WHERE has Java major version $JAVA_VER" + exit 1 +fi + +cd $HOME/looker +# set your java memory- there should be over 1.5G of system memory +# left to run the OS +MEM=`cat /proc/meminfo | grep MemTotal | awk '{print $2}'` +JM=`expr $MEM \* 6 / 10` +JAVAMEM="${JM}k" +METAMEM="800m" + +# Extra Java startup args and Looker startup args. These can also be set in +# a file named lookerstart.cfg +JMXARGS="-Dcom.sun.akuma.jvmarg.com.sun.management.jmxremote -Dcom.sun.akuma.jvmarg.com.sun.management.jmxremote.port=9910 -Dcom.sun.akuma.jvmarg.com.sun.management.jmxremote.ssl=false -Dcom.sun.akuma.jvmarg.com.sun.management.jmxremote.local.only=false -Dcom.sun.akuma.jvmarg.com.sun.management.jmxremote.authenticate=true -Dcom.sun.akuma.jvmarg.com.sun.management.jmxremote.access.file=${HOME}/.lookerjmx/jmxremote.access -Dcom.sun.akuma.jvmarg.com.sun.management.jmxremote.password.file=${HOME}/.lookerjmx/jmxremote.password" + +# Starting with JDK9 some reflective accesses log warning messages, these java +# args increase module visibility and so suppress the output +REFLECTIVE_ACCESS_ARGS="--add-opens java.base/java.lang=ALL-UNNAMED --add-opens java.base/java.math=ALL-UNNAMED --add-opens java.base/java.util=ALL-UNNAMED --add-opens java.base/java.util.concurrent=ALL-UNNAMED --add-opens java.base/java.net=ALL-UNNAMED --add-opens java.base/java.text=ALL-UNNAMED" + +# JVM flags for JDK 21 module visibility (primarily for JRuby compatibility) +JDK21_MODULE_ARGS="--add-opens=java.base/sun.nio.ch=ALL-UNNAMED --add-opens=java.base/java.io=ALL-UNNAMED --add-opens=java.base/java.nio=ALL-UNNAMED" + +# to set up JMX monitoring, add JMXARGS to JAVAARGS +JAVAARGS="" +LOOKERARGS="--force-gcm-encryption" + +# check for a lookerstart.cfg file to set JAVAARGS and LOOKERARGS +if [ -r ./lookerstart.cfg ]; then + . ./lookerstart.cfg +fi + +# check if --no-ssl is specified in LOOKERARGS and set protocol accordingly +PROTOCOL="" + +echo "${LOOKERARGS}" | grep -q "\-\-no\-ssl" +if [ $? -eq 0 ] +then + PROTOCOL='http' +else + PROTOCOL='https' +fi +LOOKERPORT=${LOOKERPORT:-"9999"} + +start() { + if [ -e .deploying ]; then + echo "Startup suppressed: ${PWD}/.deploying file exists. Remove .deploying file to allow startup" + exit 1 + fi + + LOCKFILE=.starting + if [ -e ${LOCKFILE} ] && kill -0 `cat ${LOCKFILE}`; then + echo "Startup suppressed: ${LOCKFILE} contains running pid, startup script is already running" + exit 1 + fi + + # make sure the lockfile is removed when we exit and then claim it + trap "rm -f ${LOCKFILE}; exit" INT TERM EXIT + echo $$ > ${LOCKFILE} + + fixcrypt + java \ + -XX:+UseG1GC -XX:MaxGCPauseMillis=2000 -XX:MaxMetaspaceSize=$METAMEM \ + -Xms$JAVAMEM -Xmx$JAVAMEM \ + -Xlog:gc*,gc+ref=debug,gc+heap=debug,gc+age=debug:file=/tmp/gc-%p-%t.log:tags,uptime,time,level:filecount=7,filesize=10m \ + ${REFLECTIVE_ACCESS_ARGS} \ + ${JDK21_MODULE_ARGS} \ + ${JAVAARGS} \ + -jar looker.jar start ${LOOKERARGS} + + if [ -x ./tunnel ]; then + ./tunnel start + fi + + rm -f ${LOCKFILE} +} + +stop() { + pid=`cat .tmp/looker.pid` + if [ -f .status_server_token ] && [ -x /usr/bin/curl ]; then + state="running" + token=`cat .status_server_token` + request="control/stop?token=${token}" + timeout 20 curl -m 10 -ks ${PROTOCOL}://127.0.0.1:${LOOKERPORT}/${request} > /dev/null 2>&1 + ECODE=$? + [ $ECODE -eq 7 ] && state="stopped" + if [ $ECODE -gt 7 ] ; then + kill $pid + fi + for i in {1..30}; do + timeout 20 curl -m 5 -ks ${PROTOCOL}://127.0.0.1:${LOOKERPORT}/alive > /dev/null 2>&1 + ECODE=$? + if [ $ECODE -eq 7 ]; then + state="stopped" + break + fi + if [ $ECODE -gt 7 ] ; then + kill -9 $pid + fi + sleep 1 + done + if [ "${state}" = "running" ]; then + echo "Force Stop Looker Web Application" + kill $pid + kill -0 $pid && kill -9 $pid + fi + else + timeout 20 java -jar looker.jar stop + if [ $? -ne 0 ]; then + kill -9 $pid + fi + fi +} + +fixcrypt() { + CRYPTEXIST=`/sbin/ldconfig -p | grep -c '\slibcrypt.so\s'` + + if [ $CRYPTEXIST -eq 0 ]; then + if [ ! -d .tmp ]; then + mkdir .tmp + fi + CRYPTLN=`/sbin/ldconfig -p | grep '\slibcrypt\.so\.[[:digit:]]' | awk '{print $(NF)}'` + ln -s -f $CRYPTLN `pwd`/.tmp/libcrypt.so + export LD_LIBRARY_PATH=`pwd`/.tmp/:$LD_LIBRARY_PATH + fi +} + +case "$1" in + start) + start + ;; + stop) + stop + ;; + restart) + echo "Restarting Looker Web Application" "looker" + stop + sleep 3 + start + ;; + status) + curl -ks ${PROTOCOL}://127.0.0.1:${LOOKERPORT}/alive > /dev/null 2>&1 + if [ $? -eq 7 ]; then + echo "Status:Looker Web Application stopped" + exit 7 + else + echo "Status:Looker Web Application running" + exit 0 + fi + ;; + *) + java -jar looker.jar $* + ;; +esac + +exit 0 From 96b327b8474ff3044f37348663e1efed5aea8b07 Mon Sep 17 00:00:00 2001 From: Manav Sanghavi Date: Tue, 14 Jul 2026 13:50:17 -0700 Subject: [PATCH 2/2] refactor(startup_scripts): improve script robustness based on review feedback Apply suggestions from code review to improve portability and safety of the `looker21` script: - Use string comparison for Java version check to handle empty values. - Make directory change (`cd`) safe and quote paths. - Make memory calculation robust with fallback and POSIX arithmetic. - Use POSIX-compliant loop instead of Bash brace expansion `{1..30}` in `stop()`. - Verify PID file existence before reading it in `stop()`. --- startup_scripts/looker21 | 26 ++++++++++++++++++-------- 1 file changed, 18 insertions(+), 8 deletions(-) diff --git a/startup_scripts/looker21 b/startup_scripts/looker21 index 953bf00..b42c15d 100755 --- a/startup_scripts/looker21 +++ b/startup_scripts/looker21 @@ -6,18 +6,22 @@ # JAVA_VER=$(java -version 2>&1 | grep 'version "' | head -1 | cut -d'"' -f2 | sed '/^1\./s///' | cut -d'.' -f1) -if [ "$JAVA_VER" -ne 21 ]; then +if [ "$JAVA_VER" != "21" ]; then WHERE=`which java` echo "This script runs with OpenJDK 21, your executable $WHERE has Java major version $JAVA_VER" exit 1 fi -cd $HOME/looker +cd "$HOME/looker" || exit 1 # set your java memory- there should be over 1.5G of system memory # left to run the OS -MEM=`cat /proc/meminfo | grep MemTotal | awk '{print $2}'` -JM=`expr $MEM \* 6 / 10` -JAVAMEM="${JM}k" +MEM=$(cat /proc/meminfo 2>/dev/null | grep MemTotal | awk '{print $2}') +if [ -n "$MEM" ]; then + JM=$((MEM * 6 / 10)) + JAVAMEM="${JM}k" +else + JAVAMEM="2048m" +fi METAMEM="800m" # Extra Java startup args and Looker startup args. These can also be set in @@ -86,10 +90,14 @@ start() { } stop() { - pid=`cat .tmp/looker.pid` + if [ ! -f .tmp/looker.pid ]; then + echo "Error: .tmp/looker.pid not found." + exit 1 + fi + pid=$(cat .tmp/looker.pid) if [ -f .status_server_token ] && [ -x /usr/bin/curl ]; then state="running" - token=`cat .status_server_token` + token=$(cat .status_server_token) request="control/stop?token=${token}" timeout 20 curl -m 10 -ks ${PROTOCOL}://127.0.0.1:${LOOKERPORT}/${request} > /dev/null 2>&1 ECODE=$? @@ -97,7 +105,8 @@ stop() { if [ $ECODE -gt 7 ] ; then kill $pid fi - for i in {1..30}; do + i=1 + while [ $i -le 30 ]; do timeout 20 curl -m 5 -ks ${PROTOCOL}://127.0.0.1:${LOOKERPORT}/alive > /dev/null 2>&1 ECODE=$? if [ $ECODE -eq 7 ]; then @@ -108,6 +117,7 @@ stop() { kill -9 $pid fi sleep 1 + i=$((i + 1)) done if [ "${state}" = "running" ]; then echo "Force Stop Looker Web Application"