mirror of
				https://github.com/coredns/coredns.git
				synced 2025-11-03 17:51:23 +01:00 
			
		
		
		
	* Rename middleware to plugin first pass; mostly used 'sed', few spots where I manually changed text. This still builds a coredns binary. * fmt error * Rename AddMiddleware to AddPlugin * Readd AddMiddleware to remain backwards compat
		
			
				
	
	
		
			56 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			56 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
// Package freq keeps track of last X seen events. The events themselves are not stored
 | 
						|
// here. So the Freq type should be added next to the thing it is tracking.
 | 
						|
package freq
 | 
						|
 | 
						|
import (
 | 
						|
	"sync"
 | 
						|
	"time"
 | 
						|
)
 | 
						|
 | 
						|
// Freq tracks the frequencies of things.
 | 
						|
type Freq struct {
 | 
						|
	// Last time we saw a query for this element.
 | 
						|
	last time.Time
 | 
						|
	// Number of this in the last time slice.
 | 
						|
	hits int
 | 
						|
 | 
						|
	sync.RWMutex
 | 
						|
}
 | 
						|
 | 
						|
// New returns a new initialized Freq.
 | 
						|
func New(t time.Time) *Freq {
 | 
						|
	return &Freq{last: t, hits: 0}
 | 
						|
}
 | 
						|
 | 
						|
// Update updates the number of hits. Last time seen will be set to now.
 | 
						|
// If the last time we've seen this entity is within now - d, we increment hits, otherwise
 | 
						|
// we reset hits to 1. It returns the number of hits.
 | 
						|
func (f *Freq) Update(d time.Duration, now time.Time) int {
 | 
						|
	earliest := now.Add(-1 * d)
 | 
						|
	f.Lock()
 | 
						|
	defer f.Unlock()
 | 
						|
	if f.last.Before(earliest) {
 | 
						|
		f.last = now
 | 
						|
		f.hits = 1
 | 
						|
		return f.hits
 | 
						|
	}
 | 
						|
	f.last = now
 | 
						|
	f.hits++
 | 
						|
	return f.hits
 | 
						|
}
 | 
						|
 | 
						|
// Hits returns the number of hits that we have seen, according to the updates we have done to f.
 | 
						|
func (f *Freq) Hits() int {
 | 
						|
	f.RLock()
 | 
						|
	defer f.RUnlock()
 | 
						|
	return f.hits
 | 
						|
}
 | 
						|
 | 
						|
// Reset resets f to time t and hits to hits.
 | 
						|
func (f *Freq) Reset(t time.Time, hits int) {
 | 
						|
	f.Lock()
 | 
						|
	defer f.Unlock()
 | 
						|
	f.last = t
 | 
						|
	f.hits = hits
 | 
						|
}
 |