use renameio to write files atomically

This commit is contained in:
Michael Stapelberg 2019-01-06 15:23:09 +01:00
parent f67d4ec93f
commit 8df6329209
5 changed files with 13 additions and 10 deletions

View File

@ -21,11 +21,11 @@ import (
"fmt"
"go/format"
"io"
"io/ioutil"
"log"
"github.com/google/gopacket/layers"
"github.com/google/gopacket/pcap"
"github.com/google/renameio"
)
// udp and (port 67 or port 68) # dhcpv4
@ -57,7 +57,7 @@ func main() {
if err != nil {
log.Fatal(err)
}
if err := ioutil.WriteFile("GENERATED_filterexpr.go", gofmt, 0644); err != nil {
if err := renameio.WriteFile("GENERATED_filterexpr.go", gofmt, 0644); err != nil {
log.Fatal(err)
}
}

View File

@ -30,6 +30,7 @@ import (
"github.com/google/gopacket"
"github.com/google/gopacket/layers"
"github.com/google/renameio"
"github.com/jpillora/backoff"
"github.com/rtr7/router7/internal/dhcp4"
"github.com/rtr7/router7/internal/notify"
@ -83,7 +84,7 @@ func logic() error {
if err != nil {
return err
}
if err := ioutil.WriteFile(leasePath, b, 0644); err != nil {
if err := renameio.WriteFile(leasePath, b, 0644); err != nil {
return fmt.Errorf("persisting lease to %s: %v", leasePath, err)
}
buf := gopacket.NewSerializeBuffer()
@ -94,7 +95,7 @@ func logic() error {
},
c.Ack,
)
if err := ioutil.WriteFile(ackFn, buf.Bytes(), 0644); err != nil {
if err := renameio.WriteFile(ackFn, buf.Bytes(), 0644); err != nil {
return fmt.Errorf("persisting DHCPACK to %s: %v", ackFn, err)
}
if err := notify.Process("/user/netconfigd", syscall.SIGUSR1); err != nil {

View File

@ -27,6 +27,7 @@ import (
"time"
"github.com/gokrazy/gokrazy"
"github.com/google/renameio"
"github.com/krolaw/dhcp4"
"github.com/krolaw/dhcp4/conn"
"github.com/prometheus/client_golang/prometheus"
@ -125,8 +126,7 @@ func logic() error {
errs <- err
return
}
// TODO: write atomically
if err := ioutil.WriteFile("/perm/dhcp4d/leases.json", b, 0644); err != nil {
if err := renameio.WriteFile("/perm/dhcp4d/leases.json", b, 0644); err != nil {
errs <- err
}
updateNonExpired(leases)

View File

@ -26,6 +26,7 @@ import (
"syscall"
"time"
"github.com/google/renameio"
"github.com/rtr7/router7/internal/dhcp6"
"github.com/rtr7/router7/internal/notify"
"github.com/rtr7/router7/internal/teelogger"
@ -34,8 +35,8 @@ import (
var log = teelogger.NewConsole()
func logic() error {
const configPath = "/perm/dhcp6/wire/lease.json"
if err := os.MkdirAll(filepath.Dir(configPath), 0755); err != nil {
const leasePath = "/perm/dhcp6/wire/lease.json"
if err := os.MkdirAll(filepath.Dir(leasePath), 0755); err != nil {
return err
}
@ -64,7 +65,7 @@ func logic() error {
if err != nil {
return err
}
if err := ioutil.WriteFile(configPath, b, 0644); err != nil {
if err := renameio.WriteFile(leasePath, b, 0644); err != nil {
return err
}
if err := notify.Process("/user/netconfigd", syscall.SIGUSR1); err != nil {

View File

@ -30,6 +30,7 @@ import (
"github.com/google/nftables"
"github.com/google/nftables/binaryutil"
"github.com/google/nftables/expr"
"github.com/google/renameio"
"github.com/vishvananda/netlink"
"golang.org/x/sys/unix"
@ -287,7 +288,7 @@ func applyInterfaces(dir, root string) error {
if err := os.Remove(fn); err != nil && !os.IsNotExist(err) {
return err
}
if err := ioutil.WriteFile(fn, b, 0644); err != nil {
if err := renameio.WriteFile(fn, b, 0644); err != nil {
return err
}
}