blob: bebffde32880338fa382c9e03c759e915e4da898 [file] [log] [blame]
package status
import (
"sync"
"time"
)
type ste struct {
status Status
error error
}
type backgroundMonitor struct {
l sync.Locker
m ResourceMonitor
interval time.Duration
cache map[ResourceRef]ste
}
func NewBackgroundMonitor(m ResourceMonitor, interval time.Duration) ResourceMonitor {
return &backgroundMonitor{
&sync.Mutex{},
m,
interval,
map[ResourceRef]ste{},
}
}
func (m *backgroundMonitor) Get(ref ResourceRef) (Status, error) {
m.l.Lock()
defer m.l.Unlock()
if ret, ok := m.cache[ref]; ok {
return ret.status, ret.error
}
m.cache[ref] = ste{StatusNotFound, nil}
go func() {
st, err := m.m.Get(ref)
m.l.Lock()
m.cache[ref] = ste{st, err}
m.l.Unlock()
if IsStatusTerminal(st) {
return
}
time.Sleep(m.interval)
}()
return StatusNotFound, nil
}