mirror of
https://github.com/zrepl/zrepl.git
synced 2024-12-02 21:37:50 +01:00
69 lines
1.1 KiB
Go
69 lines
1.1 KiB
Go
|
package zfscmd
|
||
|
|
||
|
import (
|
||
|
"fmt"
|
||
|
"sync"
|
||
|
"time"
|
||
|
)
|
||
|
|
||
|
type Report struct {
|
||
|
Active []ActiveCommand
|
||
|
}
|
||
|
|
||
|
type ActiveCommand struct {
|
||
|
Path string
|
||
|
Args []string
|
||
|
StartedAt time.Time
|
||
|
}
|
||
|
|
||
|
func GetReport() *Report {
|
||
|
active.mtx.RLock()
|
||
|
defer active.mtx.RUnlock()
|
||
|
var activeCommands []ActiveCommand
|
||
|
for c := range active.cmds {
|
||
|
c.mtx.RLock()
|
||
|
activeCommands = append(activeCommands, ActiveCommand{
|
||
|
Path: c.cmd.Path,
|
||
|
Args: c.cmd.Args,
|
||
|
StartedAt: c.startedAt,
|
||
|
})
|
||
|
c.mtx.RUnlock()
|
||
|
}
|
||
|
return &Report{
|
||
|
Active: activeCommands,
|
||
|
}
|
||
|
}
|
||
|
|
||
|
var active struct {
|
||
|
mtx sync.RWMutex
|
||
|
cmds map[*Cmd]bool
|
||
|
}
|
||
|
|
||
|
func init() {
|
||
|
active.cmds = make(map[*Cmd]bool)
|
||
|
}
|
||
|
|
||
|
func startPostReport(c *Cmd, err error, now time.Time) {
|
||
|
if err != nil {
|
||
|
return
|
||
|
}
|
||
|
|
||
|
active.mtx.Lock()
|
||
|
prev := active.cmds[c]
|
||
|
if prev {
|
||
|
panic("impl error: duplicate active command")
|
||
|
}
|
||
|
active.cmds[c] = true
|
||
|
active.mtx.Unlock()
|
||
|
}
|
||
|
|
||
|
func waitPostReport(c *Cmd, now time.Time) {
|
||
|
active.mtx.Lock()
|
||
|
defer active.mtx.Unlock()
|
||
|
prev := active.cmds[c]
|
||
|
if !prev {
|
||
|
panic(fmt.Sprintf("impl error: onWaitDone must only be called on an active command: %s", c))
|
||
|
}
|
||
|
delete(active.cmds, c)
|
||
|
}
|