consensus, ethdb, metrics: implement forced-meter (#17667)
This commit is contained in:
		
				
					committed by
					
						
						Péter Szilágyi
					
				
			
			
				
	
			
			
			
						parent
						
							41ac8dd803
						
					
				
				
					commit
					5d1d1a808d
				
			@@ -485,7 +485,7 @@ func New(config Config, notify []string, noverify bool) *Ethash {
 | 
				
			|||||||
		caches:       newlru("cache", config.CachesInMem, newCache),
 | 
							caches:       newlru("cache", config.CachesInMem, newCache),
 | 
				
			||||||
		datasets:     newlru("dataset", config.DatasetsInMem, newDataset),
 | 
							datasets:     newlru("dataset", config.DatasetsInMem, newDataset),
 | 
				
			||||||
		update:       make(chan struct{}),
 | 
							update:       make(chan struct{}),
 | 
				
			||||||
		hashrate:     metrics.NewMeter(),
 | 
							hashrate:     metrics.NewMeterForced(),
 | 
				
			||||||
		workCh:       make(chan *sealTask),
 | 
							workCh:       make(chan *sealTask),
 | 
				
			||||||
		fetchWorkCh:  make(chan *sealWork),
 | 
							fetchWorkCh:  make(chan *sealWork),
 | 
				
			||||||
		submitWorkCh: make(chan *mineResult),
 | 
							submitWorkCh: make(chan *mineResult),
 | 
				
			||||||
@@ -505,7 +505,7 @@ func NewTester(notify []string, noverify bool) *Ethash {
 | 
				
			|||||||
		caches:       newlru("cache", 1, newCache),
 | 
							caches:       newlru("cache", 1, newCache),
 | 
				
			||||||
		datasets:     newlru("dataset", 1, newDataset),
 | 
							datasets:     newlru("dataset", 1, newDataset),
 | 
				
			||||||
		update:       make(chan struct{}),
 | 
							update:       make(chan struct{}),
 | 
				
			||||||
		hashrate:     metrics.NewMeter(),
 | 
							hashrate:     metrics.NewMeterForced(),
 | 
				
			||||||
		workCh:       make(chan *sealTask),
 | 
							workCh:       make(chan *sealTask),
 | 
				
			||||||
		fetchWorkCh:  make(chan *sealWork),
 | 
							fetchWorkCh:  make(chan *sealWork),
 | 
				
			||||||
		submitWorkCh: make(chan *mineResult),
 | 
							submitWorkCh: make(chan *mineResult),
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -155,15 +155,12 @@ func (db *LDBDatabase) LDB() *leveldb.DB {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
// Meter configures the database metrics collectors and
 | 
					// Meter configures the database metrics collectors and
 | 
				
			||||||
func (db *LDBDatabase) Meter(prefix string) {
 | 
					func (db *LDBDatabase) Meter(prefix string) {
 | 
				
			||||||
	if metrics.Enabled {
 | 
						// Initialize all the metrics collector at the requested prefix
 | 
				
			||||||
		// Initialize all the metrics collector at the requested prefix
 | 
						db.compTimeMeter = metrics.NewRegisteredMeter(prefix+"compact/time", nil)
 | 
				
			||||||
		db.compTimeMeter = metrics.NewRegisteredMeter(prefix+"compact/time", nil)
 | 
						db.compReadMeter = metrics.NewRegisteredMeter(prefix+"compact/input", nil)
 | 
				
			||||||
		db.compReadMeter = metrics.NewRegisteredMeter(prefix+"compact/input", nil)
 | 
						db.compWriteMeter = metrics.NewRegisteredMeter(prefix+"compact/output", nil)
 | 
				
			||||||
		db.compWriteMeter = metrics.NewRegisteredMeter(prefix+"compact/output", nil)
 | 
						db.diskReadMeter = metrics.NewRegisteredMeter(prefix+"disk/read", nil)
 | 
				
			||||||
		db.diskReadMeter = metrics.NewRegisteredMeter(prefix+"disk/read", nil)
 | 
						db.diskWriteMeter = metrics.NewRegisteredMeter(prefix+"disk/write", nil)
 | 
				
			||||||
		db.diskWriteMeter = metrics.NewRegisteredMeter(prefix+"disk/write", nil)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	// Initialize write delay metrics no matter we are in metric mode or not.
 | 
					 | 
				
			||||||
	db.writeDelayMeter = metrics.NewRegisteredMeter(prefix+"compact/writedelay/duration", nil)
 | 
						db.writeDelayMeter = metrics.NewRegisteredMeter(prefix+"compact/writedelay/duration", nil)
 | 
				
			||||||
	db.writeDelayNMeter = metrics.NewRegisteredMeter(prefix+"compact/writedelay/counter", nil)
 | 
						db.writeDelayNMeter = metrics.NewRegisteredMeter(prefix+"compact/writedelay/counter", nil)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -17,9 +17,6 @@ type EWMA interface {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
// NewEWMA constructs a new EWMA with the given alpha.
 | 
					// NewEWMA constructs a new EWMA with the given alpha.
 | 
				
			||||||
func NewEWMA(alpha float64) EWMA {
 | 
					func NewEWMA(alpha float64) EWMA {
 | 
				
			||||||
	if !Enabled {
 | 
					 | 
				
			||||||
		return NilEWMA{}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return &StandardEWMA{alpha: alpha}
 | 
						return &StandardEWMA{alpha: alpha}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -29,6 +29,17 @@ func GetOrRegisterMeter(name string, r Registry) Meter {
 | 
				
			|||||||
	return r.GetOrRegister(name, NewMeter).(Meter)
 | 
						return r.GetOrRegister(name, NewMeter).(Meter)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// GetOrRegisterMeterForced returns an existing Meter or constructs and registers a
 | 
				
			||||||
 | 
					// new StandardMeter no matter the global switch is enabled or not.
 | 
				
			||||||
 | 
					// Be sure to unregister the meter from the registry once it is of no use to
 | 
				
			||||||
 | 
					// allow for garbage collection.
 | 
				
			||||||
 | 
					func GetOrRegisterMeterForced(name string, r Registry) Meter {
 | 
				
			||||||
 | 
						if nil == r {
 | 
				
			||||||
 | 
							r = DefaultRegistry
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return r.GetOrRegister(name, NewMeterForced).(Meter)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// NewMeter constructs a new StandardMeter and launches a goroutine.
 | 
					// NewMeter constructs a new StandardMeter and launches a goroutine.
 | 
				
			||||||
// Be sure to call Stop() once the meter is of no use to allow for garbage collection.
 | 
					// Be sure to call Stop() once the meter is of no use to allow for garbage collection.
 | 
				
			||||||
func NewMeter() Meter {
 | 
					func NewMeter() Meter {
 | 
				
			||||||
@@ -46,8 +57,23 @@ func NewMeter() Meter {
 | 
				
			|||||||
	return m
 | 
						return m
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// NewMeter constructs and registers a new StandardMeter and launches a
 | 
					// NewMeterForced constructs a new StandardMeter and launches a goroutine no matter
 | 
				
			||||||
// goroutine.
 | 
					// the global switch is enabled or not.
 | 
				
			||||||
 | 
					// Be sure to call Stop() once the meter is of no use to allow for garbage collection.
 | 
				
			||||||
 | 
					func NewMeterForced() Meter {
 | 
				
			||||||
 | 
						m := newStandardMeter()
 | 
				
			||||||
 | 
						arbiter.Lock()
 | 
				
			||||||
 | 
						defer arbiter.Unlock()
 | 
				
			||||||
 | 
						arbiter.meters[m] = struct{}{}
 | 
				
			||||||
 | 
						if !arbiter.started {
 | 
				
			||||||
 | 
							arbiter.started = true
 | 
				
			||||||
 | 
							go arbiter.tick()
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return m
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// NewRegisteredMeter constructs and registers a new StandardMeter
 | 
				
			||||||
 | 
					// and launches a goroutine.
 | 
				
			||||||
// Be sure to unregister the meter from the registry once it is of no use to
 | 
					// Be sure to unregister the meter from the registry once it is of no use to
 | 
				
			||||||
// allow for garbage collection.
 | 
					// allow for garbage collection.
 | 
				
			||||||
func NewRegisteredMeter(name string, r Registry) Meter {
 | 
					func NewRegisteredMeter(name string, r Registry) Meter {
 | 
				
			||||||
@@ -59,6 +85,19 @@ func NewRegisteredMeter(name string, r Registry) Meter {
 | 
				
			|||||||
	return c
 | 
						return c
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// NewRegisteredMeterForced constructs and registers a new StandardMeter
 | 
				
			||||||
 | 
					// and launches a goroutine no matter the global switch is enabled or not.
 | 
				
			||||||
 | 
					// Be sure to unregister the meter from the registry once it is of no use to
 | 
				
			||||||
 | 
					// allow for garbage collection.
 | 
				
			||||||
 | 
					func NewRegisteredMeterForced(name string, r Registry) Meter {
 | 
				
			||||||
 | 
						c := NewMeterForced()
 | 
				
			||||||
 | 
						if nil == r {
 | 
				
			||||||
 | 
							r = DefaultRegistry
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						r.Register(name, c)
 | 
				
			||||||
 | 
						return c
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// MeterSnapshot is a read-only copy of another Meter.
 | 
					// MeterSnapshot is a read-only copy of another Meter.
 | 
				
			||||||
type MeterSnapshot struct {
 | 
					type MeterSnapshot struct {
 | 
				
			||||||
	count                          int64
 | 
						count                          int64
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user