@@ -9,16 +9,19 @@ import (
9
9
10
10
// Aggregator manages and aggregates the statuses of multiple providers.
11
11
type Aggregator struct {
12
- mu sync.RWMutex
13
- name string
14
- providerStatuses map [string ]* rpcstatus.ProviderStatus
12
+ mu sync.RWMutex
13
+ name string
14
+ providerStatuses map [string ]* rpcstatus.ProviderStatus
15
+ lastAggregatedStatus rpcstatus.ProviderStatus
16
+ isLastAggregatedStatusDirty bool
15
17
}
16
18
17
19
// NewAggregator creates a new instance of Aggregator with the given name.
18
20
func NewAggregator (name string ) * Aggregator {
19
21
return & Aggregator {
20
- name : name ,
21
- providerStatuses : make (map [string ]* rpcstatus.ProviderStatus ),
22
+ name : name ,
23
+ providerStatuses : make (map [string ]* rpcstatus.ProviderStatus ),
24
+ isLastAggregatedStatusDirty : true ,
22
25
}
23
26
}
24
27
@@ -37,6 +40,7 @@ func (a *Aggregator) RegisterProvider(providerName string) {
37
40
TotalErrorCount : 0 ,
38
41
}
39
42
}
43
+ a .isLastAggregatedStatusDirty = true
40
44
}
41
45
42
46
// Update modifies the status of a specific provider.
@@ -73,6 +77,7 @@ func (a *Aggregator) Update(providerStatus rpcstatus.ProviderStatus) {
73
77
TotalErrorCount : providerStatus .TotalErrorCount ,
74
78
}
75
79
}
80
+ a .isLastAggregatedStatusDirty = true
76
81
}
77
82
78
83
// UpdateBatch processes a batch of provider statuses.
@@ -91,6 +96,10 @@ func (a *Aggregator) ComputeAggregatedStatus() rpcstatus.ProviderStatus {
91
96
a .mu .RLock ()
92
97
defer a .mu .RUnlock ()
93
98
99
+ if ! a .isLastAggregatedStatusDirty {
100
+ return a .lastAggregatedStatus
101
+ }
102
+
94
103
var lastSuccessAt , lastErrorAt time.Time
95
104
var lastError error
96
105
anyUp := false
@@ -143,6 +152,9 @@ func (a *Aggregator) ComputeAggregatedStatus() rpcstatus.ProviderStatus {
143
152
aggregatedStatus .Status = rpcstatus .StatusDown
144
153
}
145
154
155
+ a .lastAggregatedStatus = aggregatedStatus
156
+ a .isLastAggregatedStatusDirty = false
157
+
146
158
return aggregatedStatus
147
159
}
148
160
0 commit comments