| Marc Kupietz | fbfcd04 | 2025-11-16 13:33:32 +0100 | [diff] [blame] | 1 | #!/usr/bin/env bash |
| Marc Kupietz | 02cd8bf | 2025-11-16 14:21:25 +0100 | [diff] [blame] | 2 | # Shebang header for korapxmltool: auto-enables native access (Java 25+) and chooses a default -Xmx. |
| Marc Kupietz | fbfcd04 | 2025-11-16 13:33:32 +0100 | [diff] [blame] | 3 | # Usage: |
| 4 | # cat korapxmltool.shebang app/build/libs/korapxmltool.jar > korapxmltool |
| 5 | # chmod +x korapxmltool |
| 6 | # (Run `zip -A korapxmltool` if your unzip/java complains about prepended bytes.) |
| Marc Kupietz | 02cd8bf | 2025-11-16 14:21:25 +0100 | [diff] [blame] | 7 | # |
| 8 | # Override memory: |
| Marc Kupietz | 570d0e0 | 2025-11-17 10:42:41 +0100 | [diff] [blame] | 9 | # export KORAPXMLTOOL_XMX=20g # sets -Xmx20g |
| 10 | # export KORAPXMLTOOL_XMX=8192m # sets -Xmx8192m |
| Marc Kupietz | 02cd8bf | 2025-11-16 14:21:25 +0100 | [diff] [blame] | 11 | # export KORAPXMLTOOL_JAVA_OPTS="... -Xmx4g" # full custom opts |
| 12 | # Otherwise we pick ~75% of detected memory (cgroup aware), clamped to [1024m, 65536m]. |
| Marc Kupietz | fbfcd04 | 2025-11-16 13:33:32 +0100 | [diff] [blame] | 13 | |
| 14 | set -euo pipefail |
| 15 | |
| Marc Kupietz | 02cd8bf | 2025-11-16 14:21:25 +0100 | [diff] [blame] | 16 | has_xmx=false |
| 17 | for v in "${JDK_JAVA_OPTIONS:-}" "${JAVA_TOOL_OPTIONS:-}" "${KORAPXMLTOOL_JAVA_OPTS:-}"; do |
| 18 | [[ $v == *"-Xmx"* ]] && has_xmx=true && break |
| 19 | done |
| 20 | for arg in "$@"; do |
| 21 | [[ $arg == -Xmx* ]] && has_xmx=true && break |
| 22 | done |
| 23 | |
| 24 | detect_mem_limit_mb() { |
| 25 | local cgroup_limit |
| 26 | if [[ -f /sys/fs/cgroup/memory.max ]]; then |
| 27 | cgroup_limit=$(< /sys/fs/cgroup/memory.max) |
| 28 | [[ $cgroup_limit == "max" ]] && cgroup_limit="" |
| 29 | elif [[ -f /sys/fs/cgroup/memory/memory.limit_in_bytes ]]; then |
| 30 | cgroup_limit=$(< /sys/fs/cgroup/memory/memory.limit_in_bytes) |
| 31 | fi |
| 32 | |
| 33 | local limit_mb="" |
| 34 | if [[ -n ${cgroup_limit:-} && $cgroup_limit =~ ^[0-9]+$ && $cgroup_limit -lt 9223372036854771712 ]]; then |
| 35 | limit_mb=$(( cgroup_limit / 1024 / 1024 )) |
| 36 | fi |
| 37 | |
| 38 | local memtotal_kb |
| 39 | memtotal_kb=$(awk '/MemTotal/ { print $2; exit }' /proc/meminfo 2>/dev/null || echo "") |
| 40 | local total_mb="" |
| 41 | if [[ $memtotal_kb =~ ^[0-9]+$ ]]; then |
| 42 | total_mb=$(( memtotal_kb / 1024 )) |
| 43 | fi |
| 44 | |
| 45 | if [[ -n $limit_mb && -n $total_mb ]]; then |
| 46 | (( limit_mb < total_mb )) && echo "$limit_mb" || echo "$total_mb" |
| 47 | else |
| 48 | echo "${limit_mb:-${total_mb:-4096}}" |
| 49 | fi |
| 50 | } |
| 51 | |
| Marc Kupietz | fbfcd04 | 2025-11-16 13:33:32 +0100 | [diff] [blame] | 52 | EXTRA_OPTS=() |
| 53 | if [[ "${JDK_JAVA_OPTIONS:-}" != *"--enable-native-access="* ]]; then |
| 54 | EXTRA_OPTS+=(--enable-native-access=ALL-UNNAMED) |
| 55 | fi |
| 56 | |
| Marc Kupietz | 02cd8bf | 2025-11-16 14:21:25 +0100 | [diff] [blame] | 57 | if ! $has_xmx; then |
| Marc Kupietz | 570d0e0 | 2025-11-17 10:42:41 +0100 | [diff] [blame] | 58 | if [[ -n ${KORAPXMLTOOL_XMX:-} ]]; then |
| 59 | # Handle KORAPXMLTOOL_XMX with units (g/G for GB, m/M for MB, or just number for MB) |
| 60 | if [[ ${KORAPXMLTOOL_XMX} =~ ^[0-9]+[gG]$ ]]; then |
| 61 | # Convert GB to MB |
| 62 | xmx_gb=${KORAPXMLTOOL_XMX%[gG]} |
| 63 | xmx_mb=$((xmx_gb * 1024)) |
| 64 | elif [[ ${KORAPXMLTOOL_XMX} =~ ^[0-9]+[mM]$ ]]; then |
| 65 | # Extract MB value |
| 66 | xmx_mb=${KORAPXMLTOOL_XMX%[mM]} |
| 67 | elif [[ ${KORAPXMLTOOL_XMX} =~ ^[0-9]+$ ]]; then |
| 68 | # Treat plain number as MB for backward compatibility |
| 69 | xmx_mb=${KORAPXMLTOOL_XMX} |
| 70 | else |
| 71 | echo "Warning: Invalid KORAPXMLTOOL_XMX format '${KORAPXMLTOOL_XMX}'. Use formats like '20g', '8192m', or '8192'." >&2 |
| 72 | xmx_mb="" |
| 73 | fi |
| 74 | fi |
| 75 | |
| 76 | # If no valid XMX was provided or parsing failed, use auto-detection |
| 77 | if [[ -z ${xmx_mb:-} ]]; then |
| Marc Kupietz | 02cd8bf | 2025-11-16 14:21:25 +0100 | [diff] [blame] | 78 | mem_mb=$(detect_mem_limit_mb) |
| 79 | xmx_mb=$(( mem_mb * 75 / 100 )) |
| 80 | (( xmx_mb < 1024 )) && xmx_mb=1024 |
| 81 | (( xmx_mb > 65536 )) && xmx_mb=65536 |
| 82 | fi |
| 83 | EXTRA_OPTS+=("-Xmx${xmx_mb}m") |
| 84 | fi |
| 85 | |
| Marc Kupietz | bab5d7e | 2025-11-17 15:16:46 +0100 | [diff] [blame^] | 86 | # Set default KORAPXMLTOOL_MODELS_PATH relative to executable if not already set |
| 87 | if [[ -z ${KORAPXMLTOOL_MODELS_PATH:-} ]]; then |
| 88 | SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" |
| 89 | export KORAPXMLTOOL_MODELS_PATH="${SCRIPT_DIR}/../lib/models" |
| 90 | fi |
| 91 | |
| Marc Kupietz | 02cd8bf | 2025-11-16 14:21:25 +0100 | [diff] [blame] | 92 | exec java "${EXTRA_OPTS[@]}" ${KORAPXMLTOOL_JAVA_OPTS:-} -jar "$0" "$@" |