byteayan commented on code in PR #3258:
URL: https://github.com/apache/hugegraph/pull/3258#discussion_r4199023969
##########
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:
Fixed in c4e481f3 with a per-JVM path. `HeapDumpPath` now names a per-launch
directory, `logs/heapdump_<host>_<launch time>/`; when the path is a directory,
HotSpot writes `java_pid<its own pid>.hprof` inside it, so the Server and any
child JVM (computer jobs) get separate files. I checked that JDK 17 still does
not expand `%p` in `HeapDumpPath`. `ErrorFile` already uses `%p`. Since the
directory exists even without a dump, startup removes only this host's empty
`heapdump_*` directories (`rmdir`, so a directory holding a dump is never
removed). The test runs two real JVMs out of memory with the launcher's options
and expects one dump each, and covers the counter and the cleanup. Docs are
updated here and in apache/hugegraph-doc#509.
--
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]