Skip to content

[Bug]: OOM in child process (terminal) causes wave to die (all terminals) #3291

@ryangroth5

Description

@ryangroth5

Current Behavior

If you have an OOM in wave you will get this:

Image

There is no good answer here, any button will cause the entire terminal (and all other terminals to die with it).


Environment

  • Wave version: 0.14.5 (snap rev 204, latest/stable)
  • Install method: Snap (classic)
  • OS: Ubuntu 24.04.4 LTS (Noble)
  • Kernel: 6.17.0-22-generic Ready for PR #22~24.04.1-Ubuntu PREEMPT_DYNAMIC
  • Hardware: MSI PRO X870-P WIFI (MS-7E47), BIOS 1.A77
  • RAM: 64 GB / Swap: 8 GB

What happened

At 2026-05-04 22:26:40, a CLI tool (filter_candidates) running inside one Wave
terminal tab exhausted all physical RAM and swap (~56 GB anon RSS). The Linux
OOM killer targeted and killed it (PID 198518).

Because all Wave terminals run under a single shared systemd snap scope
(snap.waveterm.waveterm-*.scope), the OOM kill caused the entire scope to be
marked as failed — killing every open Wave tab and the Wave window itself. Wave
then restarted from scratch ~2.5 minutes later.

Expected behavior: Only the terminal tab running the offending process is
affected. Other tabs survive.

Actual behavior: All tabs died. Wave exited completely and restarted.


Kernel evidence

kernel: wavesrv.x64 invoked oom-killer:
gfp_mask=0x140cca(GFP_HIGHUSER_MOVABLE|__GFP_COMP), order=0, oom_score_adj=100
kernel: CPU: 14 UID: 1000 PID: 197928 Comm: wavesrv.x64 Tainted: P OE
6.17.0-22-generic #22~24.04.1-Ubuntu
kernel: Hardware name: Micro-Star International Co., Ltd. MS-7E47/PRO X870-P
WIFI, BIOS 1.A77

kernel: Call Trace:
kernel: oom_kill_process+0x118/0x290
kernel: out_of_memory+0x101/0x340
kernel: __alloc_pages_may_oom+0x109/0x1d0
kernel: filemap_fault+0x10c/0xd50 ← wavesrv triggered OOM via page fault
(file-backed mmap read)

kernel: Mem-Info:
kernel: active_anon:7219452kB inactive_anon:52898868kB
kernel: Free swap = 0kB ← swap fully exhausted
kernel: Total swap = 8388604kB

kernel: Wave processes at time of OOM:
kernel: [ 197833] waveterm anon-rss:3363 pp oom_score_adj=100
kernel: [ 197895] waveterm anon-rss:384 pp oom_score_adj=100
kernel: [ 197896] waveterm anon-rss:768 pp oom_score_adj=100
kernel: [ 197913] wavesrv.x64 anon-rss:5044 pp oom_score_adj=100 ←
invoked OOM killer
kernel: [ 197943] waveterm anon-rss:14637 pp oom_score_adj=200
kernel: [ 197948] waveterm anon-rss:411 pp oom_score_adj=100
kernel: [ 198012] waveterm anon-rss:47874 pp oom_score_adj=300
kernel: [ 198060] waveterm anon-rss:1057 pp oom_score_adj=300
kernel: [ 198517] hashcat.bin anon-rss:557504 pp oom_score_adj=100
kernel: [ 198518] filter_candidat anon-rss:14045826 pp oom_score_adj=100 ←
KILLED
kernel: [ 198568] claude anon-rss:42532 pp oom_score_adj=100

kernel: oom-kill: task=filter_candidat, pid=198518,
task_memcg=.../snap.waveterm.waveterm-627a76e8-562a-4b34-9485-7c57743ce98f.sc
ope
kernel: Out of memory: Killed process 198518 (filter_candidat)
total-vm:64594572kB, anon-rss:56183304kB, file-rss:0kB, UID:1000
kernel: oom_reaper: reaped process 198518 (filter_candidat), now anon-rss:120kB

Scope failure (systemd):
snap.waveterm.waveterm-627a76e8.scope: A process of this unit has been killed
by the OOM killer.
snap.waveterm.waveterm-627a76e8.scope: Stopping timed out. Killing.
snap.waveterm.waveterm-627a76e8.scope: Killing process 197833 (waveterm) with
signal SIGKILL.
snap.waveterm.waveterm-627a76e8.scope: Failed with result 'oom-kill'.
snap.waveterm.waveterm-627a76e8.scope: Consumed 15min 35s CPU time, 56.4G
memory peak, 6.7G memory swap peak.


Root cause

The task_memcg in the OOM kill record places filter_candidat inside Wave's snap
scope. When systemd sees a process in the scope killed by OOM, it marks the
whole scope failed and SIGKILLs the remaining processes — including the Wave
frontend and all shell tabs.


Possible mitigations (for Wave devs to consider)

  • Run each tab's child shell/process in its own sub-cgroup or scope, isolating
    OOM kills to a single tab
  • Catch the scope-level OOM signal and attempt session save before exiting
  • Lower oom_score_adj for the Wave frontend processes so the OOM killer
    preferentially kills child processes before Wave itself

Expected Behavior

When a process running in one terminal tab exhausts memory
and gets OOM-killed, only that tab is affected. All other tabs and the Wave
session remain alive.

Steps To Reproduce

  1. Open Wave with multiple terminal tabs active
  2. In one tab, run a process that allocates memory until it exhausts all RAM +
    swap
  3. Observe that when the OOM killer fires, all tabs die and Wave restarts from
    scratch

Wave Version

0.14.5 (snap rev 204, latest/stable)

Platform

Linux

OS Version/Distribution

Ubu 24.04

Architecture

x64

Anything else?

No response

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't workingtriageNeeds triage

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions