diff options
author | Josh Bleecher Snyder <josh@tailscale.com> | 2020-12-22 09:52:53 -0800 |
---|---|---|
committer | Jason A. Donenfeld <Jason@zx2c4.com> | 2021-01-07 14:49:44 +0100 |
commit | b5f966ac2439df9eba182886406f6381934948ad (patch) | |
tree | ae7d66bd598057b2ea1d68b9ecbf21e1009ff121 | |
parent | a1c265b0c5bea2c1c4a62acac0045fe93cd691cd (diff) |
device: remove QueueInboundElement leak with stopped peers
This is particularly problematic on mobile,
where there is a fixed number of elements.
If most of them leak, it'll impact performance;
if all of them leak, the device will permanently deadlock.
I have a test that detects element leaks, which is how I found this one.
There are some remaining leaks that I have not yet tracked down,
but this is the most prominent by far.
I will commit the test when it passes reliably.
Signed-off-by: Josh Bleecher Snyder <josh@tailscale.com>
-rw-r--r-- | device/receive.go | 2 |
1 files changed, 2 insertions, 0 deletions
diff --git a/device/receive.go b/device/receive.go index e9cf2bc..4b6f278 100644 --- a/device/receive.go +++ b/device/receive.go @@ -199,6 +199,8 @@ func (device *Device) RoutineReceiveIncoming(IP int, bind conn.Bind) { if device.addToInboundAndDecryptionQueues(peer.queue.inbound, device.queue.decryption, elem) { buffer = device.GetMessageBuffer() } + } else { + device.PutInboundElement(elem) } peer.queue.RUnlock() |