diff options
author | Anders Svensson <[email protected]> | 2016-03-15 12:10:58 +0100 |
---|---|---|
committer | Anders Svensson <[email protected]> | 2016-03-16 08:00:34 +0100 |
commit | 9a878743009952849984fd663ffb60261b9d2965 (patch) | |
tree | 9ab29cc4e75258827a6a1bb91c9528981f2f5851 /lib/inets/src/ftp/ftp_response.erl | |
parent | 6d4001de141a00b3bf37b8f7b24c5bde2b4f4015 (diff) | |
download | otp-9a878743009952849984fd663ffb60261b9d2965.tar.gz otp-9a878743009952849984fd663ffb60261b9d2965.tar.bz2 otp-9a878743009952849984fd663ffb60261b9d2965.zip |
Make peer failover more efficient
Failover caused the entire request table to be scanned in search of
entries with the transport process in question. With many entries
(possibly as a result of the leak fixed in commit 6c9cbd96), this can
lead to the service process hanging in ets:select_trap/1, with memory
growth when many request processes write concurrently. Now write entries
keyed on the transport pid, so that finding request processes at
failover is a lookup rather than a select scanning the entire table.
There is no upgrade handling in that new code doesn't consider that old
code didn't write entries on the transport pid. Thus, a request whose
table entries were written in old code will timeout rather than failover
in new code. That is, there is a small window for failover to be missed
(since request processes are short-lived), but it requires that it take
place during the upgrade.
As a minor aside, don't ignore failovers when sending binaries (which
isn't officially supported), let prepare_retransmit callbacks deal with
modifying the binary as required.
Diffstat (limited to 'lib/inets/src/ftp/ftp_response.erl')
0 files changed, 0 insertions, 0 deletions