Skip to content

Commit 96bcfb5

Browse files
weihangloguangbochen
authored andcommitted
Enqueue blockdevice change after format/provision failures
Signed-off-by: Weihang Lo <[email protected]>
1 parent f5a0b9b commit 96bcfb5

File tree

1 file changed

+24
-18
lines changed

1 file changed

+24
-18
lines changed

pkg/controller/blockdevice/controller.go

Lines changed: 24 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ const (
3232
defaultRescanInterval = 30 * time.Second
3333
forceFormatPollInterval = 3 * time.Second
3434
forceFormatPollTimeout = 30 * time.Second
35+
enqueueDelay = 10 * time.Second
3536
)
3637

3738
type Controller struct {
@@ -41,7 +42,7 @@ type Controller struct {
4142
NodeCache ctllonghornv1.NodeCache
4243
Nodes ctllonghornv1.NodeClient
4344

44-
Blockdevices ctldiskv1.BlockDeviceClient
45+
Blockdevices ctldiskv1.BlockDeviceController
4546
BlockdeviceCache ctldiskv1.BlockDeviceCache
4647
BlockInfo block.Info
4748
ExcludeFilters []*filter.Filter
@@ -191,6 +192,8 @@ func (c *Controller) OnBlockDeviceChange(key string, device *diskv1.BlockDevice)
191192
return nil, nil
192193
}
193194

195+
var shouldEnqueue bool
196+
194197
deviceCpy := device.DeepCopy()
195198
fs := *deviceCpy.Spec.FileSystem
196199
fsStatus := *deviceCpy.Status.DeviceStatus.FileSystem
@@ -239,21 +242,21 @@ func (c *Controller) OnBlockDeviceChange(key string, device *diskv1.BlockDevice)
239242
if device.Status.DeviceStatus.Details.DeviceType == diskv1.DeviceTypePart {
240243
switch {
241244
case fs.MountPoint != "" && fs.Provisioned:
242-
if deviceCpy, err := c.addDeviceToNode(deviceCpy); err != nil {
245+
if err := c.addDeviceToNode(deviceCpy); err != nil {
243246
err := fmt.Errorf("failed to provision device %s to node %s on path %s: %w", device.Name, c.NodeName, device.Spec.FileSystem.MountPoint, err)
244247
logrus.Error(err)
245248
diskv1.DiskAddedToNode.SetError(deviceCpy, "", err)
246249
diskv1.DiskAddedToNode.SetStatusBool(deviceCpy, false)
247-
return c.Blockdevices.Update(deviceCpy)
250+
shouldEnqueue = true
248251
}
249252
case fs.MountPoint == "" || !fs.Provisioned:
250253
if diskv1.DiskAddedToNode.IsTrue(device) {
251-
if deviceCpy, err := c.removeDeviceFromNode(deviceCpy); err != nil {
254+
if err := c.removeDeviceFromNode(deviceCpy); err != nil {
252255
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)
253256
logrus.Error(err)
254257
diskv1.DiskAddedToNode.SetError(deviceCpy, "", err)
255258
diskv1.DiskAddedToNode.SetStatusBool(deviceCpy, false)
256-
return c.Blockdevices.Update(deviceCpy)
259+
shouldEnqueue = true
257260
}
258261
}
259262
}
@@ -264,6 +267,9 @@ func (c *Controller) OnBlockDeviceChange(key string, device *diskv1.BlockDevice)
264267
return device, err
265268
}
266269
}
270+
if shouldEnqueue {
271+
c.Blockdevices.EnqueueAfter(c.Namespace, device.Name, enqueueDelay)
272+
}
267273

268274
return nil, nil
269275
}
@@ -477,16 +483,16 @@ func (c *Controller) forceFormatDisk(device *diskv1.BlockDevice) (*diskv1.BlockD
477483
}
478484

479485
// 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 {
481487
filesystem := c.BlockInfo.GetFileSystemInfoByDevPath(device.Spec.DevPath)
482488
if filesystem == nil || filesystem.MountPoint == "" {
483489
// No mount point. Skipping...
484-
return device, nil
490+
return nil
485491
}
486492

487493
node, err := c.Nodes.Get(c.Namespace, c.NodeName, metav1.GetOptions{})
488494
if err != nil {
489-
return device, err
495+
return err
490496
}
491497

492498
updateDeviceCondition := func() {
@@ -500,7 +506,7 @@ func (c *Controller) addDeviceToNode(device *diskv1.BlockDevice) (*diskv1.BlockD
500506
if disk, ok := node.Spec.Disks[device.Name]; ok && disk.Path == mountPoint {
501507
// Device exists and with the same mount point. No need to update the node.
502508
updateDeviceCondition()
503-
return device, nil
509+
return nil
504510
}
505511

506512
nodeCpy := node.DeepCopy()
@@ -513,22 +519,22 @@ func (c *Controller) addDeviceToNode(device *diskv1.BlockDevice) (*diskv1.BlockD
513519
}
514520
nodeCpy.Spec.Disks[device.Name] = diskSpec
515521
if _, err = c.Nodes.Update(nodeCpy); err != nil {
516-
return device, err
522+
return err
517523
}
518524

519525
updateDeviceCondition()
520-
return device, nil
526+
return nil
521527
}
522528

523529
// 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 {
525531
node, err := c.Nodes.Get(c.Namespace, c.NodeName, metav1.GetOptions{})
526532
if err != nil {
527533
if errors.IsNotFound(err) {
528534
// Skip since the node is not there.
529-
return device, nil
535+
return nil
530536
}
531-
return device, err
537+
return err
532538
}
533539

534540
if _, ok := node.Spec.Disks[device.Name]; !ok {
@@ -537,28 +543,28 @@ func (c *Controller) removeDeviceFromNode(device *diskv1.BlockDevice) (*diskv1.B
537543
diskv1.DiskAddedToNode.SetError(device, "", nil)
538544
diskv1.DiskAddedToNode.SetStatusBool(device, false)
539545
diskv1.DiskAddedToNode.Message(device, msg)
540-
return device, nil
546+
return nil
541547
}
542548
nodeCpy := node.DeepCopy()
543549
delete(nodeCpy.Spec.Disks, device.Name)
544550
if _, err := c.Nodes.Update(nodeCpy); err != nil {
545-
return device, err
551+
return err
546552
}
547553
// To prevent user from mistaking unprovisioning from umount, NDM umount
548554
// for the device as well while unprovisioning it.
549555
device.Spec.FileSystem.MountPoint = ""
550556
existingMount := device.Status.DeviceStatus.FileSystem.MountPoint
551557
if existingMount != "" {
552558
if err := disk.UmountDisk(existingMount); err != nil {
553-
return device, err
559+
return err
554560
}
555561
}
556562

557563
msg := fmt.Sprintf("Stop provisioning device %s to longhorn node `%s`", device.Name, c.NodeName)
558564
diskv1.DiskAddedToNode.SetError(device, "", nil)
559565
diskv1.DiskAddedToNode.SetStatusBool(device, false)
560566
diskv1.DiskAddedToNode.Message(device, msg)
561-
return device, nil
567+
return nil
562568
}
563569

564570
func isValidFileSystem(fs *diskv1.FilesystemInfo, fsStatus *diskv1.FilesystemStatus) error {

0 commit comments

Comments
 (0)