b26db8e640
The SIGUSR2 signal handler for bandwidth limits currently only starts if rclone is started at a time when a bandwidth limit applies. This means that if rclone starts _outside_ such a time, i.e. with no bandwidth limits, then enters a time where bandwidth limits do apply, it will not be possible to use SIGUSR2 to toggle it. This fixes that by always starting the signal handler, but only toggling the limiter if there is a bandwidth limit configured.
48 lines
1.1 KiB
Go
48 lines
1.1 KiB
Go
// Accounting and limiting reader
|
|
// Unix specific functions.
|
|
|
|
//go:build darwin || dragonfly || freebsd || linux || netbsd || openbsd || solaris
|
|
// +build darwin dragonfly freebsd linux netbsd openbsd solaris
|
|
|
|
package accounting
|
|
|
|
import (
|
|
"os"
|
|
"os/signal"
|
|
"syscall"
|
|
|
|
"github.com/rclone/rclone/fs"
|
|
)
|
|
|
|
// startSignalHandler() sets a signal handler to catch SIGUSR2 and toggle throttling.
|
|
func (tb *tokenBucket) startSignalHandler() {
|
|
signals := make(chan os.Signal, 1)
|
|
signal.Notify(signals, syscall.SIGUSR2)
|
|
|
|
go func() {
|
|
// This runs forever, but blocks until the signal is received.
|
|
for {
|
|
<-signals
|
|
|
|
func() {
|
|
tb.mu.Lock()
|
|
defer tb.mu.Unlock()
|
|
|
|
// if there's no bandwidth limit configured now, do nothing
|
|
if !tb.currLimit.Bandwidth.IsSet() {
|
|
fs.Debugf(nil, "SIGUSR2 received but no bandwidth limit configured right now, ignoring")
|
|
return
|
|
}
|
|
|
|
tb.toggledOff = !tb.toggledOff
|
|
tb.curr, tb.prev = tb.prev, tb.curr
|
|
s := "disabled"
|
|
if !tb.curr._isOff() {
|
|
s = "enabled"
|
|
}
|
|
|
|
fs.Logf(nil, "Bandwidth limit %s by user", s)
|
|
}()
|
|
}
|
|
}()
|
|
}
|