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
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions