lib/storage: check for prevHourMetricIDs cache before falling back to checking for (date, metricID) entries during data ingestion

This should reduce possible CPU usage spikes at the beginning of every hour.

See https://github.com/VictoriaMetrics/VictoriaMetrics/issues/1046
This commit is contained in:
Aliaksandr Valialkin 2021-02-04 18:46:20 +02:00
parent b44edc7832
commit 83d3e582ab

View File

@ -1573,6 +1573,8 @@ func (s *Storage) updatePerDateData(rows []rawRow) error {
prevMetricID uint64
)
hm := s.currHourMetricIDs.Load().(*hourMetricIDs)
hmPrev := s.prevHourMetricIDs.Load().(*hourMetricIDs)
hmPrevDate := hmPrev.hour / 24
nextDayMetricIDs := &s.nextDayMetricIDs.Load().(*byDateMetricIDEntry).v
todayShare16bit := uint64((float64(fasttime.UnixTimestamp()%(3600*24)) / (3600 * 24)) * (1 << 16))
type pendingDateMetricID struct {
@ -1613,6 +1615,10 @@ func (s *Storage) updatePerDateData(rows []rawRow) error {
s.pendingHourEntriesLock.Lock()
s.pendingHourEntries.Add(metricID)
s.pendingHourEntriesLock.Unlock()
if date == hmPrevDate && hmPrev.m.Has(metricID) {
// The metricID is already registered for the current day on the previous hour.
continue
}
}
// Slower path: check global cache for (date, metricID) entry.