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.
master
Harshavardhana 5 years ago committed by GitHub
parent 073aac3d92
commit 97d952e61c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 15
      cmd/xl-sets.go
  2. 6
      cmd/xl-zones.go

@ -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
} }
} }

@ -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
} }

Loading…
Cancel
Save