fix(network): only trigger time sync when network transitions to online rather than every state change

This commit is contained in:
Siyuan 2025-11-20 20:24:17 +00:00
parent 61c2fa4a88
commit 86be6df1d3
2 changed files with 23 additions and 6 deletions

View File

@ -101,15 +101,22 @@ func supervise() error {
cmd.Args = os.Args cmd.Args = os.Args
logFile, err := os.CreateTemp("", "jetkvm-stdout.log") logFile, err := os.CreateTemp("", "jetkvm-stdout.log")
defer func() {
// we don't care about the errors here
_ = logFile.Close()
_ = os.Remove(logFile.Name())
}()
if err != nil { if err != nil {
return fmt.Errorf("failed to create log file: %w", err) return fmt.Errorf("failed to create log file: %w", err)
} }
logFileName := logFile.Name()
defer func() {
// Close file if it's still open (safe to call even if already closed)
if logFile != nil {
_ = logFile.Close()
}
// Only remove if file still exists at original location (wasn't renamed)
if _, err := os.Stat(logFileName); err == nil {
_ = os.Remove(logFileName)
}
}()
// Use io.MultiWriter to write to both the original streams and our buffers // Use io.MultiWriter to write to both the original streams and our buffers
cmd.Stdout = io.MultiWriter(os.Stdout, logFile) cmd.Stdout = io.MultiWriter(os.Stdout, logFile)
cmd.Stderr = io.MultiWriter(os.Stderr, logFile) cmd.Stderr = io.MultiWriter(os.Stderr, logFile)
@ -133,6 +140,8 @@ func supervise() error {
} }
if exiterr, ok := cmdErr.(*exec.ExitError); ok { if exiterr, ok := cmdErr.(*exec.ExitError); ok {
// createErrorDump will close and rename the file if successful
// Note: os.Exit bypasses defer, but file is already handled by createErrorDump
createErrorDump(logFile) createErrorDump(logFile)
os.Exit(exiterr.ExitCode()) os.Exit(exiterr.ExitCode())
} }

View File

@ -6,6 +6,7 @@ import (
"net" "net"
"net/http" "net/http"
"reflect" "reflect"
"sync/atomic"
"time" "time"
"github.com/jetkvm/kvm/internal/confparser" "github.com/jetkvm/kvm/internal/confparser"
@ -118,6 +119,10 @@ func setPublicIPReadyState(ipv4Ready, ipv6Ready bool) {
publicIPState.SetIPv4AndIPv6(ipv4Ready, ipv6Ready) publicIPState.SetIPv4AndIPv6(ipv4Ready, ipv6Ready)
} }
var (
isOnline = &atomic.Bool{}
)
func networkStateChanged(_ string, state types.InterfaceState) { func networkStateChanged(_ string, state types.InterfaceState) {
// do not block the main thread // do not block the main thread
go waitCtrlAndRequestDisplayUpdate(true, "network_state_changed") go waitCtrlAndRequestDisplayUpdate(true, "network_state_changed")
@ -126,7 +131,10 @@ func networkStateChanged(_ string, state types.InterfaceState) {
writeJSONRPCEvent("networkState", state.ToRpcInterfaceState(), currentSession) writeJSONRPCEvent("networkState", state.ToRpcInterfaceState(), currentSession)
} }
if state.Online { previousOnline := isOnline.Load()
isOnline.Store(state.Online)
if state.Online && !previousOnline {
networkLogger.Info().Msg("network state changed to online, triggering time sync") networkLogger.Info().Msg("network state changed to online, triggering time sync")
triggerTimeSyncOnNetworkStateChange() triggerTimeSyncOnNetworkStateChange()
} }