diff --git a/Godeps/Godeps.json b/Godeps/Godeps.json index 62d5811b677..595f38178a4 100644 --- a/Godeps/Godeps.json +++ b/Godeps/Godeps.json @@ -2254,8 +2254,8 @@ }, { "ImportPath": "github.com/peterbourgon/diskv", - "Comment": "v2.0.0-2-g5dfcb07", - "Rev": "5dfcb07a075adbaaa4094cddfd160b1e1c77a043" + "Comment": "v2.0.1", + "Rev": "5f041e8faa004a95c88a202771f4cc3e991971e6" }, { "ImportPath": "github.com/pkg/errors", diff --git a/staging/src/k8s.io/apiextensions-apiserver/Godeps/Godeps.json b/staging/src/k8s.io/apiextensions-apiserver/Godeps/Godeps.json index 62e5b89a57e..a3c587db263 100644 --- a/staging/src/k8s.io/apiextensions-apiserver/Godeps/Godeps.json +++ b/staging/src/k8s.io/apiextensions-apiserver/Godeps/Godeps.json @@ -256,7 +256,7 @@ }, { "ImportPath": "github.com/peterbourgon/diskv", - "Rev": "5dfcb07a075adbaaa4094cddfd160b1e1c77a043" + "Rev": "5f041e8faa004a95c88a202771f4cc3e991971e6" }, { "ImportPath": "github.com/pkg/errors", diff --git a/staging/src/k8s.io/apiserver/Godeps/Godeps.json b/staging/src/k8s.io/apiserver/Godeps/Godeps.json index 913da8f222a..be81501e8ab 100644 --- a/staging/src/k8s.io/apiserver/Godeps/Godeps.json +++ b/staging/src/k8s.io/apiserver/Godeps/Godeps.json @@ -508,7 +508,7 @@ }, { "ImportPath": "github.com/peterbourgon/diskv", - "Rev": "5dfcb07a075adbaaa4094cddfd160b1e1c77a043" + "Rev": "5f041e8faa004a95c88a202771f4cc3e991971e6" }, { "ImportPath": "github.com/pkg/errors", diff --git a/staging/src/k8s.io/client-go/Godeps/Godeps.json b/staging/src/k8s.io/client-go/Godeps/Godeps.json index a04259982aa..928d99e0908 100644 --- a/staging/src/k8s.io/client-go/Godeps/Godeps.json +++ b/staging/src/k8s.io/client-go/Godeps/Godeps.json @@ -248,7 +248,7 @@ }, { "ImportPath": "github.com/peterbourgon/diskv", - "Rev": "5dfcb07a075adbaaa4094cddfd160b1e1c77a043" + "Rev": "5f041e8faa004a95c88a202771f4cc3e991971e6" }, { "ImportPath": "github.com/pmezard/go-difflib/difflib", diff --git a/staging/src/k8s.io/code-generator/Godeps/Godeps.json b/staging/src/k8s.io/code-generator/Godeps/Godeps.json index 5abd4ca7d75..c41b2835e4f 100644 --- a/staging/src/k8s.io/code-generator/Godeps/Godeps.json +++ b/staging/src/k8s.io/code-generator/Godeps/Godeps.json @@ -228,7 +228,7 @@ }, { "ImportPath": "github.com/peterbourgon/diskv", - "Rev": "5dfcb07a075adbaaa4094cddfd160b1e1c77a043" + "Rev": "5f041e8faa004a95c88a202771f4cc3e991971e6" }, { "ImportPath": "github.com/spf13/pflag", diff --git a/staging/src/k8s.io/kube-aggregator/Godeps/Godeps.json b/staging/src/k8s.io/kube-aggregator/Godeps/Godeps.json index a09ed0cc9f9..794d088f914 100644 --- a/staging/src/k8s.io/kube-aggregator/Godeps/Godeps.json +++ b/staging/src/k8s.io/kube-aggregator/Godeps/Godeps.json @@ -264,7 +264,7 @@ }, { "ImportPath": "github.com/peterbourgon/diskv", - "Rev": "5dfcb07a075adbaaa4094cddfd160b1e1c77a043" + "Rev": "5f041e8faa004a95c88a202771f4cc3e991971e6" }, { "ImportPath": "github.com/pkg/errors", diff --git a/staging/src/k8s.io/metrics/Godeps/Godeps.json b/staging/src/k8s.io/metrics/Godeps/Godeps.json index a35f3b1cb2d..aa89afee9a9 100644 --- a/staging/src/k8s.io/metrics/Godeps/Godeps.json +++ b/staging/src/k8s.io/metrics/Godeps/Godeps.json @@ -128,7 +128,7 @@ }, { "ImportPath": "github.com/peterbourgon/diskv", - "Rev": "5dfcb07a075adbaaa4094cddfd160b1e1c77a043" + "Rev": "5f041e8faa004a95c88a202771f4cc3e991971e6" }, { "ImportPath": "github.com/spf13/pflag", diff --git a/staging/src/k8s.io/sample-apiserver/Godeps/Godeps.json b/staging/src/k8s.io/sample-apiserver/Godeps/Godeps.json index d3545cfcaba..d39ef782a3c 100644 --- a/staging/src/k8s.io/sample-apiserver/Godeps/Godeps.json +++ b/staging/src/k8s.io/sample-apiserver/Godeps/Godeps.json @@ -256,7 +256,7 @@ }, { "ImportPath": "github.com/peterbourgon/diskv", - "Rev": "5dfcb07a075adbaaa4094cddfd160b1e1c77a043" + "Rev": "5f041e8faa004a95c88a202771f4cc3e991971e6" }, { "ImportPath": "github.com/pkg/errors", diff --git a/vendor/github.com/gregjones/httpcache/BUILD b/vendor/github.com/gregjones/httpcache/BUILD index a1aa088b72e..9ce1688d0ec 100644 --- a/vendor/github.com/gregjones/httpcache/BUILD +++ b/vendor/github.com/gregjones/httpcache/BUILD @@ -1,16 +1,9 @@ -package(default_visibility = ["//visibility:public"]) - -licenses(["notice"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) +load("@io_bazel_rules_go//go:def.bzl", "go_library") go_library( name = "go_default_library", srcs = ["httpcache.go"], - tags = ["automanaged"], + visibility = ["//visibility:public"], ) filegroup( @@ -27,4 +20,5 @@ filegroup( "//vendor/github.com/gregjones/httpcache/diskcache:all-srcs", ], tags = ["automanaged"], + visibility = ["//visibility:public"], ) diff --git a/vendor/github.com/gregjones/httpcache/diskcache/BUILD b/vendor/github.com/gregjones/httpcache/diskcache/BUILD index e7580ec7077..fe47b82402e 100644 --- a/vendor/github.com/gregjones/httpcache/diskcache/BUILD +++ b/vendor/github.com/gregjones/httpcache/diskcache/BUILD @@ -1,16 +1,9 @@ -package(default_visibility = ["//visibility:public"]) - -licenses(["notice"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) +load("@io_bazel_rules_go//go:def.bzl", "go_library") go_library( name = "go_default_library", srcs = ["diskcache.go"], - tags = ["automanaged"], + visibility = ["//visibility:public"], deps = ["//vendor/github.com/peterbourgon/diskv:go_default_library"], ) @@ -25,4 +18,5 @@ filegroup( name = "all-srcs", srcs = [":package-srcs"], tags = ["automanaged"], + visibility = ["//visibility:public"], ) diff --git a/vendor/github.com/peterbourgon/diskv/BUILD b/vendor/github.com/peterbourgon/diskv/BUILD index fcda66010b7..12c687cf139 100644 --- a/vendor/github.com/peterbourgon/diskv/BUILD +++ b/vendor/github.com/peterbourgon/diskv/BUILD @@ -1,11 +1,4 @@ -package(default_visibility = ["//visibility:public"]) - -licenses(["notice"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) +load("@io_bazel_rules_go//go:def.bzl", "go_library") go_library( name = "go_default_library", @@ -14,7 +7,7 @@ go_library( "diskv.go", "index.go", ], - tags = ["automanaged"], + visibility = ["//visibility:public"], deps = ["//vendor/github.com/google/btree:go_default_library"], ) @@ -29,4 +22,5 @@ filegroup( name = "all-srcs", srcs = [":package-srcs"], tags = ["automanaged"], + visibility = ["//visibility:public"], ) diff --git a/vendor/github.com/peterbourgon/diskv/diskv.go b/vendor/github.com/peterbourgon/diskv/diskv.go index ea05842cbd1..524dc0a6e3f 100644 --- a/vendor/github.com/peterbourgon/diskv/diskv.go +++ b/vendor/github.com/peterbourgon/diskv/diskv.go @@ -46,6 +46,12 @@ type Options struct { CacheSizeMax uint64 // bytes PathPerm os.FileMode FilePerm os.FileMode + // If TempDir is set, it will enable filesystem atomic writes by + // writing temporary files to that location before being moved + // to BasePath. + // Note that TempDir MUST be on the same device/partition as + // BasePath. + TempDir string Index Index IndexLess LessFunction @@ -115,41 +121,71 @@ func (d *Diskv) WriteStream(key string, r io.Reader, sync bool) error { return d.writeStreamWithLock(key, r, sync) } -// writeStream does no input validation checking. -// TODO: use atomic FS ops. -func (d *Diskv) writeStreamWithLock(key string, r io.Reader, sync bool) error { - if err := d.ensurePathWithLock(key); err != nil { - return fmt.Errorf("ensure path: %s", err) +// createKeyFileWithLock either creates the key file directly, or +// creates a temporary file in TempDir if it is set. +func (d *Diskv) createKeyFileWithLock(key string) (*os.File, error) { + if d.TempDir != "" { + if err := os.MkdirAll(d.TempDir, d.PathPerm); err != nil { + return nil, fmt.Errorf("temp mkdir: %s", err) + } + f, err := ioutil.TempFile(d.TempDir, "") + if err != nil { + return nil, fmt.Errorf("temp file: %s", err) + } + + if err := f.Chmod(d.FilePerm); err != nil { + f.Close() // error deliberately ignored + os.Remove(f.Name()) // error deliberately ignored + return nil, fmt.Errorf("chmod: %s", err) + } + return f, nil } mode := os.O_WRONLY | os.O_CREATE | os.O_TRUNC // overwrite if exists f, err := os.OpenFile(d.completeFilename(key), mode, d.FilePerm) if err != nil { - return fmt.Errorf("open file: %s", err) + return nil, fmt.Errorf("open file: %s", err) + } + return f, nil +} + +// writeStream does no input validation checking. +func (d *Diskv) writeStreamWithLock(key string, r io.Reader, sync bool) error { + if err := d.ensurePathWithLock(key); err != nil { + return fmt.Errorf("ensure path: %s", err) + } + + f, err := d.createKeyFileWithLock(key) + if err != nil { + return fmt.Errorf("create key file: %s", err) } wc := io.WriteCloser(&nopWriteCloser{f}) if d.Compression != nil { wc, err = d.Compression.Writer(f) if err != nil { - f.Close() // error deliberately ignored + f.Close() // error deliberately ignored + os.Remove(f.Name()) // error deliberately ignored return fmt.Errorf("compression writer: %s", err) } } if _, err := io.Copy(wc, r); err != nil { - f.Close() // error deliberately ignored + f.Close() // error deliberately ignored + os.Remove(f.Name()) // error deliberately ignored return fmt.Errorf("i/o copy: %s", err) } if err := wc.Close(); err != nil { - f.Close() // error deliberately ignored + f.Close() // error deliberately ignored + os.Remove(f.Name()) // error deliberately ignored return fmt.Errorf("compression close: %s", err) } if sync { if err := f.Sync(); err != nil { - f.Close() // error deliberately ignored + f.Close() // error deliberately ignored + os.Remove(f.Name()) // error deliberately ignored return fmt.Errorf("file sync: %s", err) } } @@ -158,6 +194,13 @@ func (d *Diskv) writeStreamWithLock(key string, r io.Reader, sync bool) error { return fmt.Errorf("file close: %s", err) } + if f.Name() != d.completeFilename(key) { + if err := os.Rename(f.Name(), d.completeFilename(key)); err != nil { + os.Remove(f.Name()) // error deliberately ignored + return fmt.Errorf("rename: %s", err) + } + } + if d.Index != nil { d.Index.Insert(key) } @@ -390,6 +433,9 @@ func (d *Diskv) EraseAll() error { defer d.mu.Unlock() d.cache = make(map[string][]byte) d.cacheSize = 0 + if d.TempDir != "" { + os.RemoveAll(d.TempDir) // errors ignored + } return os.RemoveAll(d.BasePath) }