mirror of
https://github.com/coredns/coredns.git
synced 2026-04-14 16:05:33 -04:00
65 lines
1.3 KiB
Go
65 lines
1.3 KiB
Go
package ready
|
|
|
|
import (
|
|
"sort"
|
|
"strings"
|
|
"sync"
|
|
)
|
|
|
|
// list is a structure that holds the plugins that signals readiness for this server block.
|
|
type list struct {
|
|
sync.RWMutex
|
|
rs map[string]Readiness
|
|
|
|
// keepReadiness indicates whether the readiness status of plugins should be retained
|
|
// after they have been confirmed as ready. When set to false, the plugin readiness
|
|
// status will be reset to nil to conserve resources, assuming ready plugins don't
|
|
// need continuous monitoring.
|
|
keepReadiness bool
|
|
}
|
|
|
|
// Reset resets l
|
|
func (l *list) Reset() {
|
|
l.Lock()
|
|
defer l.Unlock()
|
|
l.rs = nil
|
|
}
|
|
|
|
// Append adds a new readiness to l.
|
|
func (l *list) Append(r Readiness, name string) {
|
|
l.Lock()
|
|
defer l.Unlock()
|
|
|
|
if l.rs == nil {
|
|
l.rs = make(map[string]Readiness)
|
|
}
|
|
l.rs[name] = r
|
|
}
|
|
|
|
// Ready return true when all plugins ready, if the returned value is false the string
|
|
// contains a comma separated list of plugins that are not ready.
|
|
func (l *list) Ready() (bool, string) {
|
|
l.Lock()
|
|
defer l.Unlock()
|
|
ok := true
|
|
s := []string{}
|
|
for name, r := range l.rs {
|
|
if r == nil {
|
|
continue
|
|
}
|
|
if r.Ready() {
|
|
if !l.keepReadiness {
|
|
l.rs[name] = nil
|
|
}
|
|
continue
|
|
}
|
|
ok = false
|
|
s = append(s, name)
|
|
}
|
|
if ok {
|
|
return true, ""
|
|
}
|
|
sort.Strings(s)
|
|
return false, strings.Join(s, ",")
|
|
}
|