diff --git a/util/ringbuffer/ringbuffer.go b/util/ringbuffer/ringbuffer.go index 00310baea..d30cf9171 100644 --- a/util/ringbuffer/ringbuffer.go +++ b/util/ringbuffer/ringbuffer.go @@ -24,7 +24,12 @@ type RingBuffer[T any] struct { // Add appends a new item to the RingBuffer, possibly overwriting the oldest // item in the buffer if it is already full. +// +// It does nothing if rb is nil. func (rb *RingBuffer[T]) Add(t T) { + if rb == nil { + return + } rb.mu.Lock() defer rb.mu.Unlock() if len(rb.buf) < rb.max { @@ -37,6 +42,8 @@ func (rb *RingBuffer[T]) Add(t T) { // GetAll returns a copy of all the entries in the ring buffer in the order they // were added. +// +// It returns nil if rb is nil. func (rb *RingBuffer[T]) GetAll() []T { if rb == nil { return nil diff --git a/wgengine/magicsock/magicsock.go b/wgengine/magicsock/magicsock.go index 39a8ce528..5191f0604 100644 --- a/wgengine/magicsock/magicsock.go +++ b/wgengine/magicsock/magicsock.go @@ -1815,9 +1815,11 @@ func debugRingBufferSize(numPeers int) int { } var maxRingBufferSize int if runtime.GOOS == "ios" || runtime.GOOS == "android" { - maxRingBufferSize = 1 * 1024 * 1024 + maxRingBufferSize = 1 << 20 + // But as of 2024-03-20, we now just disable the ring buffer entirely + // on mobile as it hadn't proven useful enough to justify even 1 MB. } else { - maxRingBufferSize = 4 * 1024 * 1024 + maxRingBufferSize = 4 << 20 } if v := debugRingBufferMaxSizeBytes(); v > 0 { maxRingBufferSize = v @@ -1984,7 +1986,6 @@ func (c *Conn) SetNetworkMap(nm *netmap.NetworkMap) { ep = &endpoint{ c: c, - debugUpdates: ringbuffer.New[EndpointChange](entriesPerBuffer), nodeID: n.ID(), publicKey: n.Key(), publicKeyHex: n.Key().UntypedHexString(), @@ -1993,6 +1994,14 @@ func (c *Conn) SetNetworkMap(nm *netmap.NetworkMap) { heartbeatDisabled: flags.heartbeatDisabled, isWireguardOnly: n.IsWireGuardOnly(), } + switch runtime.GOOS { + case "ios", "android": + // Omit, to save memory. Prior to 2024-03-20 we used to limit it to + // ~1MB on mobile but we never used the data so the memory was just + // wasted. + default: + ep.debugUpdates = ringbuffer.New[EndpointChange](entriesPerBuffer) + } if n.Addresses().Len() > 0 { ep.nodeAddr = n.Addresses().At(0).Addr() }