Skip to content

Commit f246726

Browse files
committed
update cache logic to calculate chunk size based on toatl cache
1 parent c5c4c87 commit f246726

File tree

2 files changed

+117
-4
lines changed

2 files changed

+117
-4
lines changed

Diff for: pkg/gce-pd-csi-driver/cache.go

+57-4
Original file line numberDiff line numberDiff line change
@@ -175,10 +175,18 @@ func setupCaching(devicePath string, req *csi.NodeStageVolumeRequest, nodeId str
175175
klog.V(4).Infof("Assuming valid data cache size and mode, resizing cache is not supported")
176176
} else {
177177
cacheSize := req.GetPublishContext()[common.ContextDataCacheSize]
178-
chunkSize, err := fetchChunkSizeKiB(cacheSize)
178+
maxChunkSizeStr := strconv.FormatInt(int64(maxChunkSize/KiB), 10)
179+
var chunkSize string
180+
cachePvSize, err := fetchPvSizeGiB()
179181
if err != nil {
180-
klog.Errorf("Errored to fetch cache size, verify the data-cache-size is valid: got %v, error: %q", cacheSize, err)
181-
return mainDevicePath, err
182+
klog.Errorf("Errored while fetching PV size, got %v, falling back to default chunkSize of %v", err, maxChunkSize)
183+
chunkSize = maxChunkSizeStr
184+
} else {
185+
chunkSize, err = fetchChunkSizeKiB(cachePvSize)
186+
if err != nil {
187+
klog.Errorf("Errored to fetch cache size, verify the data-cache-size is valid: got %v, error: %q", chunkSize, err)
188+
chunkSize = maxChunkSizeStr
189+
}
182190
}
183191
// Check if LV exists
184192
info, err = common.RunCommand("" /* pipedCmd */, nil /* pipedCmdArg */, "lvs", args...)
@@ -642,7 +650,7 @@ func watchDiskDetaches(watcher *fsnotify.Watcher, nodeName string, errorCh chan
642650
// In case of an event i.e. creation or deletion of any new PV, we update the VG metadata.
643651
// This might include some non-LVM changes, no harm in updating metadata multiple times.
644652
reduceVolumeGroup(getVolumeGroupName(nodeName), true)
645-
klog.V(2).Infof("disk attach/detach event %#v\n", event)
653+
klog.V(6).Infof("disk attach/detach event %#v\n", event)
646654
}
647655
}
648656
}
@@ -674,3 +682,48 @@ func addRaidedLSSDToVg(vgName, lssdPath string) error {
674682
}
675683
return nil
676684
}
685+
686+
func fetchPvSizeGiB() (string, error) {
687+
args := []string{
688+
"--select",
689+
"-o",
690+
"--noheadings",
691+
"pv_size",
692+
"--units=b",
693+
}
694+
// 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
695+
info, err := common.RunCommand("grep" /* pipedCmd */, []string{"/dev/md"} /* pipedCmdArg */, "pvs", args...)
696+
if err != nil {
697+
return "", fmt.Errorf("errored while fetching PV size %v: %s", err, info)
698+
}
699+
infoString := strings.TrimSpace(string(info))
700+
infoSlice := strings.Fields(infoString)
701+
pvSize, err := fetchNumberGiB(infoSlice)
702+
if err != nil {
703+
return "", fmt.Errorf("Error fetching PV size for cache %v", err)
704+
}
705+
return pvSize, nil
706+
707+
}
708+
709+
func fetchNumberGiB(infoSlice []string) (string, error) {
710+
re, err := regexp.Compile("^[0-9]+B$")
711+
if err != nil {
712+
return "", fmt.Errorf("Failed to compile regex match %v", err)
713+
}
714+
var pvSize string
715+
for _, i := range infoSlice {
716+
if re.MatchString(i) {
717+
pvSize, err = strings.TrimSuffix(i, "B"), nil
718+
if err != nil {
719+
return "", fmt.Errorf("Failed to extract PV size %v", err)
720+
}
721+
break
722+
}
723+
}
724+
pvSizeInt, err := strconv.ParseFloat(pvSize, 64)
725+
if err != nil {
726+
return "", fmt.Errorf("Error while fetching PV size for cache %v", err)
727+
}
728+
return strconv.FormatInt(int64(math.Ceil(pvSizeInt/GiB)), 10) + "GiB", nil
729+
}

Diff for: pkg/gce-pd-csi-driver/cache_test.go

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