From 77089ea4977b4af38e423a788d068bc9fdf68d36 Mon Sep 17 00:00:00 2001 From: Qishuai Liu Date: Tue, 6 May 2025 22:50:27 +0900 Subject: [PATCH 1/2] fix(ntp): prevent panic on NTP query error and add IPv6 server in defaultNTPServers --- internal/timesync/ntp.go | 41 ++++++++++++++++++++-------------------- 1 file changed, 21 insertions(+), 20 deletions(-) diff --git a/internal/timesync/ntp.go b/internal/timesync/ntp.go index 41656b7..33340ed 100644 --- a/internal/timesync/ntp.go +++ b/internal/timesync/ntp.go @@ -13,7 +13,8 @@ var defaultNTPServers = []string{ "time.aws.com", "time.windows.com", "time.google.com", - "162.159.200.123", // time.cloudflare.com + "162.159.200.123", // time.cloudflare.com IPv4 + "2606:4700:f1::123", // time.cloudflare.com IPv6 "0.pool.ntp.org", "1.pool.ntp.org", "2.pool.ntp.org", @@ -57,6 +58,12 @@ func (t *TimeSync) queryMultipleNTP(servers []string, timeout time.Duration) (no // query the server now, response, err := queryNtpServer(server, timeout) + if err != nil { + scopedLogger.Warn(). + Str("error", err.Error()). + Msg("failed to query NTP server") + return + } // set the last RTT metricNtpServerLastRTT.WithLabelValues( @@ -76,26 +83,20 @@ func (t *TimeSync) queryMultipleNTP(servers []string, timeout time.Duration) (no strconv.Itoa(int(response.Precision)), ).Set(1) - if err == nil { - // increase success count - metricNtpTotalSuccessCount.Inc() - metricNtpSuccessCount.WithLabelValues(server).Inc() + // increase success count + metricNtpTotalSuccessCount.Inc() + metricNtpSuccessCount.WithLabelValues(server).Inc() - scopedLogger.Info(). - Str("time", now.Format(time.RFC3339)). - Str("reference", response.ReferenceString()). - Str("rtt", response.RTT.String()). - Str("clockOffset", response.ClockOffset.String()). - Uint8("stratum", response.Stratum). - Msg("NTP server returned time") - results <- &ntpResult{ - now: now, - offset: &response.ClockOffset, - } - } else { - scopedLogger.Warn(). - Str("error", err.Error()). - Msg("failed to query NTP server") + scopedLogger.Info(). + Str("time", now.Format(time.RFC3339)). + Str("reference", response.ReferenceString()). + Str("rtt", response.RTT.String()). + Str("clockOffset", response.ClockOffset.String()). + Uint8("stratum", response.Stratum). + Msg("NTP server returned time") + results <- &ntpResult{ + now: now, + offset: &response.ClockOffset, } }(server) } From c13e1e11c5dbc0d11befdf096bb5a982c9b93a58 Mon Sep 17 00:00:00 2001 From: Qishuai Liu Date: Thu, 8 May 2025 11:31:40 +0900 Subject: [PATCH 2/2] fix(ntp): make sure queryMultipleNTP finish if all servers failed --- internal/timesync/ntp.go | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/internal/timesync/ntp.go b/internal/timesync/ntp.go index 33340ed..d45112c 100644 --- a/internal/timesync/ntp.go +++ b/internal/timesync/ntp.go @@ -62,6 +62,7 @@ func (t *TimeSync) queryMultipleNTP(servers []string, timeout time.Duration) (no scopedLogger.Warn(). Str("error", err.Error()). Msg("failed to query NTP server") + results <- nil return } @@ -101,8 +102,15 @@ func (t *TimeSync) queryMultipleNTP(servers []string, timeout time.Duration) (no }(server) } - result := <-results - return result.now, result.offset + for range servers { + result := <-results + if result == nil { + continue + } + now, offset = result.now, result.offset + return + } + return } func queryNtpServer(server string, timeout time.Duration) (now *time.Time, response *ntp.Response, err error) {