diff options
author | Sverker Eriksson <[email protected]> | 2019-02-14 18:07:15 +0100 |
---|---|---|
committer | Sverker Eriksson <[email protected]> | 2019-02-14 18:07:15 +0100 |
commit | 750e9be58c7c245d49d6a7227b972bf0fd8c09ab (patch) | |
tree | c3f6c26669a21a4f23c42fdd5f494028d6c9c8cc /erts/emulator/beam/erl_process.c | |
parent | 0d6eeb82210b5ad848af972c3b2f687a52edd156 (diff) | |
download | otp-750e9be58c7c245d49d6a7227b972bf0fd8c09ab.tar.gz otp-750e9be58c7c245d49d6a7227b972bf0fd8c09ab.tar.bz2 otp-750e9be58c7c245d49d6a7227b972bf0fd8c09ab.zip |
erts: Avoid heart killing a nicely exiting emulator
Symptom:
Heart kills exiting emulator before is has flushed all ports
and with HEART_KILL_SIGNAL=SIGABRT it may also produce
unnecessary core dumps from doing init:reboot() for example.
Problem:
Heart port is closed together with all the others in handle_reap_ports()
which is detected by heart OS process.
Solution 1:
Leave the heart port alone in handle_reap_ports() and let it be closed
by OS when emulator exists. It doesn't need to be flushed anyway.
Solution 2:
When heart OS process gets EOF on connection let it wait max 5 seconds
for emulator process to self terminate before trying to kill it.
Diffstat (limited to 'erts/emulator/beam/erl_process.c')
-rw-r--r-- | erts/emulator/beam/erl_process.c | 7 |
1 files changed, 7 insertions, 0 deletions
diff --git a/erts/emulator/beam/erl_process.c b/erts/emulator/beam/erl_process.c index ffbfbc4e56..a4f312f101 100644 --- a/erts/emulator/beam/erl_process.c +++ b/erts/emulator/beam/erl_process.c @@ -2625,6 +2625,13 @@ handle_reap_ports(ErtsAuxWorkData *awdp, erts_aint32_t aux_work, int waiting) erts_smp_port_lock(prt); + if (prt->common.u.alive.reg && + prt->common.u.alive.reg->name == am_heart_port) { + /* Leave heart port to not get killed before flushing is done*/ + erts_port_release(prt); + continue; + } + state = erts_atomic32_read_nob(&prt->state); if (!(state & (ERTS_PORT_SFLGS_INVALID_DRIVER_LOOKUP | ERTS_PORT_SFLG_HALT))) { |