X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/62d28600cbfc31f8e72c61e4519ff198cb66a02a..82357c206f796298d98f9c756963ddb60abccf79:/services/keepstore/unix_volume.go diff --git a/services/keepstore/unix_volume.go b/services/keepstore/unix_volume.go index f41bd30d3d..5026e2d325 100644 --- a/services/keepstore/unix_volume.go +++ b/services/keepstore/unix_volume.go @@ -22,7 +22,7 @@ import ( "syscall" "time" - "git.curoverse.com/arvados.git/sdk/go/arvados" + "git.arvados.org/arvados.git/sdk/go/arvados" "github.com/prometheus/client_golang/prometheus" "github.com/sirupsen/logrus" ) @@ -172,10 +172,10 @@ func (v *UnixVolume) Touch(loc string) error { return e } defer v.unlockfile(f) - ts := syscall.NsecToTimespec(time.Now().UnixNano()) + ts := time.Now() v.os.stats.TickOps("utimes") v.os.stats.Tick(&v.os.stats.UtimesOps) - err = syscall.UtimesNano(p, []syscall.Timespec{ts, ts}) + err = os.Chtimes(p, ts, ts) v.os.stats.TickErr(err) return err } @@ -298,6 +298,19 @@ func (v *UnixVolume) WriteBlock(ctx context.Context, loc string, rdr io.Reader) v.os.Remove(tmpfile.Name()) return err } + // ext4 uses a low-precision clock and effectively backdates + // files by up to 10 ms, sometimes across a 1-second boundary, + // which produces confusing results in logs and tests. We + // avoid this by setting the output file's timestamps + // explicitly, using a higher resolution clock. + ts := time.Now() + v.os.stats.TickOps("utimes") + v.os.stats.Tick(&v.os.stats.UtimesOps) + if err = os.Chtimes(tmpfile.Name(), ts, ts); err != nil { + err = fmt.Errorf("error setting timestamps on %s: %s", tmpfile.Name(), err) + v.os.Remove(tmpfile.Name()) + return err + } if err := v.os.Rename(tmpfile.Name(), bpath); err != nil { err = fmt.Errorf("error renaming %s to %s: %s", tmpfile.Name(), bpath, err) v.os.Remove(tmpfile.Name())