Skip to content

Commit c6f1ae0

Browse files
committed
storage: fix volume NDFs
1 parent fe22b63 commit c6f1ae0

File tree

1 file changed

+56
-58
lines changed

1 file changed

+56
-58
lines changed

host/storage/storage.go

Lines changed: 56 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -461,8 +461,6 @@ func (vm *VolumeManager) AddVolume(ctx context.Context, localPath string, maxSec
461461
vm.vs.SetAvailable(volumeID, true)
462462

463463
go func() {
464-
defer vol.SetStatus(VolumeStatusReady)
465-
466464
log := vm.log.Named("initialize").With(zap.Int64("volumeID", volumeID), zap.Uint64("maxSectors", maxSectors))
467465
start := time.Now()
468466

@@ -486,7 +484,7 @@ func (vm *VolumeManager) AddVolume(ctx context.Context, localPath string, maxSec
486484
alert.Severity = alerts.SeverityInfo
487485
}
488486
vm.a.Register(alert)
489-
487+
vol.SetStatus(VolumeStatusReady)
490488
select {
491489
case result <- err:
492490
default:
@@ -565,8 +563,6 @@ func (vm *VolumeManager) RemoveVolume(ctx context.Context, id int64, force bool,
565563
}
566564

567565
go func() {
568-
defer vol.SetStatus(oldStatus)
569-
570566
var migrated, failed int
571567

572568
updateRemovalAlert := func(message string, severity alerts.Severity, err error) {
@@ -580,53 +576,56 @@ func (vm *VolumeManager) RemoveVolume(ctx context.Context, id int64, force bool,
580576
vm.a.Register(alert)
581577
}
582578

583-
migrated, failed, err := vm.vs.MigrateSectors(ctx, id, 0, func(newLoc SectorLocation) error {
584-
err := vm.migrateSector(newLoc)
579+
doMigration := func() error {
580+
migrated, failed, err = vm.vs.MigrateSectors(ctx, id, 0, func(newLoc SectorLocation) error {
581+
err := vm.migrateSector(newLoc)
582+
if err != nil {
583+
failed++
584+
} else {
585+
migrated++
586+
}
587+
updateRemovalAlert("Removing volume", alerts.SeverityInfo, nil) // error is ignored during migration
588+
return err
589+
})
585590
if err != nil {
586-
failed++
587-
} else {
588-
migrated++
591+
log.Error("failed to migrate sectors", zap.Error(err))
592+
// update the alert
593+
updateRemovalAlert("Failed to remove volume", alerts.SeverityError, err)
594+
return err
595+
} else if !force && failed > 0 {
596+
updateRemovalAlert("Failed to remove volume", alerts.SeverityError, ErrMigrationFailed)
597+
return ErrMigrationFailed
589598
}
590-
updateRemovalAlert("Removing volume", alerts.SeverityInfo, nil) // error is ignored during migration
591-
return err
592-
})
593-
if err != nil {
594-
log.Error("failed to migrate sectors", zap.Error(err))
595-
// update the alert
596-
updateRemovalAlert("Failed to remove volume", alerts.SeverityError, err)
597-
result <- err
598-
return
599-
} else if !force && failed > 0 {
600-
updateRemovalAlert("Failed to remove volume", alerts.SeverityError, ErrMigrationFailed)
601-
result <- ErrMigrationFailed
602-
return
603-
}
604599

605-
// remove the volume from the volume store
606-
if err := vm.vs.RemoveVolume(id, force); err != nil {
607-
log.Error("failed to remove volume", zap.Error(err))
608-
// update the alert
609-
updateRemovalAlert("Failed to remove volume", alerts.SeverityError, err)
610-
result <- err
611-
return
600+
// remove the volume from the volume store
601+
if err := vm.vs.RemoveVolume(id, force); err != nil {
602+
log.Error("failed to remove volume", zap.Error(err))
603+
// update the alert
604+
updateRemovalAlert("Failed to remove volume", alerts.SeverityError, err)
605+
return err
606+
}
607+
delete(vm.volumes, id)
608+
609+
// close the volume file and remove it from disk
610+
if err := vol.Close(); err != nil {
611+
log.Error("failed to close volume", zap.Error(err))
612+
updateRemovalAlert("Failed to close volume files", alerts.SeverityError, err)
613+
return err
614+
} else if err := os.Remove(stat.LocalPath); err != nil && !errors.Is(err, os.ErrNotExist) {
615+
log.Error("failed to remove volume file", zap.Error(err))
616+
updateRemovalAlert("Failed to delete volume file", alerts.SeverityError, err)
617+
return err
618+
}
619+
updateRemovalAlert("Volume removed", alerts.SeverityInfo, nil)
620+
return nil
612621
}
613-
delete(vm.volumes, id)
614622

615-
// close the volume file and remove it from disk
616-
if err := vol.Close(); err != nil {
617-
log.Error("failed to close volume", zap.Error(err))
618-
updateRemovalAlert("Failed to close volume files", alerts.SeverityError, err)
619-
result <- err
620-
return
621-
} else if err := os.Remove(stat.LocalPath); err != nil && !errors.Is(err, os.ErrNotExist) {
622-
log.Error("failed to remove volume file", zap.Error(err))
623-
updateRemovalAlert("Failed to delete volume file", alerts.SeverityError, err)
624-
result <- err
625-
return
623+
err := doMigration()
624+
vol.SetStatus(oldStatus)
625+
select {
626+
case result <- err:
627+
default:
626628
}
627-
628-
updateRemovalAlert("Volume removed", alerts.SeverityInfo, nil)
629-
result <- nil
630629
}()
631630

632631
return nil
@@ -670,20 +669,12 @@ func (vm *VolumeManager) ResizeVolume(ctx context.Context, id int64, maxSectors
670669

671670
go func() {
672671
log := vm.log.Named("resize").With(zap.Int64("volumeID", id))
673-
674-
defer func() {
675-
if resetReadOnly {
676-
// reset the volume to read-write
677-
if err := vm.vs.SetReadOnly(id, false); err != nil {
678-
vm.log.Error("failed to set volume to read-write", zap.Error(err))
679-
}
680-
}
681-
vol.SetStatus(VolumeStatusReady)
682-
}()
683-
684672
ctx, cancel, err := vm.tg.AddContext(ctx)
685673
if err != nil {
686-
result <- err
674+
select {
675+
case result <- err:
676+
default:
677+
}
687678
return
688679
}
689680
defer cancel()
@@ -722,6 +713,13 @@ func (vm *VolumeManager) ResizeVolume(ctx context.Context, id int64, maxSectors
722713
alert.Severity = alerts.SeverityInfo
723714
}
724715
vm.a.Register(alert)
716+
if resetReadOnly {
717+
// reset the volume to read-write
718+
if err := vm.vs.SetReadOnly(id, false); err != nil {
719+
vm.log.Error("failed to set volume to read-write", zap.Error(err))
720+
}
721+
}
722+
vol.SetStatus(VolumeStatusReady)
725723
select {
726724
case result <- err:
727725
default:

0 commit comments

Comments
 (0)