mirror of https://github.com/status-im/consul.git
agent: Cleanup handling of defer checks
This commit is contained in:
parent
87373787e2
commit
8c9ab7ba58
|
@ -18,9 +18,8 @@ const (
|
|||
// syncStatus is used to represent the difference between
|
||||
// the local and remote state, and if action needs to be taken
|
||||
type syncStatus struct {
|
||||
remoteDelete bool // Should this be deleted from the server
|
||||
inSync bool // Is this in sync with the server
|
||||
deferSync *time.Timer // Defer sync until this time
|
||||
remoteDelete bool // Should this be deleted from the server
|
||||
inSync bool // Is this in sync with the server
|
||||
}
|
||||
|
||||
// localState is used to represent the node's services,
|
||||
|
@ -48,6 +47,9 @@ type localState struct {
|
|||
checks map[string]*structs.HealthCheck
|
||||
checkStatus map[string]syncStatus
|
||||
|
||||
// Used to track checks that are being defered
|
||||
deferCheck map[string]*time.Timer
|
||||
|
||||
// consulCh is used to inform of a change to the known
|
||||
// consul nodes. This may be used to retry a sync run
|
||||
consulCh chan struct{}
|
||||
|
@ -65,6 +67,7 @@ func (l *localState) Init(config *Config, logger *log.Logger) {
|
|||
l.serviceStatus = make(map[string]syncStatus)
|
||||
l.checks = make(map[string]*structs.HealthCheck)
|
||||
l.checkStatus = make(map[string]syncStatus)
|
||||
l.deferCheck = make(map[string]*time.Timer)
|
||||
l.consulCh = make(chan struct{}, 1)
|
||||
l.triggerCh = make(chan struct{}, 1)
|
||||
}
|
||||
|
@ -198,18 +201,17 @@ func (l *localState) UpdateCheck(checkID, status, output string) {
|
|||
// change we do the write immediately.
|
||||
if l.config.CheckUpdateInterval > 0 && check.Status == status {
|
||||
check.Output = output
|
||||
status := l.checkStatus[checkID]
|
||||
if status.deferSync == nil && status.inSync {
|
||||
if _, ok := l.deferCheck[checkID]; !ok {
|
||||
deferSync := time.AfterFunc(l.config.CheckUpdateInterval, func() {
|
||||
l.Lock()
|
||||
status, ok := l.checkStatus[checkID]
|
||||
if ok && status.inSync {
|
||||
if _, ok := l.checkStatus[checkID]; ok {
|
||||
l.checkStatus[checkID] = syncStatus{inSync: false}
|
||||
l.changeMade()
|
||||
}
|
||||
delete(l.deferCheck, checkID)
|
||||
l.Unlock()
|
||||
})
|
||||
l.checkStatus[checkID] = syncStatus{inSync: true, deferSync: deferSync}
|
||||
l.deferCheck[checkID] = deferSync
|
||||
}
|
||||
return
|
||||
}
|
||||
|
@ -387,6 +389,12 @@ func (l *localState) syncChanges() error {
|
|||
return err
|
||||
}
|
||||
} else if !status.inSync {
|
||||
// Cancel a defered sync
|
||||
if timer := l.deferCheck[id]; timer != nil {
|
||||
timer.Stop()
|
||||
delete(l.deferCheck, id)
|
||||
}
|
||||
|
||||
if err := l.syncCheck(id); err != nil {
|
||||
return err
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue