OpenMetadata/bin/openmetadata.sh
Mohit Yadav 8f92aa4a8c
Remove Virtual Threads : (#27231)
PostgreSQL JDBC 42.7.7 uses synchronized blocks around network I/O (sending queries, reading
   responses). With virtual threads, a thread that blocks inside synchronized gets pinned to
  its carrier thread — it cannot unmount even when waiting for I/O.

  With -XX:ActiveProcessorCount=2, there are exactly 2 ForkJoinPool carrier threads. The
  moment 2 concurrent SQL queries are executing on virtual threads, both carrier threads are
  pinned. The health probe's virtual thread becomes runnable but can't be scheduled — no
  carrier thread is free. Probe times out. Repeat indefinitely.

  Disabling virtual threads switches Jetty back to a 150-thread platform thread pool. Even if
  100 threads are blocked waiting for DB connections, 50 remain available for the health probe
   and other requests. The complete deadlock is impossible with platform threads
2026-04-12 22:30:28 -07:00

201 lines
5.3 KiB
Bash

#!/usr/bin/env bash
# Copyright 2021 Collate
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
# http://www.apache.org/licenses/LICENSE-2.0
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# Home Dir
base_dir=$(dirname $0)/..
CATALOG_HOME=$base_dirbase_dir=$(dirname $0)/..
CATALOG_HOME=$base_dir
PID_DIR=$base_dir/logs
LOG_DIR=$base_dir/logs
mkdir -p $LOG_DIR
[ -z $MAX_WAIT_TIME ] && MAX_WAIT_TIME=120
# OpenMetadata env script
. $CATALOG_HOME/conf/openmetadata-env.sh
function catalogStart {
catalogStatus -q
if [[ $? -eq 0 ]]; then
rm -f ${PID_FILE}
echo "Starting OpenMetadata"
APP_CLASS="org.openmetadata.service.OpenMetadataApplication"
cd ${CATALOG_HOME}
nohup ${JAVA} ${CATALOG_HEAP_OPTS} ${CATALOG_JVM_PERF_OPTS} ${CATALOG_DEBUG_OPTS} ${CATALOG_GC_LOG_OPTS} ${CATALOG_JMX_OPTS} -cp ${CLASSPATH} "${APP_CLASS}" "server" "$@" 2>>"${ERR_FILE}" 1>>"${OUT_FILE}" &
cd - &> /dev/null
echo $! > ${PID_FILE}
echo $(catalogStatus)
else
echo "OpenMetadata already running with PID: ${PID}"
fi
}
function catalogStop {
catalogStatus -q
if [[ $? -eq 1 ]]; then
echo "Stopping OpenMetadata [${PID}] "
kill -s KILL ${PID} 1>>"${OUT_FILE}" 2>>"${ERR_FILE}"
else
echo "OpenMetadata not running"
fi
}
function catalogStatus {
local verbose=1
while true; do
case ${1} in
-q) verbose=0; shift;;
*) break;;
esac
done
getPID
if [[ $? -eq 1 ]] || [[ ${PID} -eq 0 ]]; then
[[ "${verbose}" -eq 1 ]] && echo "OpenMetadata not running."
return 0
fi
ps -p ${PID} > /dev/null
if [[ $? -eq 0 ]]; then
[[ "${verbose}" -eq 1 ]] && echo "OpenMetadata running with PID=${PID}."
return 1
else
[[ "${verbose}" -eq 1 ]] && echo "OpenMetadata not running."
return 0
fi
}
# Removes the PID file if OpenMetadata is not running
function catalogClean {
catalogStatus -q
if [[ $? -eq 0 ]]; then
rm -f ${PID_FILE} ${OUT_FILE} ${ERR_FILE}
echo "Removed the ${PID_FILE}, ${OUT_FILE} and ${ERR_FILE} files."
else
echo "Can't clean files. OpenMetadata running with PID=${PID}."
fi
}
# Returns 0 if the OpenMetadata is running and sets the $PID variable.
function getPID {
if [ ! -d $PID_DIR ]; then
printf "Can't find pid dir.\n"
exit 1
fi
if [ ! -f $PID_FILE ]; then
PID=0
return 1
fi
PID="$(<$PID_FILE)"
return 0
}
# Home Dir
base_dir=$(dirname $0)/..
cd $base_dir && base_dir=`pwd` && cd - &> /dev/null
# App name
APP_NAME=catalog
#if CATALOG_DIR is not set its a dev env.
if [ "x$CATALOG_DIR" != "x" ]; then
CATALOG_HOME=$CATALOG_DIR/$APP_NAME
else
CATALOG_HOME=$base_dir
PID_DIR=$CATALOG_HOME/logs
LOG_DIR=$CATALOG_HOME/logs
mkdir -p $LOG_DIR
fi
# CATALOG env script
. ${CATALOG_HOME}/conf/openmetadata-env.sh
PID=0
[ -z $PID_DIR ] && PID_DIR="/var/run/$APP_NAME"
[ -z $LOG_DIR ] && LOG_DIR="/var/log/$APP_NAME"
# Name of PID, OUT and ERR files
PID_FILE="${PID_DIR}/${APP_NAME}.pid"
OUT_FILE="${LOG_DIR}/${APP_NAME}.log"
ERR_FILE="${LOG_DIR}/${APP_NAME}.err"
CLASSPATH=${CLASSPATH}:/etc/catalog/conf
# classpath addition for release
for file in ${CATALOG_HOME}/libs/*.jar;
do
CLASSPATH=${CLASSPATH}:${file}
done
# Which java to use
if [[ -z "${JAVA_HOME}" ]]; then
JAVA="java"
else
JAVA="${JAVA_HOME}/bin/java"
fi
if [[ "x${CATALOG_HEAP_OPTS}" = "x" ]]; then
export CATALOG_HEAP_OPTS="-Xmx2G -Xms2G"
fi
# JVM performance options
if [[ -z "${CATALOG_JVM_PERF_OPTS}" ]]; then
CATALOG_JVM_PERF_OPTS="-server -XX:+UseG1GC -XX:+UnlockExperimentalVMOptions -XX:MaxGCPauseMillis=200 -XX:G1NewSizePercent=5 -XX:G1MaxNewSizePercent=20 -XX:InitiatingHeapOccupancyPercent=35 -XX:+ExplicitGCInvokesConcurrent -Djava.awt.headless=true"
fi
# JMX settings
if [ -z "$CATALOG_JMX_OPTS" ]; then
CATALOG_JMX_OPTS="-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false "
fi
# JMX port to use
if [ $JMX_PORT ]; then
CATALOG_JMX_OPTS="$CATALOG_JMX_OPTS -Dcom.sun.management.jmxremote.port=$JMX_PORT "
fi
# GC options
GC_LOG_FILE_NAME='CATALOG-gc.log'
if [ -z "$CATALOG_GC_LOG_OPTS" ]; then
JAVA_MAJOR_VERSION=$($JAVA -version 2>&1 | sed -E -n 's/.* version "([0-9]*).*$/\1/p')
if [[ "$JAVA_MAJOR_VERSION" -ge "9" ]] ; then
CATALOG_GC_LOG_OPTS="-Xlog:gc*:file=$LOG_DIR/$GC_LOG_FILE_NAME:time,tags:filecount=10,filesize=102400"
else
CATALOG_GC_LOG_OPTS="-Xloggc:$LOG_DIR/$GC_LOG_FILE_NAME -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCTimeStamps -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=10 -XX:GCLogFileSize=100M"
fi
fi
option="$1"
shift
case "${option}" in
start)
conf="$CATALOG_HOME/conf/openmetadata.yaml"
if [[ $# -eq 1 ]]; then conf="${1}"; fi
catalogStart "${conf}"
;;
stop)
catalogStop
;;
status)
catalogStatus
;;
clean)
catalogClean
;;
*)
echo "Usage: $0 {start|stop|status|clean}"
;;
esac