dhcp4d: protect leases with a mutex
The HTTP handler runs in a separate goroutine.
This commit is contained in:
parent
73bd5c6a50
commit
e76886dab4
@ -27,6 +27,7 @@ import (
|
|||||||
"os"
|
"os"
|
||||||
"os/signal"
|
"os/signal"
|
||||||
"sort"
|
"sort"
|
||||||
|
"sync"
|
||||||
"syscall"
|
"syscall"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
@ -68,7 +69,10 @@ func updateNonExpired(leases []*dhcp4d.Lease) {
|
|||||||
|
|
||||||
var ouiDB = oui.NewDB("/perm/dhcp4d/oui")
|
var ouiDB = oui.NewDB("/perm/dhcp4d/oui")
|
||||||
|
|
||||||
var leases []*dhcp4d.Lease
|
var (
|
||||||
|
leasesMu sync.Mutex
|
||||||
|
leases []*dhcp4d.Lease
|
||||||
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
timefmt = func(t time.Time) string {
|
timefmt = func(t time.Time) string {
|
||||||
@ -186,6 +190,8 @@ func loadLeases(h *dhcp4d.Handler, fn string) error {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
leasesMu.Lock()
|
||||||
|
defer leasesMu.Unlock()
|
||||||
if err := json.Unmarshal(b, &leases); err != nil {
|
if err := json.Unmarshal(b, &leases); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
@ -215,6 +221,8 @@ func loadLeases(h *dhcp4d.Handler, fn string) error {
|
|||||||
Static bool
|
Static bool
|
||||||
}
|
}
|
||||||
|
|
||||||
|
leasesMu.Lock()
|
||||||
|
defer leasesMu.Unlock()
|
||||||
static := make([]tmplLease, 0, len(leases))
|
static := make([]tmplLease, 0, len(leases))
|
||||||
dynamic := make([]tmplLease, 0, len(leases))
|
dynamic := make([]tmplLease, 0, len(leases))
|
||||||
tl := func(l *dhcp4d.Lease) tmplLease {
|
tl := func(l *dhcp4d.Lease) tmplLease {
|
||||||
@ -302,6 +310,8 @@ func logic() error {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
handler.Leases = func(newLeases []*dhcp4d.Lease, latest *dhcp4d.Lease) {
|
handler.Leases = func(newLeases []*dhcp4d.Lease, latest *dhcp4d.Lease) {
|
||||||
|
leasesMu.Lock()
|
||||||
|
defer leasesMu.Unlock()
|
||||||
leases = newLeases
|
leases = newLeases
|
||||||
log.Printf("DHCPACK %+v", latest)
|
log.Printf("DHCPACK %+v", latest)
|
||||||
b, err := json.Marshal(leases)
|
b, err := json.Marshal(leases)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user