Skip to content

Commit 3b7e696

Browse files
committed
Fix Windows disk usage metric measurement
This PR will fix issue kubernetes#81088. The current fs_windows utility reports the whole file system usage instead of specific file path. This PR fix this and walk the dir tree under the file path and collect the disk usage. Change-Id: I502ccf0af4bd07be69b61be043be616660499e4d
1 parent 4b2c96c commit 3b7e696

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",
@@ -65,3 +65,15 @@ filegroup(
6565
tags = ["automanaged"],
6666
visibility = ["//visibility:public"],
6767
)
68+
69+
go_test(
70+
name = "go_default_test",
71+
srcs = ["fs_windows_test.go"],
72+
embed = [":go_default_library"],
73+
deps = select({
74+
"@io_bazel_rules_go//go/platform:windows": [
75+
"//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library",
76+
],
77+
"//conditions:default": [],
78+
}),
79+
)

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+
}
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)