blob: 79045f33deccd10da2a2d4a82611a6c80babb1a4 [file] [log] [blame]
// Copyright 2015 The Vanadium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package clock
import (
"math"
"v.io/syncbase/x/ref/services/syncbase/server/util"
"v.io/v23/context"
"v.io/v23/verror"
"v.io/x/lib/vlog"
)
// runNtpCheck talks to an NTP server, fetches the current UTC time from it
// and corrects VClock time.
func (c *VClock) runNtpCheck(ctx *context.T) error {
ntpData, err := c.ntpSource.NtpSync(util.NtpSampleCount)
if err != nil {
vlog.Errorf("Error while fetching ntp time: %v", err)
return err
}
offset := ntpData.offset
data := &ClockData{}
if err := c.sa.GetClockData(ctx, data); err != nil {
if verror.ErrorID(err) == verror.ErrNoExist.ID {
// No ClockData found, write a new one.
writeNewClockData(ctx, c, offset)
return nil
}
vlog.Info("Error while fetching clock data: %v", err)
vlog.Info("Overwriting clock data with NTP")
writeNewClockData(ctx, c, offset)
return nil
}
// Update clock skew if the difference between offset and skew is larger
// than NtpDiffThreshold. NtpDiffThreshold helps avoid constant tweaking of
// the syncbase clock.
if math.Abs(float64(offset.Nanoseconds() - data.Skew)) > util.NtpDiffThreshold {
writeNewClockData(ctx, c, offset)
}
return nil
}