[PR #6784] [MERGED] [relay] Handle QUIC connections concurrently to prevent handshake head-of-line blocking #28978

Closed
opened 2026-08-05 08:07:14 -04:00 by saavagebueno · 0 comments
Owner

📋 Pull Request Information

Original PR: https://github.com/netbirdio/netbird/pull/6784
Author: @lixmal
Created: 7/15/2026
Status: Merged
Merged: 7/15/2026
Merged by: @lixmal

Base: 0.74.7-branchHead: fix-relay-quic-serial-accept


📝 Commits (1)

  • de16341 Handle QUIC relay connections concurrently to prevent handshake head-of-line blocking

📊 Changes

1 file changed (+4 additions, -1 deletions)

View changed files

📝 relay/server/listener/quic/listener.go (+4 -1)

📄 Description

Describe your changes

The QUIC listener's accept loop ran the per-connection accept handler (which performs the pre-authentication handshake) synchronously, so a single slow or stalled handshake blocked the listener from accepting any further connections. This dispatches the handler in its own goroutine so connections are handled concurrently, matching the WebSocket listener's behavior.

  • Handle incoming QUIC connections concurrently so one slow handshake can't block others

The per-connection handshake stays bounded by the existing handshake timeout.

Stack

  • 0.74.7-branch - ⚠️ No PR associated with branch

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)
  • This change does not modify the public API, gRPC protocols, functionality behavior, CLI / service flags, or introduce a new feature — OR I have discussed it with the NetBird team beforehand (link the issue / Slack thread in the description). See CONTRIBUTING.md.

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)

Internal concurrency change to the relay QUIC listener with no user-facing behavior.

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
    • Improved QUIC connection handling so slow or stalled handshakes no longer block the acceptance of new connections.
    • Maintained existing connection acceptance and shutdown behavior.

🔄 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/6784 **Author:** [@lixmal](https://github.com/lixmal) **Created:** 7/15/2026 **Status:** ✅ Merged **Merged:** 7/15/2026 **Merged by:** [@lixmal](https://github.com/lixmal) **Base:** `0.74.7-branch` ← **Head:** `fix-relay-quic-serial-accept` --- ### 📝 Commits (1) - [`de16341`](https://github.com/netbirdio/netbird/commit/de163410a2298c9385db16ceec968c6e3e463a5b) Handle QUIC relay connections concurrently to prevent handshake head-of-line blocking ### 📊 Changes **1 file changed** (+4 additions, -1 deletions) <details> <summary>View changed files</summary> 📝 `relay/server/listener/quic/listener.go` (+4 -1) </details> ### 📄 Description ## Describe your changes The QUIC listener's accept loop ran the per-connection accept handler (which performs the pre-authentication handshake) synchronously, so a single slow or stalled handshake blocked the listener from accepting any further connections. This dispatches the handler in its own goroutine so connections are handled concurrently, matching the WebSocket listener's behavior. - Handle incoming QUIC connections concurrently so one slow handshake can't block others The per-connection handshake stays bounded by the existing handshake timeout. ## Issue ticket number and link ## Stack - `0.74.7-branch` - :warning: No PR associated with branch <!-- branch-stack --> - \#6784 :point\_left: ### 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) - [x] This change does **not** modify the public API, gRPC protocols, functionality behavior, CLI / service flags, or introduce a new feature — **OR** I have discussed it with the NetBird team beforehand (link the issue / Slack thread in the description). See [CONTRIBUTING.md](https://github.com/netbirdio/netbird/blob/main/CONTRIBUTING.md#discuss-changes-with-the-netbird-team-first). > 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) Internal concurrency change to the relay QUIC listener with no user-facing behavior. ### 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** - Improved QUIC connection handling so slow or stalled handshakes no longer block the acceptance of new connections. - Maintained existing connection acceptance and shutdown behavior. <!-- 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 08:07:14 -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#28978