Skip to content

Commit f2b3183

Browse files
committed
improve hosts scan time and do not skip if any read error
Signed-off-by: Yussuf Shaikh <[email protected]>
1 parent 9dfedc5 commit f2b3183

File tree

3 files changed

+42
-8
lines changed

3 files changed

+42
-8
lines changed

pkg/device/device.go

Lines changed: 39 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import (
2323
"path/filepath"
2424
"regexp"
2525
"strings"
26+
"sync"
2627
"time"
2728

2829
"k8s.io/klog/v2"
@@ -31,6 +32,7 @@ import (
3132
var (
3233
lastCleanExecuted time.Time
3334
lastStaleCleanExecuted time.Time
35+
scanLock = &sync.Mutex{}
3436
)
3537

3638
type LinuxDevice interface {
@@ -81,7 +83,8 @@ func (d *Device) Populate(needActivePath bool) error {
8183
tmpPathname := "dm-" + result["Minor"]
8284
uuid, err := getUUID(tmpPathname)
8385
if err != nil {
84-
return err
86+
klog.Warning(err)
87+
continue
8588
}
8689
tmpWWID := strings.TrimPrefix(uuid, "mpath-")
8790
tmpWWN := tmpWWID[1:] // truncate scsi-id prefix
@@ -122,11 +125,6 @@ func (d *Device) DeleteDevice() (err error) {
122125

123126
// CreateDevice: attach and create linux devices to host
124127
func (d *Device) CreateDevice() (err error) {
125-
if err = scsiHostRescan(); err != nil {
126-
return err
127-
}
128-
// wait for device to appear after rescan
129-
time.Sleep(time.Second * 1)
130128

131129
if err = d.createLinuxDevice(); err != nil {
132130
klog.Errorf("unable to create device for wwn %v", d.WWN)
@@ -139,6 +137,35 @@ func (d *Device) CreateDevice() (err error) {
139137
return nil
140138
}
141139

140+
// scsiHostRescanWithLock: scans all scsi hosts with locks
141+
// This is calling scsiHostRescan
142+
// which works in a way that only 1 scan will run at a time
143+
// and other requests will wait till the scan is complete
144+
// but will not scan again as it is already scanned.
145+
func scsiHostRescanWithLock() (err error) {
146+
start := time.Now()
147+
var scan bool = true
148+
defer scanLock.Unlock()
149+
150+
for {
151+
if scanLock.TryLock() {
152+
if scan {
153+
err = scsiHostRescan()
154+
}
155+
return err
156+
} else {
157+
if time.Since(start) > time.Minute {
158+
// Scanning usually takes < 30s. If wait is more than a min then return.
159+
return
160+
}
161+
162+
// Already locked, wait for it to complete and don't scan again.
163+
scan = false
164+
time.Sleep(5 * time.Second)
165+
}
166+
}
167+
}
168+
142169
// createLinuxDevice: attaches and creates a new linux device
143170
// Try device discovery; retry every 5 sec if no device found or have 0 slaves
144171
// In between checks we will try to cleanup:
@@ -151,6 +178,12 @@ func (d *Device) CreateDevice() (err error) {
151178
func (d *Device) createLinuxDevice() (err error) {
152179
// Start a Countdown ticker
153180
for i := 0; i <= 10; i++ {
181+
if err = scsiHostRescanWithLock(); err != nil {
182+
return err
183+
}
184+
// wait for device to appear after rescan
185+
time.Sleep(time.Second * 1)
186+
154187
err := d.Populate(true)
155188
if err != nil {
156189
return err

pkg/device/multipath.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -375,7 +375,8 @@ OUTER:
375375
wwidPath := scsiPath + f.Name() + "/device/wwid"
376376
wwid, err := readFirstLine(wwidPath)
377377
if err != nil {
378-
return err
378+
klog.Warning(err)
379+
continue
379380
}
380381
entries := strings.Split(wwid, ".")
381382
if len(entries) <= 1 {

pkg/driver/node.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -302,7 +302,7 @@ func (d *nodeService) deleteDevice(deviceName string) error {
302302
}
303303
dev := NewDevice(wwn)
304304
if err := dev.Populate(false); err != nil {
305-
return fmt.Errorf("failed to delete device %s: %v", deviceName, err)
305+
return fmt.Errorf("failed to populate device %s: %v", deviceName, err)
306306
}
307307
if dev.GetMapper() == "" {
308308
return fmt.Errorf("failed to find device %s mapper for wwn %s", deviceName, wwn)

0 commit comments

Comments
 (0)