Skip to content

Commit dfeeb8a

Browse files
committed
Allow deleting qtrees with really long names
1 parent 5721dac commit dfeeb8a

File tree

2 files changed

+17
-2
lines changed

2 files changed

+17
-2
lines changed

CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66

77
**Fixes:**
88
- Added delete idempotency to the ontap-nas-economy driver as needed by Trident.
9+
- Fixed an issue where qtrees with names near the 64-character limit could not
10+
be deleted.
911

1012
**Enhancements:**
1113

storage_drivers/ontap_nas_qtree.go

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import (
2121
// OntapNASQtreeStorageDriverName is the constant name for this Ontap qtree-based NAS storage driver
2222
const OntapNASQtreeStorageDriverName = "ontap-nas-economy"
2323
const deletedQtreeNamePrefix = "deleted_"
24+
const maxQtreeNameLength = 64
2425
const maxQtreesPerFlexvol = 200
2526
const defaultPruneFlexvolsPeriodSecs = uint64(600) // default to 10 minutes
2627
const defaultResizeQuotasPeriodSecs = uint64(60) // default to 1 minute
@@ -219,6 +220,11 @@ func (d *OntapNASQtreeStorageDriver) Create(name string, sizeBytes uint64, opts
219220
return fmt.Errorf("Volume %s already exists.", name)
220221
}
221222

223+
// Ensure qtree name isn't too long
224+
if len(name) > maxQtreeNameLength {
225+
return fmt.Errorf("Volume %s name exceeds the limit of %d characters.", name, maxQtreeNameLength)
226+
}
227+
222228
// Get Flexvol options with default fallback values
223229
// see also: ontap_common.go#PopulateConfigurationDefaults
224230
size := strconv.FormatUint(sizeBytes, 10)
@@ -339,9 +345,16 @@ func (d *OntapNASQtreeStorageDriver) Destroy(name string) error {
339345
return nil
340346
}
341347

342-
// Rename qtree so it doesn't show up in lists while ONTAP is deleting it in the background
348+
// Rename qtree so it doesn't show up in lists while ONTAP is deleting it in the background.
349+
// Ensure the deleted name doesn't exceed the qtree name length limit of 64 characters.
343350
path := fmt.Sprintf("/vol/%s/%s", flexvol, name)
344-
deletedPath := fmt.Sprintf("/vol/%s/%s", flexvol, deletedQtreeNamePrefix+name+"_"+utils.RandomString(5))
351+
deletedName := deletedQtreeNamePrefix + name + "_" + utils.RandomString(5)
352+
if len(deletedName) > maxQtreeNameLength {
353+
trimLength := len(deletedQtreeNamePrefix) + 10
354+
deletedName = deletedQtreeNamePrefix + name[trimLength:] + "_" + utils.RandomString(5)
355+
}
356+
deletedPath := fmt.Sprintf("/vol/%s/%s", flexvol, deletedName)
357+
345358
renameResponse, err := d.API.QtreeRename(path, deletedPath)
346359
if err = ontap.GetError(renameResponse, err); err != nil {
347360
log.Errorf("Qtree rename failed. %v", err)

0 commit comments

Comments
 (0)