mirror of
https://github.com/tailscale/tailscale.git
synced 2025-04-16 03:31:39 +00:00
derp: fix meshing accounting edge case bug
If a peer is connected to multiple nodes in a region (so multiForwarder is in use) and then a node restarts and re-sends all its additions, this bug about whether an element is in the multiForwarder could cause a one-time flip in the which peer node we forward to. Note a huge deal, but not written as intended. Thanks to @lewgun for the bug report in #2141. Signed-off-by: Brad Fitzpatrick <bradfitz@tailscale.com>
This commit is contained in:
parent
fab296536c
commit
f35b8c3ead
@ -1275,7 +1275,7 @@ func (s *Server) AddPacketForwarder(dst key.Public, fwd PacketForwarder) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
if m, ok := prev.(multiForwarder); ok {
|
if m, ok := prev.(multiForwarder); ok {
|
||||||
if _, ok := m[fwd]; !ok {
|
if _, ok := m[fwd]; ok {
|
||||||
// Duplicate registration of same forwarder in set; ignore.
|
// Duplicate registration of same forwarder in set; ignore.
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
@ -712,6 +712,7 @@ func TestForwarderRegistration(t *testing.T) {
|
|||||||
// Adding a dup for a user.
|
// Adding a dup for a user.
|
||||||
wantCounter(&s.multiForwarderCreated, 0)
|
wantCounter(&s.multiForwarderCreated, 0)
|
||||||
s.AddPacketForwarder(u1, testFwd(100))
|
s.AddPacketForwarder(u1, testFwd(100))
|
||||||
|
s.AddPacketForwarder(u1, testFwd(100)) // dup to trigger dup path
|
||||||
want(map[key.Public]PacketForwarder{
|
want(map[key.Public]PacketForwarder{
|
||||||
u1: multiForwarder{
|
u1: multiForwarder{
|
||||||
testFwd(1): 1,
|
testFwd(1): 1,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user