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" "fmt"
"go/format" "go/format"
"io" "io"
"io/ioutil"
"log" "log"
"github.com/google/gopacket/layers" "github.com/google/gopacket/layers"
"github.com/google/gopacket/pcap" "github.com/google/gopacket/pcap"
"github.com/google/renameio"
) )
// udp and (port 67 or port 68) # dhcpv4 // udp and (port 67 or port 68) # dhcpv4
@ -57,7 +57,7 @@ func main() {
if err != nil { if err != nil {
log.Fatal(err) 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) log.Fatal(err)
} }
} }

View File

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

View File

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

View File

@ -26,6 +26,7 @@ import (
"syscall" "syscall"
"time" "time"
"github.com/google/renameio"
"github.com/rtr7/router7/internal/dhcp6" "github.com/rtr7/router7/internal/dhcp6"
"github.com/rtr7/router7/internal/notify" "github.com/rtr7/router7/internal/notify"
"github.com/rtr7/router7/internal/teelogger" "github.com/rtr7/router7/internal/teelogger"
@ -34,8 +35,8 @@ import (
var log = teelogger.NewConsole() var log = teelogger.NewConsole()
func logic() error { func logic() error {
const configPath = "/perm/dhcp6/wire/lease.json" const leasePath = "/perm/dhcp6/wire/lease.json"
if err := os.MkdirAll(filepath.Dir(configPath), 0755); err != nil { if err := os.MkdirAll(filepath.Dir(leasePath), 0755); err != nil {
return err return err
} }
@ -64,7 +65,7 @@ func logic() error {
if err != nil { if err != nil {
return err return err
} }
if err := ioutil.WriteFile(configPath, b, 0644); err != nil { if err := renameio.WriteFile(leasePath, b, 0644); err != nil {
return err return err
} }
if err := notify.Process("/user/netconfigd", syscall.SIGUSR1); err != nil { 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"
"github.com/google/nftables/binaryutil" "github.com/google/nftables/binaryutil"
"github.com/google/nftables/expr" "github.com/google/nftables/expr"
"github.com/google/renameio"
"github.com/vishvananda/netlink" "github.com/vishvananda/netlink"
"golang.org/x/sys/unix" "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) { if err := os.Remove(fn); err != nil && !os.IsNotExist(err) {
return err return err
} }
if err := ioutil.WriteFile(fn, b, 0644); err != nil { if err := renameio.WriteFile(fn, b, 0644); err != nil {
return err return err
} }
} }