imbajin commented on code in PR #3258:
URL: https://github.com/apache/hugegraph/pull/3258#discussion_r4198366817
##########
hugegraph-server/hugegraph-dist/src/assembly/static/bin/hugegraph-server.sh:
##########
@@ -110,30 +120,59 @@ JAVA_VERSION=$($JAVA -version 2>&1 |
# Drop any pre-release suffix, e.g. "24-ea" -> "24"
JAVA_VERSION="${JAVA_VERSION%%[!0-9]*}"
if [[ -z $JAVA_VERSION || $JAVA_VERSION -lt $MIN_JAVA_VERSION ]]; then
- echo "Make sure the JDK is installed and the version >= $MIN_JAVA_VERSION,
current is $JAVA_VERSION" \
- >> "${OUTPUT}"
+ report_error "Make sure the JDK is installed and the version >=
$MIN_JAVA_VERSION, current is $JAVA_VERSION"
exit 1
fi
if [[ ! -r ${JVM_MODULE_OPTIONS} ]]; then
- echo "Missing or unreadable JVM module options file:
${JVM_MODULE_OPTIONS}" >> "${OUTPUT}"
+ report_error "Missing or unreadable JVM module options file:
${JVM_MODULE_OPTIONS}"
exit 1
fi
# Set Java options
if [ "$JAVA_OPTIONS" = "" ]; then
XMX=$(calc_xmx $MIN_MEM $MAX_MEM)
if [ $? -ne 0 ]; then
- echo "Failed to start HugeGraphServer, requires at least ${MIN_MEM}MB
free memory" >> "${OUTPUT}"
+ report_error "Failed to start HugeGraphServer, requires at least
${MIN_MEM}MB free memory"
exit 1
fi
- JAVA_OPTIONS="-Xms${MIN_MEM}m -Xmx${XMX}m -XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=${LOGS} ${USER_OPTION}"
+ JAVA_OPTIONS="-Xms${MIN_MEM}m -Xmx${XMX}m ${USER_OPTION}"
# Rolling out detailed GC logs
#JAVA_OPTIONS="${JAVA_OPTIONS} -XX:+UseGCLogFileRotation
-XX:GCLogFileSize=10M -XX:NumberOfGCLogFiles=3 \
# -Xloggc:./logs/gc.log -XX:+PrintHeapAtGC
-XX:+PrintGCDetails -XX:+PrintGCDateStamps"
fi
+# Keep heap dumps and JVM crash logs in $LOGS whatever JAVA_OPTIONS holds. The
+# defaults go first in JAVA_TOOL_OPTIONS, which the JVM reads before the
operator's
+# own JAVA_TOOL_OPTIONS, JDK_JAVA_OPTIONS, the command line (JAVA_OPTIONS and
-j)
+# and _JAVA_OPTIONS, so any of those overrides them. The JVM does that parsing
+# itself, including quoted options and @argfiles.
+# A restarted container often reuses the JVM's PID, and HotSpot will not
overwrite
+# an existing crash log or heap dump, so the file names carry the host name
(the
+# pod name on Kubernetes, so pods sharing one log volume do not collide), the
+# launch time, and a counter that skips names already used in $LOGS. The script
+# execs java below, so $$ is the JVM's PID.
+crash_files_exist() {
+ local file
+ for file in "${LOGS}"/java_pid*_"$1".hprof "${LOGS}"/hs_err_pid*_"$1".log;
do
+ [[ -e ${file} ]] && return 0
+ done
+ return 1
+}
+LAUNCH_HOST=$(printf '%s' "${HOSTNAME:-localhost}" | tr -c 'A-Za-z0-9._-' '_')
+LAUNCH_STAMP="${LAUNCH_HOST}_$(date +%Y%m%d-%H%M%S)"
+LAUNCH_ID="${LAUNCH_STAMP}"
+LAUNCH_SUFFIX=0
+while crash_files_exist "${LAUNCH_ID}"; do
+ LAUNCH_SUFFIX=$((LAUNCH_SUFFIX + 1))
+ LAUNCH_ID="${LAUNCH_STAMP}-${LAUNCH_SUFFIX}"
+done
+CRASH_OPTIONS="-XX:+HeapDumpOnOutOfMemoryError"
+CRASH_OPTIONS="${CRASH_OPTIONS}
\"-XX:HeapDumpPath=${LOGS}/java_pid$$_${LAUNCH_ID}.hprof\""
Review Comment:
⚠️ Blocking: no. Summary: This path embeds the Server launcher PID and is
inherited by child JVMs through JAVA_TOOL_OPTIONS, so a Hadoop computer-job JVM
and the Server can target the same heap-dump file; if the child writes first,
HotSpot will not overwrite it on a later Server OOM. Please use a per-JVM path
or scope this option to the Server process. Evidence: AbstractComputer.java:107
starts hadoop jar with a default ProcessBuilder and does not replace its
environment.
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]