-
Notifications
You must be signed in to change notification settings - Fork 0
/
ntp_time_provider.go
72 lines (58 loc) · 1.72 KB
/
ntp_time_provider.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
package ntp_time_provider
import (
"context"
"github.com/beevik/ntp"
"github.com/storage-lock/go-events"
"github.com/storage-lock/go-storage"
"time"
)
// NTPTimeProvider 基于NTP的时间源实现
type NTPTimeProvider struct {
e *events.Event
ntpServers []string
}
var _ storage.TimeProvider = &NTPTimeProvider{}
// NewNTPTimeProvider 如果是在云环境内网的话,手动指定一个内网的ntp服务器速度会更快,云服务商一般都会提供内网的ntp服务器
func NewNTPTimeProvider(e *events.Event, ntpServers ...string) *NTPTimeProvider {
if len(ntpServers) == 0 {
ntpServers = DefaultNtpServers
}
return &NTPTimeProvider{
e: e,
ntpServers: ntpServers,
}
}
func (x *NTPTimeProvider) SetEvent(e *events.Event) *NTPTimeProvider {
x.e = e
return x
}
// GetTime 从NTP获取时间,当不方便从Storage获取时间的时候可以使用NTP作为时间源
func (x *NTPTimeProvider) GetTime(ctx context.Context) (time.Time, error) {
var lastError error
for _, server := range x.ntpServers {
now, err := ntp.Time(server)
if err != nil {
if x.e != nil {
x.e.AddAction(events.NewAction(ActionNtpError).SetErr(err)).Publish(ctx)
}
lastError = err
continue
}
if now.IsZero() {
if x.e != nil {
x.e.AddAction(events.NewAction(ActionNtpZero)).Publish(ctx)
}
continue
}
if x.e != nil {
x.e.AddAction(events.NewAction(ActionNtpSuccess).AddPayload("time", now)).Publish(ctx)
}
return now, nil
}
if lastError != nil {
return time.Time{}, ErrTimeProviderUnavailable
} else {
return time.Time{}, ErrTimeProviderUnavailable
}
}
// ------------------------------------------------- --------------------------------------------------------------------