[PR #4868] [CLOSED] Refactor Darwin sleep/wake handling with channel-based coordination #24352

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

📋 Pull Request Information

Original PR: https://github.com/netbirdio/netbird/pull/4868
Author: @hurricanehrndz
Created: 11/27/2025
Status: Closed

Base: mainHead: darwin_cgo_sleephandler


📝 Commits (4)

  • 7e4e0a0 refactor(darwin): use sleep/wake notifications
  • aa2fea3 Set connecting state earlier
  • 79d240b Enable CGO for Darwin builds
  • 0cafadc refactor(client): extract sleep/wake handling into helper method

📊 Changes

11 files changed (+287 additions, -139 deletions)

View changed files

📝 .goreleaser.yaml (+2 -1)
📝 client/cmd/service_controller.go (+1 -0)
📝 client/internal/connect.go (+51 -4)
📝 client/internal/engine.go (+18 -10)
📝 client/internal/engine_test.go (+13 -5)
📝 client/internal/networkmonitor/check_change_darwin.go (+1 -117)
client/internal/sleephandler/handler_darwin.go (+97 -0)
client/internal/sleephandler/handler_other.go (+33 -0)
📝 client/server/server.go (+68 -2)
📝 go.mod (+1 -0)
📝 go.sum (+2 -0)

📄 Description

Describe your changes

Summary

  • Implement channel-based coordination for sleep/wake events on Darwin systems to prevent engine restarts during system sleep
  • Set connecting state earlier in the connection flow to improve status reporting accuracy

Changes

Sleep/Wake Event Handling:

  • Add sleepChan to ConnectClient for sleep/wake notifications (true = sleep, false = wake)
  • Add restartChan to ConnectClient for network change restart requests
  • Implement new sleephandler package using mac-sleep-notifier library for native macOS sleep/wake detection
  • Remove polling-based kern.sleeptime sysctl approach from network monitor
  • Centralize engine lifecycle control in ConnectClient.run() select loop that serializes sleep, wake, restart, and shutdown events
  • During sleep: engine stops and blocks until wake event, ignoring network monitor restart requests
  • On wake: engine unblocks and restarts cleanly
    Connection State Management:
  • Move StatusConnecting state setting to connectWithRetryRuns for earlier status reporting
  • Add Stop() method to Server to properly cleanup sleep handler

Benefits:

  • Single control point prevents competing lifecycle management
  • Engine won't attempt restart while system is sleeping
  • Clean separation: sleep handler signals, ConnectClient controls
  • Graceful handling when ConnectClient not initialized

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

  • New Features

    • Adds macOS system sleep/wake detection to handle suspend/resume events.
  • Improvements

    • More reliable shutdown of background services for cleaner resource cleanup.
    • Refined engine restart signaling to reduce spurious restarts and improve stability during network changes.
    • Server now better tracks connection state during connect attempts.
  • Bug Fixes

    • Ensures daemon server stops as part of the client shutdown flow.

✏️ Tip: You can customize this high-level summary in your review settings.


🔄 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/4868 **Author:** [@hurricanehrndz](https://github.com/hurricanehrndz) **Created:** 11/27/2025 **Status:** ❌ Closed **Base:** `main` ← **Head:** `darwin_cgo_sleephandler` --- ### 📝 Commits (4) - [`7e4e0a0`](https://github.com/netbirdio/netbird/commit/7e4e0a04847f3ab176468337f713434046dcbb91) refactor(darwin): use sleep/wake notifications - [`aa2fea3`](https://github.com/netbirdio/netbird/commit/aa2fea3b701127de6b8e402bee2d0e15d380facd) Set connecting state earlier - [`79d240b`](https://github.com/netbirdio/netbird/commit/79d240b87f4b4a34cfd2910d72b07fc230e210df) Enable CGO for Darwin builds - [`0cafadc`](https://github.com/netbirdio/netbird/commit/0cafadc72858239c4eb360e9723b104267449737) refactor(client): extract sleep/wake handling into helper method ### 📊 Changes **11 files changed** (+287 additions, -139 deletions) <details> <summary>View changed files</summary> 📝 `.goreleaser.yaml` (+2 -1) 📝 `client/cmd/service_controller.go` (+1 -0) 📝 `client/internal/connect.go` (+51 -4) 📝 `client/internal/engine.go` (+18 -10) 📝 `client/internal/engine_test.go` (+13 -5) 📝 `client/internal/networkmonitor/check_change_darwin.go` (+1 -117) ➕ `client/internal/sleephandler/handler_darwin.go` (+97 -0) ➕ `client/internal/sleephandler/handler_other.go` (+33 -0) 📝 `client/server/server.go` (+68 -2) 📝 `go.mod` (+1 -0) 📝 `go.sum` (+2 -0) </details> ### 📄 Description ## Describe your changes ### Summary - Implement channel-based coordination for sleep/wake events on Darwin systems to prevent engine restarts during system sleep - Set connecting state earlier in the connection flow to improve status reporting accuracy ### Changes Sleep/Wake Event Handling: - Add sleepChan to ConnectClient for sleep/wake notifications (true = sleep, false = wake) - Add restartChan to ConnectClient for network change restart requests - Implement new sleephandler package using mac-sleep-notifier library for native macOS sleep/wake detection - Remove polling-based kern.sleeptime sysctl approach from network monitor - Centralize engine lifecycle control in ConnectClient.run() select loop that serializes sleep, wake, restart, and shutdown events - During sleep: engine stops and blocks until wake event, ignoring network monitor restart requests - On wake: engine unblocks and restarts cleanly Connection State Management: - Move StatusConnecting state setting to connectWithRetryRuns for earlier status reporting - Add Stop() method to Server to properly cleanup sleep handler ### Benefits: - Single control point prevents competing lifecycle management - Engine won't attempt restart while system is sleeping - Clean separation: sleep handler signals, ConnectClient controls - Graceful handling when ConnectClient not initialized ## Issue ticket number and link ## Stack <!-- branch-stack --> ### Checklist - [ ] Is it a bug fix - [ ] Is a typo/documentation fix - [ ] Is a feature enhancement - [x] 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 * **New Features** * Adds macOS system sleep/wake detection to handle suspend/resume events. * **Improvements** * More reliable shutdown of background services for cleaner resource cleanup. * Refined engine restart signaling to reduce spurious restarts and improve stability during network changes. * Server now better tracks connection state during connect attempts. * **Bug Fixes** * Ensures daemon server stops as part of the client shutdown flow. <sub>✏️ Tip: You can customize this high-level summary in your review settings.</sub> <!-- 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:35 -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#24352