Skip to content

Commit 9aca35b

Browse files
Sneha-atcemakd
authored andcommitted
update cache logic to calculate chunk size based on toatl cache
1 parent 0cb814a commit 9aca35b

File tree

2 files changed

+117
-4
lines changed

2 files changed

+117
-4
lines changed

pkg/gce-pd-csi-driver/cache.go

Lines changed: 57 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -169,10 +169,18 @@ func setupCaching(devicePath string, req *csi.NodeStageVolumeRequest, nodeId str
169169
klog.V(4).Infof("Assuming valid data cache size and mode, resizing cache is not supported")
170170
} else {
171171
cacheSize := req.GetPublishContext()[common.ContextDataCacheSize]
172-
chunkSize, err := fetchChunkSizeKiB(cacheSize)
172+
maxChunkSizeStr := strconv.FormatInt(int64(maxChunkSize/KiB), 10)
173+
var chunkSize string
174+
cachePvSize, err := fetchPvSizeGiB()
173175
if err != nil {
174-
klog.Errorf("Errored to fetch cache size, verify the data-cache-size is valid: got %v, error: %q", cacheSize, err)
175-
return mainDevicePath, err
176+
klog.Errorf("Errored while fetching PV size, got %v, falling back to default chunkSize of %v", err, maxChunkSize)
177+
chunkSize = maxChunkSizeStr
178+
} else {
179+
chunkSize, err = fetchChunkSizeKiB(cachePvSize)
180+
if err != nil {
181+
klog.Errorf("Errored to fetch cache size, verify the data-cache-size is valid: got %v, error: %q", chunkSize, err)
182+
chunkSize = maxChunkSizeStr
183+
}
176184
}
177185
// Check if LV exists
178186
info, err = common.RunCommand("" /* pipedCmd */, nil /* pipedCmdArg */, "lvs", args...)
@@ -635,7 +643,7 @@ func watchDiskDetaches(watcher *fsnotify.Watcher, nodeName string, errorCh chan
635643
klog.Errorf("Error updating volume group's metadata: %v", err)
636644
}
637645
reduceVolumeGroup(getVolumeGroupName(nodeName), true)
638-
klog.V(2).Infof("disk attach/detach event %#v\n", event)
646+
klog.V(6).Infof("disk attach/detach event %#v\n", event)
639647
}
640648
}
641649
}
@@ -667,3 +675,48 @@ func addRaidedLSSDToVg(vgName, lssdPath string) error {
667675
}
668676
return nil
669677
}
678+
679+
func fetchPvSizeGiB() (string, error) {
680+
args := []string{
681+
"--select",
682+
"-o",
683+
"--noheadings",
684+
"pv_size",
685+
"--units=b",
686+
}
687+
// RAIDed device is always registered with its /dev/md127 equivalent in VG so cannot check it directly based on the RAIDed LSSD path which could be /dev/md/csi-driver-data-cache
688+
info, err := common.RunCommand("grep" /* pipedCmd */, []string{"/dev/md"} /* pipedCmdArg */, "pvs", args...)
689+
if err != nil {
690+
return "", fmt.Errorf("errored while fetching PV size %v: %s", err, info)
691+
}
692+
infoString := strings.TrimSpace(string(info))
693+
infoSlice := strings.Fields(infoString)
694+
pvSize, err := fetchNumberGiB(infoSlice)
695+
if err != nil {
696+
return "", fmt.Errorf("Error fetching PV size for cache %v", err)
697+
}
698+
return pvSize, nil
699+
700+
}
701+
702+
func fetchNumberGiB(infoSlice []string) (string, error) {
703+
re, err := regexp.Compile("^[0-9]+B$")
704+
if err != nil {
705+
return "", fmt.Errorf("Failed to compile regex match %v", err)
706+
}
707+
var pvSize string
708+
for _, i := range infoSlice {
709+
if re.MatchString(i) {
710+
pvSize, err = strings.TrimSuffix(i, "B"), nil
711+
if err != nil {
712+
return "", fmt.Errorf("Failed to extract PV size %v", err)
713+
}
714+
break
715+
}
716+
}
717+
pvSizeInt, err := strconv.ParseFloat(pvSize, 64)
718+
if err != nil {
719+
return "", fmt.Errorf("Error while fetching PV size for cache %v", err)
720+
}
721+
return strconv.FormatInt(int64(math.Ceil(pvSizeInt/GiB)), 10) + "GiB", nil
722+
}

pkg/gce-pd-csi-driver/cache_test.go

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,3 +55,63 @@ func TestFetchChunkSizeKiB(t *testing.T) {
5555
}
5656

5757
}
58+
59+
func TestFetchNumberGiB(t *testing.T) {
60+
testCases := []struct {
61+
name string
62+
stringInput []string
63+
expOutput string // Outputs value in GiB
64+
expErr bool
65+
}{
66+
{
67+
name: "valid input 1",
68+
stringInput: []string{"5000000000B"},
69+
expOutput: "5GiB", //range defined in fetchChunkSizeKiB
70+
},
71+
{
72+
name: "valid input 2",
73+
stringInput: []string{"375000000000B"}, // 1 LSSD attached
74+
expOutput: "350GiB", //range defined in fetchChunkSizeKiB
75+
},
76+
{
77+
name: "valid input 3",
78+
stringInput: []string{"9000000000000B"}, // 24 LSSD attached
79+
expOutput: "8382GiB", //range defined in fetchChunkSizeKiB
80+
},
81+
{
82+
name: "valid input 4",
83+
stringInput: []string{"Some text before ", "9000000000000B", "Some text after"}, // 24 LSSD attached
84+
expOutput: "8382GiB", //range defined in fetchChunkSizeKiB
85+
},
86+
{
87+
name: "invalid input 1",
88+
stringInput: []string{"9000000000000"},
89+
expErr: true,
90+
},
91+
{
92+
name: "invalid input 2",
93+
stringInput: []string{"A9000000000000B"},
94+
expErr: true,
95+
},
96+
{
97+
name: "valid input 5",
98+
stringInput: []string{"900000B"}, // <1GiB gets rounded off to 0GiB
99+
expOutput: "1GiB",
100+
},
101+
}
102+
103+
for _, tc := range testCases {
104+
v, err := fetchNumberGiB(tc.stringInput)
105+
if err != nil {
106+
if !tc.expErr {
107+
t.Errorf("Errored %s", err)
108+
}
109+
continue
110+
}
111+
if v != tc.expOutput {
112+
t.Errorf("Got %s want %s", v, tc.expOutput)
113+
}
114+
115+
}
116+
117+
}

0 commit comments

Comments
 (0)