@@ -27,12 +27,8 @@ import (
2727 "strings"
2828 "time"
2929
30- "k8s.io/client-go/kubernetes"
31- "k8s.io/client-go/rest"
3230 "k8s.io/klog/v2"
3331 "k8s.io/utils/strings/slices"
34-
35- metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
3632 "sigs.k8s.io/gcp-compute-persistent-disk-csi-driver/pkg/common"
3733 "sigs.k8s.io/gcp-compute-persistent-disk-csi-driver/pkg/deviceutils"
3834 gce "sigs.k8s.io/gcp-compute-persistent-disk-csi-driver/pkg/gce-cloud-provider/compute"
10298)
10399
104100const (
105- driverName = "pd.csi.storage.gke.io"
106- dataCacheLabel = "datacache-storage-gke-io"
107- dataCacheLabelValue = "enabled"
101+ driverName = "pd.csi.storage.gke.io"
108102)
109103
110104func init () {
@@ -350,29 +344,74 @@ func urlFlag(target **url.URL, name string, usage string) {
350344 })
351345}
352346
347+ func fetchLssdsForRaiding (lssdCount int ) ([]string , error ) {
348+ allLssds , err := driver .FetchAllLssds ()
349+ if err != nil {
350+ return nil , fmt .Errorf ("Error listing all LSSDs %v" , err )
351+ }
352+
353+ raidedLssds , err := driver .FetchRaidedLssds ()
354+ if err != nil {
355+ return nil , fmt .Errorf ("Error listing RAIDed LSSDs %v" , err )
356+ }
357+
358+ unRaidedLssds := []string {}
359+ for _ , l := range allLssds {
360+ if ! slices .Contains (raidedLssds , l ) {
361+ unRaidedLssds = append (unRaidedLssds , l )
362+ }
363+ if len (unRaidedLssds ) == lssdCount {
364+ break
365+ }
366+ }
367+
368+ LSSDsWithEmptyMountPoint , err := driver .FetchLSSDsWihtEmptyMountPoint ()
369+ if err != nil {
370+ return nil , fmt .Errorf ("Error listing LSSDs with empty mountpoint: %v" , err )
371+ }
372+
373+ // We need to ensure the disks to be used for Datacache are both unRAIDed & not containing mountpoints for ephemeral storage already
374+ availableLssds := slices .Filter (nil , unRaidedLssds , func (e string ) bool {
375+ return slices .Contains (LSSDsWithEmptyMountPoint , e )
376+ })
377+
378+ if len (availableLssds ) == 0 {
379+ return nil , fmt .Errorf ("No LSSDs available to set up caching" )
380+ }
381+
382+ if len (availableLssds ) < lssdCount {
383+ return nil , fmt .Errorf ("Not enough LSSDs available to set up caching. Available LSSDs: %v, wanted LSSDs: %v" , len (availableLssds ), lssdCount )
384+ }
385+ return availableLssds , nil
386+ }
387+
353388func setupDataCache (ctx context.Context , nodeName string ) error {
354- klog .V (2 ).Infof ("Setting up data cache for node %s" , nodeName )
389+ isAlreadyRaided , err := driver .IsRaided ()
390+ if err != nil {
391+ klog .V (2 ).Infof ("Errored while scanning for available LocalSSDs err:%v; continuing Raiding" , err )
392+ } else if isAlreadyRaided {
393+ klog .V (2 ).Infof ("Local SSDs are already RAIDed. Skipping Datacache setup." )
394+ return nil
395+ }
396+
397+ lssdCount := common .LocalSSDCountForDataCache
355398 if nodeName != common .TestNode {
356- cfg , err := rest .InClusterConfig ()
357- if err != nil {
358- return err
359- }
360- kubeClient , err := kubernetes .NewForConfig (cfg )
361- if err != nil {
362- return err
399+ var err error
400+ lssdCount , err = driver .GetDataCacheCountFromNodeLabel (ctx , nodeName )
401+ if lssdCount == 0 {
402+ klog .Infof ("Datacache is not enabled on node %v" , nodeName )
403+ return nil
363404 }
364- node , err := kubeClient .CoreV1 ().Nodes ().Get (ctx , nodeName , metav1.GetOptions {})
365405 if err != nil {
366- // We could retry, but this error will also crashloop the driver which may be as good a way to retry as any.
367406 return err
368407 }
369- if val , found := node .GetLabels ()[dataCacheLabel ]; ! found || val != dataCacheLabelValue {
370- klog .V (2 ).Infof ("Datacache not enabled for node %s; node label %s=%s and not %s" , nodeName , dataCacheLabel , val , dataCacheLabelValue )
371- return nil
372- }
373408 }
374- klog .V (2 ).Info ("Raiding local ssds to setup data cache" )
375- if err := driver .RaidLocalSsds (); err != nil {
409+ lssdNames , err := fetchLssdsForRaiding (lssdCount )
410+ if err != nil {
411+ klog .Fatalf ("Failed to get sufficient SSDs for Datacache's caching setup: %v" , err )
412+ }
413+ klog .V (2 ).Infof ("Raiding local ssds to setup data cache: %v" , lssdNames )
414+ if err := driver .RaidLocalSsds (lssdNames ); err != nil {
376415 return fmt .Errorf ("Failed to Raid local SSDs, unable to setup data caching, got error %v" , err )
377416 }
378417
0 commit comments