mirror of
https://github.com/luckfox-eng29/kvm.git
synced 2026-01-18 03:28:19 +01:00
feat(ntp): add delay between sync attempts and support NTP servers from DHCP (#162)
* feat(ntp): use ntp server from dhcp info * feat(ntp): use ntp server from dhcp info * feat(ntp): add delay between time sync attempts * chore(ntp): more logging
This commit is contained in:
61
ntp.go
61
ntp.go
@@ -11,20 +11,56 @@ import (
|
||||
"github.com/beevik/ntp"
|
||||
)
|
||||
|
||||
var timeSynced = false
|
||||
const (
|
||||
timeSyncRetryStep = 5 * time.Second
|
||||
timeSyncRetryMaxInt = 1 * time.Minute
|
||||
timeSyncWaitNetChkInt = 100 * time.Millisecond
|
||||
timeSyncWaitNetUpInt = 3 * time.Second
|
||||
timeSyncInterval = 1 * time.Hour
|
||||
timeSyncTimeout = 2 * time.Second
|
||||
)
|
||||
|
||||
var (
|
||||
timeSynced = false
|
||||
timeSyncRetryInterval = 0 * time.Second
|
||||
defaultNTPServers = []string{
|
||||
"time.cloudflare.com",
|
||||
"time.apple.com",
|
||||
}
|
||||
)
|
||||
|
||||
func TimeSyncLoop() {
|
||||
for {
|
||||
fmt.Println("Syncing system time")
|
||||
if !networkState.checked {
|
||||
time.Sleep(timeSyncWaitNetChkInt)
|
||||
continue
|
||||
}
|
||||
|
||||
if !networkState.Up {
|
||||
log.Printf("Waiting for network to come up")
|
||||
time.Sleep(timeSyncWaitNetUpInt)
|
||||
continue
|
||||
}
|
||||
|
||||
log.Printf("Syncing system time")
|
||||
start := time.Now()
|
||||
err := SyncSystemTime()
|
||||
if err != nil {
|
||||
log.Printf("Failed to sync system time: %v", err)
|
||||
|
||||
// retry after a delay
|
||||
timeSyncRetryInterval += timeSyncRetryStep
|
||||
time.Sleep(timeSyncRetryInterval)
|
||||
// reset the retry interval if it exceeds the max interval
|
||||
if timeSyncRetryInterval > timeSyncRetryMaxInt {
|
||||
timeSyncRetryInterval = 0
|
||||
}
|
||||
|
||||
continue
|
||||
}
|
||||
log.Printf("Time sync successful, now is: %v, time taken: %v", time.Now(), time.Since(start))
|
||||
timeSynced = true
|
||||
time.Sleep(1 * time.Hour) //once the first sync is done, sync every hour
|
||||
time.Sleep(timeSyncInterval) // after the first sync is done
|
||||
}
|
||||
}
|
||||
|
||||
@@ -41,13 +77,22 @@ func SyncSystemTime() (err error) {
|
||||
}
|
||||
|
||||
func queryNetworkTime() (*time.Time, error) {
|
||||
ntpServers := []string{
|
||||
"time.cloudflare.com",
|
||||
"time.apple.com",
|
||||
ntpServers, err := getNTPServersFromDHCPInfo()
|
||||
if err != nil {
|
||||
log.Printf("failed to get NTP servers from DHCP info: %v\n", err)
|
||||
}
|
||||
|
||||
if ntpServers == nil {
|
||||
ntpServers = defaultNTPServers
|
||||
log.Printf("Using default NTP servers: %v\n", ntpServers)
|
||||
} else {
|
||||
log.Printf("Using NTP servers from DHCP: %v\n", ntpServers)
|
||||
}
|
||||
|
||||
for _, server := range ntpServers {
|
||||
now, err := queryNtpServer(server, 2*time.Second)
|
||||
now, err := queryNtpServer(server, timeSyncTimeout)
|
||||
if err == nil {
|
||||
log.Printf("NTP server [%s] returned time: %v\n", server, now)
|
||||
return now, nil
|
||||
}
|
||||
}
|
||||
@@ -56,7 +101,7 @@ func queryNetworkTime() (*time.Time, error) {
|
||||
"http://cloudflare.com",
|
||||
}
|
||||
for _, url := range httpUrls {
|
||||
now, err := queryHttpTime(url, 2*time.Second)
|
||||
now, err := queryHttpTime(url, timeSyncTimeout)
|
||||
if err == nil {
|
||||
return now, nil
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user