blob: bebffde32880338fa382c9e03c759e915e4da898 [file] [log] [blame]
giof8acc612025-04-26 08:20:55 +04001package status
2
3import (
4 "sync"
5 "time"
6)
7
8type ste struct {
9 status Status
10 error error
11}
12
13type backgroundMonitor struct {
14 l sync.Locker
15 m ResourceMonitor
16 interval time.Duration
17 cache map[ResourceRef]ste
18}
19
20func NewBackgroundMonitor(m ResourceMonitor, interval time.Duration) ResourceMonitor {
21 return &backgroundMonitor{
22 &sync.Mutex{},
23 m,
24 interval,
25 map[ResourceRef]ste{},
26 }
27}
28
29func (m *backgroundMonitor) Get(ref ResourceRef) (Status, error) {
30 m.l.Lock()
31 defer m.l.Unlock()
32 if ret, ok := m.cache[ref]; ok {
33 return ret.status, ret.error
34 }
35 m.cache[ref] = ste{StatusNotFound, nil}
36 go func() {
37 st, err := m.m.Get(ref)
38 m.l.Lock()
39 m.cache[ref] = ste{st, err}
40 m.l.Unlock()
41 if IsStatusTerminal(st) {
42 return
43 }
44 time.Sleep(m.interval)
45 }()
46 return StatusNotFound, nil
47}