ir: Add health status reporting on reconfiguration #1311
3 changed files with 13 additions and 3 deletions
10
pkg/util/sdnotify/clock.go
Normal file
10
pkg/util/sdnotify/clock.go
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
package sdnotify
|
||||||
|
|
||||||
|
import (
|
||||||
|
// For go:linkname to work.
|
||||||
|
_ "unsafe"
|
||||||
|
)
|
||||||
|
|
||||||
|
//go:noescape
|
||||||
|
//go:linkname nanotime runtime.nanotime
|
||||||
|
func nanotime() int64
|
2
pkg/util/sdnotify/clock.s
Normal file
2
pkg/util/sdnotify/clock.s
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
// The file is intentionally empty.
|
||||||
|
// It is a workaround for https://github.com/golang/go/issues/15006
|
|
@ -6,7 +6,6 @@ import (
|
||||||
"net"
|
"net"
|
||||||
"os"
|
"os"
|
||||||
"strings"
|
"strings"
|
||||||
"time"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
|
@ -17,7 +16,6 @@ const (
|
||||||
|
|
||||||
var (
|
var (
|
||||||
socket *net.UnixAddr
|
socket *net.UnixAddr
|
||||||
start = time.Now()
|
|
||||||
|
|
||||||
errSocketVariableIsNotPresent = errors.New("\"NOTIFY_SOCKET\" environment variable is not present")
|
errSocketVariableIsNotPresent = errors.New("\"NOTIFY_SOCKET\" environment variable is not present")
|
||||||
errSocketIsNotInitialized = errors.New("socket is not initialized")
|
errSocketIsNotInitialized = errors.New("socket is not initialized")
|
||||||
|
@ -53,7 +51,7 @@ func FlagAndStatus(status string) error {
|
||||||
// must be sent, containing "READY=1".
|
// must be sent, containing "READY=1".
|
||||||
//
|
//
|
||||||
// For MONOTONIC_USEC format refer to https://www.man7.org/linux/man-pages/man3/sd_notify.3.html
|
// For MONOTONIC_USEC format refer to https://www.man7.org/linux/man-pages/man3/sd_notify.3.html
|
||||||
fyrchik marked this conversation as resolved
|
|||||||
status += fmt.Sprintf("\nMONOTONIC_USEC=%d", uint64(time.Since(start))/1e3 /* microseconds in nanoseconds */)
|
status += fmt.Sprintf("\nMONOTONIC_USEC=%d", uint64(nanotime())/1e3 /* microseconds in nanoseconds */)
|
||||||
}
|
}
|
||||||
status += "\nSTATUS=" + strings.TrimSuffix(status, "=1")
|
status += "\nSTATUS=" + strings.TrimSuffix(status, "=1")
|
||||||
return Send(status)
|
return Send(status)
|
||||||
|
|
Loading…
Reference in a new issue
Maybe in IR SIGHUP is so fast that we send the same
MONOTONIC_USEC
? This would've explained the problem.Receiving the same
MONOTONIC_USEC
doesn't seem like a problem tosystemd
. I tried sendingtime.Since(time.Time{})
(always the same value),systemd
is OK with it, service reload is successful.It appears as if
systemd
does not accept values less than some minimum and greater than some maximum, and time in us since start is deemed as being too small. Time in ns since start works fine most of the time but not always (i've got hang-ups a couple times). Haven't found those min & max values in systemd source code yet.Passing a
math.MaxInt64
asMONOTONIC_USEC
works fine butmath.MaxUint64
is not accepted.