fix: ensure buckets are preserved if one set returns error (#9468)

the bucket should be deleted if it can be successfully
deleted on all sets, if not we should ensure to
restore those buckets properly.
This commit is contained in:
Harshavardhana 2020-04-27 14:18:02 -07:00 committed by GitHub
parent 073aac3d92
commit 97d952e61c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 8 additions and 13 deletions

View File

@ -514,12 +514,11 @@ func (s *xlSets) MakeBucketWithLocation(ctx context.Context, bucket, location st
} }
errs := g.Wait() errs := g.Wait()
// Upon even a single write quorum error we undo all previously created buckets. // Upon any error we try to undo the make bucket operation if possible
// on all sets where it succeeded.
for _, err := range errs { for _, err := range errs {
if err != nil { if err != nil {
if _, ok := err.(InsufficientWriteQuorum); ok {
undoMakeBucketSets(bucket, s.sets, errs) undoMakeBucketSets(bucket, s.sets, errs)
}
return err return err
} }
} }
@ -686,13 +685,11 @@ func (s *xlSets) DeleteBucket(ctx context.Context, bucket string, forceDelete bo
} }
errs := g.Wait() errs := g.Wait()
// For any write quorum failure, we undo all the delete buckets operation // For any failure, we attempt undo all the delete buckets operation
// by creating all the buckets again. // by creating buckets again on all sets which were successfully deleted.
for _, err := range errs { for _, err := range errs {
if err != nil { if err != nil {
if _, ok := err.(InsufficientWriteQuorum); ok {
undoDeleteBucketSets(bucket, s.sets, errs) undoDeleteBucketSets(bucket, s.sets, errs)
}
return err return err
} }
} }

View File

@ -87,11 +87,9 @@ func newXLZones(ctx context.Context, endpointZones EndpointZones) (ObjectLayer,
return nil, err return nil, err
} }
} }
if !z.SingleZone() {
z.quickHealBuckets(ctx)
}
go intDataUpdateTracker.start(GlobalContext, localDrives...)
z.quickHealBuckets(ctx)
go intDataUpdateTracker.start(GlobalContext, localDrives...)
return z, nil return z, nil
} }