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()
// 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 {
if err != nil {
if _, ok := err.(InsufficientWriteQuorum); ok {
undoMakeBucketSets(bucket, s.sets, errs)
}
undoMakeBucketSets(bucket, s.sets, errs)
return err
}
}
@ -686,13 +685,11 @@ func (s *xlSets) DeleteBucket(ctx context.Context, bucket string, forceDelete bo
}
errs := g.Wait()
// For any write quorum failure, we undo all the delete buckets operation
// by creating all the buckets again.
// For any failure, we attempt undo all the delete buckets operation
// by creating buckets again on all sets which were successfully deleted.
for _, err := range errs {
if err != nil {
if _, ok := err.(InsufficientWriteQuorum); ok {
undoDeleteBucketSets(bucket, s.sets, errs)
}
undoDeleteBucketSets(bucket, s.sets, errs)
return err
}
}

View file

@ -87,11 +87,9 @@ func newXLZones(ctx context.Context, endpointZones EndpointZones) (ObjectLayer,
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
}