Skip to content

Commit 211047e

Browse files
authored
Merge pull request kubernetes#83092 from PatrickLang/automated-cherry-pick-of-#81437-upstream-release-1.14
Automated cherry pick of kubernetes#81437: Fix Windows disk usage metric measurement
2 parents 7bc21d4 + 6b0e94c commit 211047e

File tree

3 files changed

+139
-2
lines changed

3 files changed

+139
-2
lines changed

pkg/volume/util/fs/BUILD

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
load("@io_bazel_rules_go//go:def.bzl", "go_library")
1+
load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test")
22

33
go_library(
44
name = "go_default_library",
@@ -63,3 +63,15 @@ filegroup(
6363
tags = ["automanaged"],
6464
visibility = ["//visibility:public"],
6565
)
66+
67+
go_test(
68+
name = "go_default_test",
69+
srcs = ["fs_windows_test.go"],
70+
embed = [":go_default_library"],
71+
deps = select({
72+
"@io_bazel_rules_go//go/platform:windows": [
73+
"//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library",
74+
],
75+
"//conditions:default": [],
76+
}),
77+
)

pkg/volume/util/fs/fs_windows.go

Lines changed: 45 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ package fs
2020

2121
import (
2222
"fmt"
23+
"os"
2324
"syscall"
2425
"unsafe"
2526

@@ -58,7 +59,12 @@ func FsInfo(path string) (int64, int64, int64, int64, int64, int64, error) {
5859

5960
// DiskUsage gets disk usage of specified path.
6061
func DiskUsage(path string) (*resource.Quantity, error) {
61-
_, _, usage, _, _, _, err := FsInfo(path)
62+
info, err := os.Lstat(path)
63+
if err != nil {
64+
return nil, err
65+
}
66+
67+
usage, err := diskUsage(path, info)
6268
if err != nil {
6369
return nil, err
6470
}
@@ -75,3 +81,41 @@ func DiskUsage(path string) (*resource.Quantity, error) {
7581
func Find(path string) (int64, error) {
7682
return 0, nil
7783
}
84+
85+
func diskUsage(currPath string, info os.FileInfo) (int64, error) {
86+
var size int64
87+
88+
if info.Mode()&os.ModeSymlink != 0 {
89+
return size, nil
90+
}
91+
92+
size += info.Size()
93+
94+
if !info.IsDir() {
95+
return size, nil
96+
}
97+
98+
dir, err := os.Open(currPath)
99+
if err != nil {
100+
return size, err
101+
}
102+
defer dir.Close()
103+
104+
files, err := dir.Readdir(-1)
105+
if err != nil {
106+
return size, err
107+
}
108+
109+
for _, file := range files {
110+
if file.IsDir() {
111+
s, err := diskUsage(fmt.Sprintf("%s/%s", currPath, file.Name()), file)
112+
if err != nil {
113+
return size, err
114+
}
115+
size += s
116+
} else {
117+
size += file.Size()
118+
}
119+
}
120+
return size, nil
121+
}

pkg/volume/util/fs/fs_windows_test.go

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
/*
2+
Copyright 2019 The Kubernetes Authors.
3+
4+
Licensed under the Apache License, Version 2.0 (the "License");
5+
you may not use this file except in compliance with the License.
6+
You may obtain a copy of the License at
7+
8+
http://www.apache.org/licenses/LICENSE-2.0
9+
10+
Unless required by applicable law or agreed to in writing, software
11+
distributed under the License is distributed on an "AS IS" BASIS,
12+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
See the License for the specific language governing permissions and
14+
limitations under the License.
15+
*/
16+
17+
package fs
18+
19+
import (
20+
"fmt"
21+
"io/ioutil"
22+
"os"
23+
24+
"k8s.io/apimachinery/pkg/api/resource"
25+
"testing"
26+
)
27+
28+
func TestDiskUsage(t *testing.T) {
29+
30+
dir_1, err := ioutil.TempDir("", "dir_1")
31+
if err != nil {
32+
t.Fatalf("TestDiskUsage failed: %s", err.Error())
33+
}
34+
defer os.RemoveAll(dir_1)
35+
36+
tmpfile_1, err := ioutil.TempFile(dir_1, "test")
37+
if _, err = tmpfile_1.WriteString("just for testing"); err != nil {
38+
t.Fatalf("TestDiskUsage failed: %s", err.Error())
39+
}
40+
dir_2, err := ioutil.TempDir(dir_1, "dir_2")
41+
if err != nil {
42+
t.Fatalf("TestDiskUsage failed: %s", err.Error())
43+
}
44+
tmpfile_2, err := ioutil.TempFile(dir_2, "test")
45+
if _, err = tmpfile_2.WriteString("just for testing"); err != nil {
46+
t.Fatalf("TestDiskUsage failed: %s", err.Error())
47+
}
48+
49+
dirInfo1, err := os.Lstat(dir_1)
50+
if err != nil {
51+
t.Fatalf("TestDiskUsage failed: %s", err.Error())
52+
}
53+
dirInfo2, err := os.Lstat(dir_2)
54+
if err != nil {
55+
t.Fatalf("TestDiskUsage failed: %s", err.Error())
56+
}
57+
file1 := dir_1 + "/" + "test"
58+
file2 := dir_2 + "/" + "test"
59+
fileInfo1, err := os.Lstat(file1)
60+
if err != nil {
61+
t.Fatalf("TestDiskUsage failed: %s", err.Error())
62+
}
63+
fileInfo2, err := os.Lstat(file2)
64+
if err != nil {
65+
t.Fatalf("TestDiskUsage failed: %s", err.Error())
66+
}
67+
total := dirInfo1.Size() + dirInfo2.Size() + fileInfo1.Size() + fileInfo2.Size()
68+
69+
size, err := DiskUsage(dir_1)
70+
if err != nil {
71+
t.Fatalf("TestDiskUsage failed: %s", err.Error())
72+
}
73+
used, err := resource.ParseQuantity(fmt.Sprintf("%d", total))
74+
if err != nil {
75+
t.Fatalf("TestDiskUsage failed: %s", err.Error())
76+
}
77+
if size.Cmp(used) != 1 {
78+
t.Fatalf("TestDiskUsage failed: %s", err.Error())
79+
}
80+
81+
}

0 commit comments

Comments
 (0)