diff --git a/cmd/prepare-storage.go b/cmd/prepare-storage.go index 848190c35..76a7401df 100644 --- a/cmd/prepare-storage.go +++ b/cmd/prepare-storage.go @@ -221,10 +221,16 @@ func IsServerResolvable(endpoint Endpoint) error { // connect to list of endpoints and load all XL disk formats, validate the formats are correct // and are in quorum, if no formats are found attempt to initialize all of them for the first // time. additionally make sure to close all the disks used in this attempt. -func connectLoadInitFormats(retryCount int, firstDisk bool, endpoints Endpoints, zoneCount, setCount, drivesPerSet int, deploymentID string) ([]StorageAPI, *formatXLV3, error) { +func connectLoadInitFormats(retryCount int, firstDisk bool, endpoints Endpoints, zoneCount, setCount, drivesPerSet int, deploymentID string) (storageDisks []StorageAPI, format *formatXLV3, err error) { // Initialize all storage disks storageDisks, errs := initStorageDisksWithErrors(endpoints) + defer func(storageDisks []StorageAPI) { + if err != nil { + closeStorageDisks(storageDisks) + } + }(storageDisks) + for i, err := range errs { if err != nil { if err != errDiskNotFound { @@ -256,7 +262,7 @@ func connectLoadInitFormats(retryCount int, firstDisk bool, endpoints Endpoints, // most part unless one of the formats is not consistent // with expected XL format. For example if a user is // trying to pool FS backend into an XL set. - if err := checkFormatXLValues(formatConfigs, drivesPerSet); err != nil { + if err = checkFormatXLValues(formatConfigs, drivesPerSet); err != nil { return nil, nil, err } @@ -266,7 +272,7 @@ func connectLoadInitFormats(retryCount int, firstDisk bool, endpoints Endpoints, zoneCount, setCount, drivesPerSet) // Initialize erasure code format on disks - format, err := initFormatXL(context.Background(), storageDisks, setCount, drivesPerSet, deploymentID) + format, err = initFormatXL(context.Background(), storageDisks, setCount, drivesPerSet, deploymentID) if err != nil { return nil, nil, err } @@ -293,7 +299,7 @@ func connectLoadInitFormats(retryCount int, firstDisk bool, endpoints Endpoints, // This migration failed to capture '.This' field properly which indicates // the disk UUID association. Below function is called to handle and fix // this regression, for more info refer https://github.com/minio/minio/issues/5667 - if err := fixFormatXLV3(storageDisks, endpoints, formatConfigs); err != nil { + if err = fixFormatXLV3(storageDisks, endpoints, formatConfigs); err != nil { return nil, nil, err } @@ -302,7 +308,7 @@ func connectLoadInitFormats(retryCount int, firstDisk bool, endpoints Endpoints, return nil, nil, errXLV3ThisEmpty } - format, err := getFormatXLInQuorum(formatConfigs) + format, err = getFormatXLInQuorum(formatConfigs) if err != nil { return nil, nil, err } diff --git a/cmd/xl-sets.go b/cmd/xl-sets.go index 775f7b0e7..583d16a82 100644 --- a/cmd/xl-sets.go +++ b/cmd/xl-sets.go @@ -238,6 +238,9 @@ func (s *xlSets) connectDisks() { } disk.SetDiskID(format.XL.This) s.xlDisksMu.Lock() + if s.xlDisks[setIndex][diskIndex] != nil { + s.xlDisks[setIndex][diskIndex].Close() + } s.xlDisks[setIndex][diskIndex] = disk s.xlDisksMu.Unlock() go func(setIndex int) { @@ -333,16 +336,21 @@ func newXLSets(endpoints Endpoints, storageDisks []StorageAPI, format *formatXLV endpoints = append(endpoints, s.endpoints[i*drivesPerSet+j]) // Rely on endpoints list to initialize, init lockers and available disks. s.xlLockers[i][j] = newLockAPI(s.endpoints[i*drivesPerSet+j]) - if storageDisks[i*drivesPerSet+j] == nil { + disk := storageDisks[i*drivesPerSet+j] + if disk == nil { continue } - if diskID, derr := storageDisks[i*drivesPerSet+j].GetDiskID(); derr == nil { - m, n, err := findDiskIndexByDiskID(format, diskID) - if err != nil { - continue - } - s.xlDisks[m][n] = storageDisks[i*drivesPerSet+j] + diskID, derr := disk.GetDiskID() + if derr != nil { + disk.Close() + continue } + m, n, err := findDiskIndexByDiskID(format, diskID) + if err != nil { + disk.Close() + continue + } + s.xlDisks[m][n] = disk } // Initialize xl objects for a given set. @@ -1375,11 +1383,13 @@ func (s *xlSets) ReloadFormat(ctx context.Context, dryRun bool) (err error) { diskID, err := disk.GetDiskID() if err != nil { + disk.Close() continue } m, n, err := findDiskIndexByDiskID(refFormat, diskID) if err != nil { + disk.Close() continue } @@ -1583,11 +1593,13 @@ func (s *xlSets) HealFormat(ctx context.Context, dryRun bool) (res madmin.HealRe diskID, err := disk.GetDiskID() if err != nil { + disk.Close() continue } m, n, err := findDiskIndexByDiskID(refFormat, diskID) if err != nil { + disk.Close() continue }