byteayan commented on code in PR #3258:
URL: https://github.com/apache/hugegraph/pull/3258#discussion_r4205446839


##########
hugegraph-server/hugegraph-dist/src/assembly/static/bin/hugegraph-server.sh:
##########
@@ -110,30 +120,97 @@ 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.
+# Child JVMs the Server starts (computer jobs, for example) inherit these 
options,
+# so every path must stay unique per JVM. ErrorFile expands %p to each JVM's 
PID.
+# HeapDumpPath does not expand %p, but when it names an existing directory 
each JVM
+# writes java_pid<its pid>.hprof inside it, so it points at a directory per 
launch.
+# A restarted container often reuses the PID, and HotSpot will not overwrite an
+# existing crash log or heap dump, so the 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.
+crash_files_exist() {
+    [[ -e "${LOGS}/heapdump_$1" ]] && return 0
+    local file
+    for file in "${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._-' '_')
+# Each launch records the JVM that owns its heap dump directory in a file named
+# pid, a name the license check already skips: the PID and that process's start
+# time, so a reused PID (common after a container restart) does not look like 
the
+# old owner. A live JVM's directory stays empty until it runs out of memory, so
+# startup removes a directory only when it holds nothing but that file and that
+# exact process is gone. Directories without a marker, with a dump, or owned 
by a
+# running process are left alone, and nothing is removed when ps cannot tell.
+process_identity() {
+    # Collapse ps's padding so the value reads back unchanged from pid.
+    ps -o lstart= -p "$1" 2>/dev/null | awk '{$1 = $1; print}'
+}
+remove_unused_heap_dump_dir() {
+    local dir="$1" owner_pid="" owner_start="" entries
+    [[ -f "${dir}/pid" ]] || return 0
+    entries=$(ls -A "${dir}")
+    [[ ${entries} == "pid" ]] || return 0
+    { read -r owner_pid; read -r owner_start; } < "${dir}/pid"
+    [[ -n ${owner_pid} && -n ${owner_start} ]] || return 0
+    [[ $(process_identity "${owner_pid}") == "${owner_start}" ]] && return 0

Review Comment:
   Fixed in d5911733 by removing the automatic cleanup instead of adding 
another ownership rule. The launcher has no portable way to see computer-job 
JVMs that inherit `HeapDumpPath` and outlive their Server, so any cleanup can 
delete a directory one of them still needs. The launcher now creates one 
`heapdump_<host>_<launch time>/` per start and never removes any, and the `pid` 
owner marker is gone. The cost is one directory per start, empty unless 
something ran out of memory. `docker/README.md` (and apache/hugegraph-doc#509) 
now say old ones can be deleted once no HugeGraph JVM from that launch is 
running. The test checks that an empty directory from an earlier launch is kept.



-- 
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]

Reply via email to