[PR #4791] [CLOSED] [relay-server] Fix race condition in relay peer reconnection handling #24134

Open
opened 2026-08-05 06:08:18 -04:00 by saavagebueno · 0 comments
Owner

📋 Pull Request Information

Original PR: https://github.com/netbirdio/netbird/pull/4791
Author: @pappz
Created: 11/14/2025
Status: Closed

Base: mainHead: fix/relay-reconnection-race


📝 Commits (4)

  • 605d44c Fix race condition in relay peer reconnection handling
  • 72f65c6 Add devcert tag for CI test to test the race connection
  • 0781908 Add -v for race detector
  • ca9985d Add options for manager to avoid race in tests

📊 Changes

7 files changed (+198 additions, -41 deletions)

View changed files

📝 .github/workflows/golang-test-linux.yml (+2 -1)
📝 client/internal/connect.go (+3 -1)
📝 client/internal/engine_test.go (+9 -7)
📝 relay/server/relay.go (+1 -0)
📝 shared/relay/client/client_test.go (+111 -12)
📝 shared/relay/client/manager.go (+55 -7)
📝 shared/relay/client/manager_test.go (+17 -13)

📄 Description

When a peer reconnects with the same ID, other peers were not reliably notified that the old connection went offline. This caused "connection already exists" errors when attempting to establish new connections to the reconnected peer.

The issue occurred because the old peer's cleanup notification raced with the new peer's online notification. If reconnection happened before cleanup, the offline notification was silently dropped.

The fix sends an offline notification synchronously during reconnection (when AddPeer returns true), ensuring all subscribed peers receive events in the correct order (offline → online).

Added TestBindReconnectRace to validate the fix with 1000 reconnection iterations.

Describe your changes

Stack

Checklist

  • Is it a bug fix
  • Is a typo/documentation fix
  • Is a feature enhancement
  • It is a refactor
  • Created tests that fail without the change (if possible)

By submitting this pull request, you confirm that you have read and agree to the terms of the Contributor License Agreement.

Documentation

Select exactly one:

  • I added/updated documentation for this change
  • Documentation is not needed for this change (explain why)

Docs PR URL (required if "docs added" is checked)

Paste the PR link from https://github.com/netbirdio/docs here:

https://github.com/netbirdio/docs/pull/__

Summary by CodeRabbit

  • Bug Fixes

    • Reconnection flow now emits offline/online notifications to keep peer state consistent.
  • Tests

    • Added a repeatable race-detection test for reconnect scenarios and made critical test failures fail-fast; improved test cleanup and logging.
  • Chores

    • CI test workflow updated to enable additional test tags and more verbose race-mode output.
  • Refactor

    • Manager construction changed to use a per-instance options struct, exposing configurable MTU, cleanup interval, and idle timeout.

🔄 This issue represents a GitHub Pull Request. It cannot be merged through Gitea due to API limitations.

## 📋 Pull Request Information **Original PR:** https://github.com/netbirdio/netbird/pull/4791 **Author:** [@pappz](https://github.com/pappz) **Created:** 11/14/2025 **Status:** ❌ Closed **Base:** `main` ← **Head:** `fix/relay-reconnection-race` --- ### 📝 Commits (4) - [`605d44c`](https://github.com/netbirdio/netbird/commit/605d44c4f985c9faf5c6a4750db0d1147736d396) Fix race condition in relay peer reconnection handling - [`72f65c6`](https://github.com/netbirdio/netbird/commit/72f65c63d36c11ff14a97d2910fe269192938dda) Add devcert tag for CI test to test the race connection - [`0781908`](https://github.com/netbirdio/netbird/commit/0781908df56c42a7697a8b38c46a91b966b9fe53) Add -v for race detector - [`ca9985d`](https://github.com/netbirdio/netbird/commit/ca9985d2e33dde925e6ba36a1360090f950e1c63) Add options for manager to avoid race in tests ### 📊 Changes **7 files changed** (+198 additions, -41 deletions) <details> <summary>View changed files</summary> 📝 `.github/workflows/golang-test-linux.yml` (+2 -1) 📝 `client/internal/connect.go` (+3 -1) 📝 `client/internal/engine_test.go` (+9 -7) 📝 `relay/server/relay.go` (+1 -0) 📝 `shared/relay/client/client_test.go` (+111 -12) 📝 `shared/relay/client/manager.go` (+55 -7) 📝 `shared/relay/client/manager_test.go` (+17 -13) </details> ### 📄 Description When a peer reconnects with the same ID, other peers were not reliably notified that the old connection went offline. This caused "connection already exists" errors when attempting to establish new connections to the reconnected peer. The issue occurred because the old peer's cleanup notification raced with the new peer's online notification. If reconnection happened before cleanup, the offline notification was silently dropped. The fix sends an offline notification synchronously during reconnection (when AddPeer returns true), ensuring all subscribed peers receive events in the correct order (offline → online). Added TestBindReconnectRace to validate the fix with 1000 reconnection iterations. ## Describe your changes ## Issue ticket number and link ## Stack <!-- branch-stack --> ### Checklist - [x] Is it a bug fix - [ ] Is a typo/documentation fix - [ ] Is a feature enhancement - [ ] It is a refactor - [ ] Created tests that fail without the change (if possible) > By submitting this pull request, you confirm that you have read and agree to the terms of the [Contributor License Agreement](https://github.com/netbirdio/netbird/blob/main/CONTRIBUTOR_LICENSE_AGREEMENT.md). ## Documentation Select exactly one: - [ ] I added/updated documentation for this change - [x] Documentation is **not needed** for this change (explain why) ### Docs PR URL (required if "docs added" is checked) Paste the PR link from https://github.com/netbirdio/docs here: https://github.com/netbirdio/docs/pull/__ <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **Bug Fixes** * Reconnection flow now emits offline/online notifications to keep peer state consistent. * **Tests** * Added a repeatable race-detection test for reconnect scenarios and made critical test failures fail-fast; improved test cleanup and logging. * **Chores** * CI test workflow updated to enable additional test tags and more verbose race-mode output. * **Refactor** * Manager construction changed to use a per-instance options struct, exposing configurable MTU, cleanup interval, and idle timeout. <!-- end of auto-generated comment: release notes by coderabbit.ai --> --- <sub>🔄 This issue represents a GitHub Pull Request. It cannot be merged through Gitea due to API limitations.</sub>
saavagebueno added the pull-request label 2026-08-05 06:08:18 -04:00
Sign in to join this conversation.
No Label pull-request
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: DYNR/netbird#24134