Clean entire tmp-old on restart (#15979)

This commit is contained in:
Klaus Post 2022-10-31 15:27:50 +01:00 committed by GitHub
parent b57fbff7c1
commit ecc932d5dd
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 19 additions and 42 deletions

View File

@ -117,7 +117,7 @@ func (s *erasureSets) getDiskMap() map[Endpoint]StorageAPI {
// Initializes a new StorageAPI from the endpoint argument, returns // Initializes a new StorageAPI from the endpoint argument, returns
// StorageAPI and also `format` which exists on the disk. // StorageAPI and also `format` which exists on the disk.
func connectEndpoint(endpoint Endpoint) (StorageAPI, *formatErasureV3, error) { func connectEndpoint(endpoint Endpoint) (StorageAPI, *formatErasureV3, error) {
disk, err := newStorageAPIWithoutHealthCheck(endpoint) disk, err := newStorageAPI(endpoint, false)
if err != nil { if err != nil {
return nil, nil, err return nil, nil, err
} }
@ -251,7 +251,7 @@ func (s *erasureSets) connectDisks() {
s.erasureDisks[setIndex][diskIndex] = disk s.erasureDisks[setIndex][diskIndex] = disk
} else { } else {
// Enable healthcheck disk for remote endpoint. // Enable healthcheck disk for remote endpoint.
disk, err = newStorageAPI(endpoint) disk, err = newStorageAPI(endpoint, true)
if err != nil { if err != nil {
printEndpointError(endpoint, err, false) printEndpointError(endpoint, err, false)
s.erasureDisksMu.Unlock() s.erasureDisksMu.Unlock()
@ -1250,7 +1250,7 @@ func markRootDisksAsDown(storageDisks []StorageAPI, errs []error) {
// HealFormat - heals missing `format.json` on fresh unformatted disks. // HealFormat - heals missing `format.json` on fresh unformatted disks.
func (s *erasureSets) HealFormat(ctx context.Context, dryRun bool) (res madmin.HealResultItem, err error) { func (s *erasureSets) HealFormat(ctx context.Context, dryRun bool) (res madmin.HealResultItem, err error) {
storageDisks, _ := initStorageDisksWithErrorsWithoutHealthCheck(s.endpoints.Endpoints) storageDisks, _ := initStorageDisksWithErrors(s.endpoints.Endpoints, false)
defer func(storageDisks []StorageAPI) { defer func(storageDisks []StorageAPI) {
if err != nil { if err != nil {

View File

@ -666,30 +666,16 @@ func closeStorageDisks(storageDisks ...StorageAPI) {
wg.Wait() wg.Wait()
} }
func initStorageDisksWithErrorsWithoutHealthCheck(endpoints Endpoints) ([]StorageAPI, []error) {
// Bootstrap disks.
storageDisks := make([]StorageAPI, len(endpoints))
g := errgroup.WithNErrs(len(endpoints))
for index := range endpoints {
index := index
g.Go(func() (err error) {
storageDisks[index], err = newStorageAPIWithoutHealthCheck(endpoints[index])
return err
}, index)
}
return storageDisks, g.Wait()
}
// Initialize storage disks for each endpoint. // Initialize storage disks for each endpoint.
// Errors are returned for each endpoint with matching index. // Errors are returned for each endpoint with matching index.
func initStorageDisksWithErrors(endpoints Endpoints) ([]StorageAPI, []error) { func initStorageDisksWithErrors(endpoints Endpoints, healthCheck bool) ([]StorageAPI, []error) {
// Bootstrap disks. // Bootstrap disks.
storageDisks := make([]StorageAPI, len(endpoints)) storageDisks := make([]StorageAPI, len(endpoints))
g := errgroup.WithNErrs(len(endpoints)) g := errgroup.WithNErrs(len(endpoints))
for index := range endpoints { for index := range endpoints {
index := index index := index
g.Go(func() (err error) { g.Go(func() (err error) {
storageDisks[index], err = newStorageAPI(endpoints[index]) storageDisks[index], err = newStorageAPI(endpoints[index], healthCheck)
return err return err
}, index) }, index)
} }

View File

@ -38,7 +38,7 @@ func TestFixFormatV3(t *testing.T) {
} }
endpoints := mustGetNewEndpoints(erasureDirs...) endpoints := mustGetNewEndpoints(erasureDirs...)
storageDisks, errs := initStorageDisksWithErrors(endpoints) storageDisks, errs := initStorageDisksWithErrors(endpoints, true)
for _, err := range errs { for _, err := range errs {
if err != nil && err != errDiskNotFound { if err != nil && err != errDiskNotFound {
t.Fatal(err) t.Fatal(err)
@ -559,7 +559,7 @@ func benchmarkInitStorageDisksN(b *testing.B, nDisks int) {
b.RunParallel(func(pb *testing.PB) { b.RunParallel(func(pb *testing.PB) {
endpoints := endpoints endpoints := endpoints
for pb.Next() { for pb.Next() {
initStorageDisksWithErrors(endpoints) initStorageDisksWithErrors(endpoints, true)
} }
}) })
} }

View File

@ -55,27 +55,15 @@ var globalObjectAPI ObjectLayer
// Global cacheObjects, only accessed by newCacheObjectsFn(). // Global cacheObjects, only accessed by newCacheObjectsFn().
var globalCacheObjectAPI CacheObjectLayer var globalCacheObjectAPI CacheObjectLayer
func newStorageAPIWithoutHealthCheck(endpoint Endpoint) (storage StorageAPI, err error) {
if endpoint.IsLocal {
storage, err := newXLStorage(endpoint)
if err != nil {
return nil, err
}
return newXLStorageDiskIDCheck(storage), nil
}
return newStorageRESTClient(endpoint, false), nil
}
// Depending on the disk type network or local, initialize storage API. // Depending on the disk type network or local, initialize storage API.
func newStorageAPI(endpoint Endpoint) (storage StorageAPI, err error) { func newStorageAPI(endpoint Endpoint, healthCheck bool) (storage StorageAPI, err error) {
if endpoint.IsLocal { if endpoint.IsLocal {
storage, err := newXLStorage(endpoint) storage, err := newXLStorage(endpoint, healthCheck)
if err != nil { if err != nil {
return nil, err return nil, err
} }
return newXLStorageDiskIDCheck(storage), nil return newXLStorageDiskIDCheck(storage), nil
} }
return newStorageRESTClient(endpoint, true), nil return newStorageRESTClient(endpoint, healthCheck), nil
} }

View File

@ -97,7 +97,8 @@ func bgFormatErasureCleanupTmp(diskPath string) {
err)) err))
} }
go removeAll(tmpOld) // Remove the entire folder in case there are leftovers that didn't get cleaned up before restart.
go removeAll(pathJoin(diskPath, minioMetaTmpBucket+"-old"))
// Renames and schedules for purging all bucket metacache. // Renames and schedules for purging all bucket metacache.
go renameAllBucketMetacache(diskPath) go renameAllBucketMetacache(diskPath)
} }
@ -146,7 +147,7 @@ func isServerResolvable(endpoint Endpoint, timeout time.Duration) error {
// time. additionally make sure to close all the disks used in this attempt. // time. additionally make sure to close all the disks used in this attempt.
func connectLoadInitFormats(verboseLogging bool, firstDisk bool, endpoints Endpoints, poolCount, setCount, setDriveCount int, deploymentID, distributionAlgo string) (storageDisks []StorageAPI, format *formatErasureV3, err error) { func connectLoadInitFormats(verboseLogging bool, firstDisk bool, endpoints Endpoints, poolCount, setCount, setDriveCount int, deploymentID, distributionAlgo string) (storageDisks []StorageAPI, format *formatErasureV3, err error) {
// Initialize all storage disks // Initialize all storage disks
storageDisks, errs := initStorageDisksWithErrors(endpoints) storageDisks, errs := initStorageDisksWithErrors(endpoints, true)
defer func(storageDisks []StorageAPI) { defer func(storageDisks []StorageAPI) {
if err != nil { if err != nil {

View File

@ -1323,7 +1323,7 @@ func registerStorageRESTHandlers(router *mux.Router, endpointServerPools Endpoin
go func(poolIdx, setIdx int, endpoint Endpoint) { go func(poolIdx, setIdx int, endpoint Endpoint) {
defer wg.Done() defer wg.Done()
var err error var err error
storageDisks[poolIdx][setIdx], err = newXLStorage(endpoint) storageDisks[poolIdx][setIdx], err = newXLStorage(endpoint, false)
if err != nil { if err != nil {
// if supported errors don't fail, we proceed to // if supported errors don't fail, we proceed to
// printing message and moving forward. // printing message and moving forward.

View File

@ -206,11 +206,11 @@ func newLocalXLStorage(path string) (*xlStorage, error) {
return newXLStorage(Endpoint{ return newXLStorage(Endpoint{
URL: &u, URL: &u,
IsLocal: true, IsLocal: true,
}) }, true)
} }
// Initialize a new storage disk. // Initialize a new storage disk.
func newXLStorage(ep Endpoint) (s *xlStorage, err error) { func newXLStorage(ep Endpoint, cleanUp bool) (s *xlStorage, err error) {
path := ep.Path path := ep.Path
if path, err = getValidPath(path); err != nil { if path, err = getValidPath(path); err != nil {
return nil, err return nil, err
@ -247,7 +247,9 @@ func newXLStorage(ep Endpoint) (s *xlStorage, err error) {
diskIndex: -1, diskIndex: -1,
} }
bgFormatErasureCleanupTmp(s.diskPath) // cleanup any old data. if cleanUp {
bgFormatErasureCleanupTmp(s.diskPath) // cleanup any old data.
}
formatData, formatFi, err := formatErasureMigrate(s.diskPath) formatData, formatFi, err := formatErasureMigrate(s.diskPath)
if err != nil && !errors.Is(err, os.ErrNotExist) { if err != nil && !errors.Is(err, os.ErrNotExist) {