File size: 1,416 Bytes
c9c49ab
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
defmodule Plausible.Ingestion.WriteBufferTest do
  use ExUnit.Case, async: true

  import ExUnit.CaptureLog

  alias Plausible.Ingestion.WriteBuffer

  @compile_time_opts WriteBuffer.compile_time_prepare(Plausible.ClickhouseEventV2)

  test "keeps running and logs the reason when a linked process exits", %{test: test} do
    opts = [
      header: @compile_time_opts.header,
      insert_sql: @compile_time_opts.insert_sql,
      insert_opts: @compile_time_opts.insert_opts,
      # unique atom is at our disposal already
      name: test,
      # no need to ever flush automatically on slow CI
      flush_interval_ms: 1_000_000_000
    ]

    {:ok, pid} = WriteBuffer.start_link(opts)

    # The buffer traps exits, so a linked process exiting delivers a real
    # {:EXIT, from, reason} message to handle_info/2. Linking a throwaway
    # process to the buffer and killing it reproduces the crash in #6382
    # without sending a synthetic message.
    child =
      spawn(fn ->
        Process.link(pid)
        Process.sleep(:infinity)
      end)

    ref = Process.monitor(child)

    log =
      capture_log(fn ->
        Process.exit(child, :shutdown)
        assert_receive {:DOWN, ^ref, :process, ^child, _}, 1_000
        assert Process.alive?(pid)
        assert WriteBuffer.flush(test) == :ok
      end)

    assert log =~ "received EXIT, keeping buffer alive"
    assert log =~ ":shutdown"
  end
end