@@ -32,6 +32,7 @@ const (
32
32
defaultRescanInterval = 30 * time .Second
33
33
forceFormatPollInterval = 3 * time .Second
34
34
forceFormatPollTimeout = 30 * time .Second
35
+ enqueueDelay = 10 * time .Second
35
36
)
36
37
37
38
type Controller struct {
@@ -41,7 +42,7 @@ type Controller struct {
41
42
NodeCache ctllonghornv1.NodeCache
42
43
Nodes ctllonghornv1.NodeClient
43
44
44
- Blockdevices ctldiskv1.BlockDeviceClient
45
+ Blockdevices ctldiskv1.BlockDeviceController
45
46
BlockdeviceCache ctldiskv1.BlockDeviceCache
46
47
BlockInfo block.Info
47
48
ExcludeFilters []* filter.Filter
@@ -191,6 +192,8 @@ func (c *Controller) OnBlockDeviceChange(key string, device *diskv1.BlockDevice)
191
192
return nil , nil
192
193
}
193
194
195
+ var shouldEnqueue bool
196
+
194
197
deviceCpy := device .DeepCopy ()
195
198
fs := * deviceCpy .Spec .FileSystem
196
199
fsStatus := * deviceCpy .Status .DeviceStatus .FileSystem
@@ -239,21 +242,21 @@ func (c *Controller) OnBlockDeviceChange(key string, device *diskv1.BlockDevice)
239
242
if device .Status .DeviceStatus .Details .DeviceType == diskv1 .DeviceTypePart {
240
243
switch {
241
244
case fs .MountPoint != "" && fs .Provisioned :
242
- if deviceCpy , err := c .addDeviceToNode (deviceCpy ); err != nil {
245
+ if err := c .addDeviceToNode (deviceCpy ); err != nil {
243
246
err := fmt .Errorf ("failed to provision device %s to node %s on path %s: %w" , device .Name , c .NodeName , device .Spec .FileSystem .MountPoint , err )
244
247
logrus .Error (err )
245
248
diskv1 .DiskAddedToNode .SetError (deviceCpy , "" , err )
246
249
diskv1 .DiskAddedToNode .SetStatusBool (deviceCpy , false )
247
- return c . Blockdevices . Update ( deviceCpy )
250
+ shouldEnqueue = true
248
251
}
249
252
case fs .MountPoint == "" || ! fs .Provisioned :
250
253
if diskv1 .DiskAddedToNode .IsTrue (device ) {
251
- if deviceCpy , err := c .removeDeviceFromNode (deviceCpy ); err != nil {
254
+ if err := c .removeDeviceFromNode (deviceCpy ); err != nil {
252
255
err := fmt .Errorf ("failed to stop provisioning device %s to node %s on path %s: %w" , device .Name , c .NodeName , device .Spec .FileSystem .MountPoint , err )
253
256
logrus .Error (err )
254
257
diskv1 .DiskAddedToNode .SetError (deviceCpy , "" , err )
255
258
diskv1 .DiskAddedToNode .SetStatusBool (deviceCpy , false )
256
- return c . Blockdevices . Update ( deviceCpy )
259
+ shouldEnqueue = true
257
260
}
258
261
}
259
262
}
@@ -264,6 +267,9 @@ func (c *Controller) OnBlockDeviceChange(key string, device *diskv1.BlockDevice)
264
267
return device , err
265
268
}
266
269
}
270
+ if shouldEnqueue {
271
+ c .Blockdevices .EnqueueAfter (c .Namespace , device .Name , enqueueDelay )
272
+ }
267
273
268
274
return nil , nil
269
275
}
@@ -477,16 +483,16 @@ func (c *Controller) forceFormatDisk(device *diskv1.BlockDevice) (*diskv1.BlockD
477
483
}
478
484
479
485
// addDeviceToNode adds a device to longhorn node as an additional disk.
480
- func (c * Controller ) addDeviceToNode (device * diskv1.BlockDevice ) ( * diskv1. BlockDevice , error ) {
486
+ func (c * Controller ) addDeviceToNode (device * diskv1.BlockDevice ) error {
481
487
filesystem := c .BlockInfo .GetFileSystemInfoByDevPath (device .Spec .DevPath )
482
488
if filesystem == nil || filesystem .MountPoint == "" {
483
489
// No mount point. Skipping...
484
- return device , nil
490
+ return nil
485
491
}
486
492
487
493
node , err := c .Nodes .Get (c .Namespace , c .NodeName , metav1.GetOptions {})
488
494
if err != nil {
489
- return device , err
495
+ return err
490
496
}
491
497
492
498
updateDeviceCondition := func () {
@@ -500,7 +506,7 @@ func (c *Controller) addDeviceToNode(device *diskv1.BlockDevice) (*diskv1.BlockD
500
506
if disk , ok := node .Spec .Disks [device .Name ]; ok && disk .Path == mountPoint {
501
507
// Device exists and with the same mount point. No need to update the node.
502
508
updateDeviceCondition ()
503
- return device , nil
509
+ return nil
504
510
}
505
511
506
512
nodeCpy := node .DeepCopy ()
@@ -513,22 +519,22 @@ func (c *Controller) addDeviceToNode(device *diskv1.BlockDevice) (*diskv1.BlockD
513
519
}
514
520
nodeCpy .Spec .Disks [device .Name ] = diskSpec
515
521
if _ , err = c .Nodes .Update (nodeCpy ); err != nil {
516
- return device , err
522
+ return err
517
523
}
518
524
519
525
updateDeviceCondition ()
520
- return device , nil
526
+ return nil
521
527
}
522
528
523
529
// removeDeviceFromNode removes a device from a longhorn node.
524
- func (c * Controller ) removeDeviceFromNode (device * diskv1.BlockDevice ) ( * diskv1. BlockDevice , error ) {
530
+ func (c * Controller ) removeDeviceFromNode (device * diskv1.BlockDevice ) error {
525
531
node , err := c .Nodes .Get (c .Namespace , c .NodeName , metav1.GetOptions {})
526
532
if err != nil {
527
533
if errors .IsNotFound (err ) {
528
534
// Skip since the node is not there.
529
- return device , nil
535
+ return nil
530
536
}
531
- return device , err
537
+ return err
532
538
}
533
539
534
540
if _ , ok := node .Spec .Disks [device .Name ]; ! ok {
@@ -537,28 +543,28 @@ func (c *Controller) removeDeviceFromNode(device *diskv1.BlockDevice) (*diskv1.B
537
543
diskv1 .DiskAddedToNode .SetError (device , "" , nil )
538
544
diskv1 .DiskAddedToNode .SetStatusBool (device , false )
539
545
diskv1 .DiskAddedToNode .Message (device , msg )
540
- return device , nil
546
+ return nil
541
547
}
542
548
nodeCpy := node .DeepCopy ()
543
549
delete (nodeCpy .Spec .Disks , device .Name )
544
550
if _ , err := c .Nodes .Update (nodeCpy ); err != nil {
545
- return device , err
551
+ return err
546
552
}
547
553
// To prevent user from mistaking unprovisioning from umount, NDM umount
548
554
// for the device as well while unprovisioning it.
549
555
device .Spec .FileSystem .MountPoint = ""
550
556
existingMount := device .Status .DeviceStatus .FileSystem .MountPoint
551
557
if existingMount != "" {
552
558
if err := disk .UmountDisk (existingMount ); err != nil {
553
- return device , err
559
+ return err
554
560
}
555
561
}
556
562
557
563
msg := fmt .Sprintf ("Stop provisioning device %s to longhorn node `%s`" , device .Name , c .NodeName )
558
564
diskv1 .DiskAddedToNode .SetError (device , "" , nil )
559
565
diskv1 .DiskAddedToNode .SetStatusBool (device , false )
560
566
diskv1 .DiskAddedToNode .Message (device , msg )
561
- return device , nil
567
+ return nil
562
568
}
563
569
564
570
func isValidFileSystem (fs * diskv1.FilesystemInfo , fsStatus * diskv1.FilesystemStatus ) error {
0 commit comments