summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorJosh Bleecher Snyder <josh@tailscale.com>2020-12-22 09:52:53 -0800
committerJason A. Donenfeld <Jason@zx2c4.com>2021-01-07 14:49:44 +0100
commitb5f966ac2439df9eba182886406f6381934948ad (patch)
treeae7d66bd598057b2ea1d68b9ecbf21e1009ff121
parenta1c265b0c5bea2c1c4a62acac0045fe93cd691cd (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.go2
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()