Skip to content

Commit 0bdb88a

Browse files
committed
chore_: cache aggregated status for efficiency
1 parent f1f53eb commit 0bdb88a

File tree

1 file changed

+17
-5
lines changed

1 file changed

+17
-5
lines changed

healthmanager/aggregator/aggregator.go

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,16 +9,19 @@ import (
99

1010
// Aggregator manages and aggregates the statuses of multiple providers.
1111
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
1517
}
1618

1719
// NewAggregator creates a new instance of Aggregator with the given name.
1820
func NewAggregator(name string) *Aggregator {
1921
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,
2225
}
2326
}
2427

@@ -37,6 +40,7 @@ func (a *Aggregator) RegisterProvider(providerName string) {
3740
TotalErrorCount: 0,
3841
}
3942
}
43+
a.isLastAggregatedStatusDirty = true
4044
}
4145

4246
// Update modifies the status of a specific provider.
@@ -73,6 +77,7 @@ func (a *Aggregator) Update(providerStatus rpcstatus.ProviderStatus) {
7377
TotalErrorCount: providerStatus.TotalErrorCount,
7478
}
7579
}
80+
a.isLastAggregatedStatusDirty = true
7681
}
7782

7883
// UpdateBatch processes a batch of provider statuses.
@@ -91,6 +96,10 @@ func (a *Aggregator) ComputeAggregatedStatus() rpcstatus.ProviderStatus {
9196
a.mu.RLock()
9297
defer a.mu.RUnlock()
9398

99+
if !a.isLastAggregatedStatusDirty {
100+
return a.lastAggregatedStatus
101+
}
102+
94103
var lastSuccessAt, lastErrorAt time.Time
95104
var lastError error
96105
anyUp := false
@@ -143,6 +152,9 @@ func (a *Aggregator) ComputeAggregatedStatus() rpcstatus.ProviderStatus {
143152
aggregatedStatus.Status = rpcstatus.StatusDown
144153
}
145154

155+
a.lastAggregatedStatus = aggregatedStatus
156+
a.isLastAggregatedStatusDirty = false
157+
146158
return aggregatedStatus
147159
}
148160

0 commit comments

Comments
 (0)