From 48af61afb3000ac98b7787f0c7f58f623eede1e4 Mon Sep 17 00:00:00 2001 From: MickLesk Date: Wed, 27 May 2026 14:25:58 +0200 Subject: [PATCH] add node heap space in error-handler --- scripts/core/error-handler.func | 94 +++++++++++++++++++++++++++++++++ 1 file changed, 94 insertions(+) diff --git a/scripts/core/error-handler.func b/scripts/core/error-handler.func index d20ce55..ccd3588 100644 --- a/scripts/core/error-handler.func +++ b/scripts/core/error-handler.func @@ -313,6 +313,100 @@ error_handler() { echo -e "${TAB}-----------------------------------\n" fi + # Detect probable Node.js heap OOM and print actionable guidance. + # This avoids generic SIGABRT/SIGKILL confusion for frontend build failures. + local node_oom_detected="false" + local node_build_context="false" + if [[ "$command" =~ (npm|pnpm|yarn|node|vite|turbo) ]]; then + node_build_context="true" + fi + if [[ "$exit_code" == "243" ]]; then + node_oom_detected="true" + elif [[ -n "$active_log" && -s "$active_log" ]]; then + if tail -n 200 "$active_log" 2>/dev/null | grep -Eqi 'Reached heap limit|JavaScript heap out of memory|Allocation failed - JavaScript heap out of memory|FATAL ERROR: Reached heap limit'; then + node_oom_detected="true" + fi + fi + + if [[ "$node_oom_detected" == "true" ]] || { [[ "$node_build_context" == "true" ]] && [[ "$exit_code" =~ ^(134|137)$ ]]; }; then + local heap_hint_mb="" + + # If explicitly configured, prefer the current value for troubleshooting output. + if [[ -n "${NODE_OPTIONS:-}" ]] && [[ "${NODE_OPTIONS}" =~ max-old-space-size=([0-9]+) ]]; then + heap_hint_mb="${BASH_REMATCH[1]}" + elif [[ -n "${var_ram:-}" ]] && [[ "${var_ram}" =~ ^[0-9]+$ ]]; then + heap_hint_mb=$((var_ram * 75 / 100)) + else + local mem_kb="" + mem_kb=$(awk '/^MemTotal:/ {print $2; exit}' /proc/meminfo 2>/dev/null || echo "") + if [[ "$mem_kb" =~ ^[0-9]+$ ]]; then + local mem_mb=$((mem_kb / 1024)) + heap_hint_mb=$((mem_mb * 75 / 100)) + fi + fi + + if [[ -z "$heap_hint_mb" ]] || ((heap_hint_mb < 1024)); then + heap_hint_mb=1024 + elif ((heap_hint_mb > 12288)); then + heap_hint_mb=12288 + fi + + if declare -f msg_warn >/dev/null 2>&1; then + msg_warn "Possible Node.js heap OOM. Try: export NODE_OPTIONS=\"--max-old-space-size=${heap_hint_mb}\" and rerun the build." + else + echo -e "${YW}Possible Node.js heap OOM. Try: export NODE_OPTIONS=\"--max-old-space-size=${heap_hint_mb}\" and rerun the build.${CL}" + fi + fi + + # ── Log-pattern analysis: detect common failure causes and emit actionable hints ── + if [[ -n "$active_log" && -s "$active_log" ]]; then + local _log_tail + _log_tail=$(tail -n 60 "$active_log" 2>/dev/null || true) + + # 1. APT/dpkg dependency conflict + if echo "$_log_tail" | grep -qE "Depends:|depends on.*but.*not installed|broken packages|unmet dep|dependency problems"; then + # Check for PostgreSQL-specific version mismatch (most actionable) + local _pg_conflict + _pg_conflict=$(echo "$_log_tail" | grep -oE 'postgresql-[0-9]+ but.*installed' | head -1 || true) + if [[ -n "$_pg_conflict" ]]; then + if declare -f msg_warn >/dev/null 2>&1; then + msg_warn "PostgreSQL version conflict: ${_pg_conflict}" + msg_warn "Hint: A package requires a specific PostgreSQL version that is not installed. Your distribution may have installed a different PG version than expected." + fi + else + if declare -f msg_warn >/dev/null 2>&1; then + msg_warn "APT dependency conflict detected. A required package is not available or is the wrong version for this system." + msg_warn "Hint: Run 'apt-get install -f' inside the container or check that all required repositories are configured for your distribution." + fi + fi + # 2. APT/GPG signature verification failure + elif echo "$_log_tail" | grep -qE "sqv|KEYEXPIRED|NO_PUBKEY|key is not certified|signature verification failed|is not signed|Sub-process.*sqv"; then + if declare -f msg_warn >/dev/null 2>&1; then + msg_warn "APT repository signature error detected." + msg_warn "Hint: A repository GPG key may be missing, expired, or the keyring file is not yet present (/usr/share/postgresql-common/pgdg/apt.postgresql.org.asc etc.)." + msg_warn "Hint: Install the 'postgresql-common' package first, or re-add the repository with its correct signing key." + fi + # 3. Network / DNS failure during apt-get or curl + elif echo "$_log_tail" | grep -qE "Could not resolve|Failed to fetch|Unable to connect|Name or service not known|Network is unreachable|curl.*resolve"; then + if declare -f msg_warn >/dev/null 2>&1; then + msg_warn "Network or DNS failure detected." + msg_warn "Hint: Check the container's network connectivity, DNS settings, and whether any firewall or ad-blocker is intercepting traffic." + fi + # 4. APT lock held by another process + elif echo "$_log_tail" | grep -qE "Could not get lock|dpkg frontend lock|waiting for it to exit|E: Unable to lock"; then + if declare -f msg_warn >/dev/null 2>&1; then + msg_warn "APT or dpkg lock conflict detected." + msg_warn "Hint: Another package manager process may be running. Try 'rm /var/lib/dpkg/lock-frontend && dpkg --configure -a' inside the container." + fi + # 5. Disk space exhaustion + elif echo "$_log_tail" | grep -qE "No space left on device|disk quota exceeded|ENOSPC"; then + if declare -f msg_warn >/dev/null 2>&1; then + msg_warn "Disk space exhausted during installation." + msg_warn "Hint: Increase the container's disk size (pct resize rootfs +2G) or clean up space first." + fi + fi + fi + # Detect context: Container (INSTALL_LOG set + inside container /root) vs Host if [[ -n "${INSTALL_LOG:-}" && -f "${INSTALL_LOG:-}" && -d /root ]]; then # CONTAINER CONTEXT: Copy log and create flag file for host