Rewrite console throttling logic; drop complex timer usage and use a very simple throttle
This also removes server process termination logic when a server is breaching the output limits. It simply continues to efficiently throttle the console output.
This commit is contained in:
@@ -4,7 +4,6 @@ import (
|
||||
"context"
|
||||
"fmt"
|
||||
"os"
|
||||
"sync"
|
||||
"time"
|
||||
|
||||
"emperror.dev/errors"
|
||||
@@ -41,85 +40,6 @@ func (pa PowerAction) IsStart() bool {
|
||||
return pa == PowerActionStart || pa == PowerActionRestart
|
||||
}
|
||||
|
||||
type powerLocker struct {
|
||||
mu sync.RWMutex
|
||||
ch chan bool
|
||||
}
|
||||
|
||||
func newPowerLocker() *powerLocker {
|
||||
return &powerLocker{
|
||||
ch: make(chan bool, 1),
|
||||
}
|
||||
}
|
||||
|
||||
type errPowerLockerLocked struct{}
|
||||
|
||||
func (e errPowerLockerLocked) Error() string {
|
||||
return "cannot acquire a lock on the power state: already locked"
|
||||
}
|
||||
|
||||
var ErrPowerLockerLocked error = errPowerLockerLocked{}
|
||||
|
||||
// IsLocked returns the current state of the locker channel. If there is
|
||||
// currently a value in the channel, it is assumed to be locked.
|
||||
func (pl *powerLocker) IsLocked() bool {
|
||||
pl.mu.RLock()
|
||||
defer pl.mu.RUnlock()
|
||||
return len(pl.ch) == 1
|
||||
}
|
||||
|
||||
// Acquire will acquire the power lock if it is not currently locked. If it is
|
||||
// already locked, acquire will fail to acquire the lock, and will return false.
|
||||
func (pl *powerLocker) Acquire() error {
|
||||
pl.mu.Lock()
|
||||
defer pl.mu.Unlock()
|
||||
select {
|
||||
case pl.ch <- true:
|
||||
default:
|
||||
return errors.WithStack(ErrPowerLockerLocked)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// TryAcquire will attempt to acquire a power-lock until the context provided
|
||||
// is canceled.
|
||||
func (pl *powerLocker) TryAcquire(ctx context.Context) error {
|
||||
select {
|
||||
case pl.ch <- true:
|
||||
return nil
|
||||
case <-ctx.Done():
|
||||
if err := ctx.Err(); err != nil {
|
||||
return errors.WithStack(err)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
}
|
||||
|
||||
// Release will drain the locker channel so that we can properly re-acquire it
|
||||
// at a later time. If the channel is not currently locked this function is a
|
||||
// no-op and will immediately return.
|
||||
func (pl *powerLocker) Release() {
|
||||
pl.mu.Lock()
|
||||
select {
|
||||
case <-pl.ch:
|
||||
default:
|
||||
}
|
||||
pl.mu.Unlock()
|
||||
}
|
||||
|
||||
// Destroy cleans up the power locker by closing the channel.
|
||||
func (pl *powerLocker) Destroy() {
|
||||
pl.mu.Lock()
|
||||
if pl.ch != nil {
|
||||
select {
|
||||
case <-pl.ch:
|
||||
default:
|
||||
}
|
||||
close(pl.ch)
|
||||
}
|
||||
pl.mu.Unlock()
|
||||
}
|
||||
|
||||
// ExecutingPowerAction checks if there is currently a power action being
|
||||
// processed for the server.
|
||||
func (s *Server) ExecutingPowerAction() bool {
|
||||
|
||||
Reference in New Issue
Block a user