reduce lock contention
This commit is contained in:
parent
a11c005492
commit
44fab9eab5
17
exporter.go
17
exporter.go
|
@ -78,6 +78,7 @@ type AccountTx struct {
|
||||||
// Hotspot represents a hotspot
|
// Hotspot represents a hotspot
|
||||||
type Hotspot struct {
|
type Hotspot struct {
|
||||||
Address string
|
Address string
|
||||||
|
UpdateLock sync.Mutex
|
||||||
LastUpdate time.Time
|
LastUpdate time.Time
|
||||||
RewardsTotal map[string]int
|
RewardsTotal map[string]int
|
||||||
}
|
}
|
||||||
|
@ -667,6 +668,11 @@ func (e *Exporter) collectHotspotMetrics(wg *sync.WaitGroup, ch chan<- prometheu
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// create the hotspot object if it doesn't exist
|
||||||
|
if _, ok := account.Hotspots[hotspotData.Address]; !ok {
|
||||||
|
account.Hotspots[hotspotData.Address] = NewHotspot(hotspotData.Address)
|
||||||
|
}
|
||||||
|
|
||||||
// collect hotspot metric requiring extra queries in a new routine
|
// collect hotspot metric requiring extra queries in a new routine
|
||||||
wg.Add(4)
|
wg.Add(4)
|
||||||
go e.collectHotspotBlocksDeltaMetrics(wg, ch, account, hotspotData)
|
go e.collectHotspotBlocksDeltaMetrics(wg, ch, account, hotspotData)
|
||||||
|
@ -791,16 +797,15 @@ func (e *Exporter) collectHotspotRewardsMetrics(wg *sync.WaitGroup, ch chan<- pr
|
||||||
"rewards_v2",
|
"rewards_v2",
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: optimize locks
|
|
||||||
account.UpdateLock.Lock()
|
|
||||||
defer account.UpdateLock.Unlock()
|
|
||||||
|
|
||||||
hotspot, ok := account.Hotspots[hotspotData.Address]
|
hotspot, ok := account.Hotspots[hotspotData.Address]
|
||||||
if !ok {
|
if !ok {
|
||||||
hotspot = NewHotspot(hotspotData.Address)
|
log.Fatalf("BUG: attempted to access hotspot %v before it was created", hotspotData.Address)
|
||||||
account.Hotspots[hotspotData.Address] = hotspot
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
hotspot.UpdateLock.Lock()
|
||||||
|
defer hotspot.UpdateLock.Unlock()
|
||||||
|
|
||||||
// We want to keep in memory the timestamp of the last activity we
|
// We want to keep in memory the timestamp of the last activity we
|
||||||
// received from the api. We cannot do something naive like [lastscrape, now]
|
// received from the api. We cannot do something naive like [lastscrape, now]
|
||||||
// because the api can take a few seconds to sync with the chain and
|
// because the api can take a few seconds to sync with the chain and
|
||||||
|
|
Reference in New Issue