allow bucket import to be idempotent (#18873)

do not need to be defensive in our approach,
we should simply override anything everything
in import process, do not care about what
currently exists on the disk - backup is the
source of truth.
This commit is contained in:
Harshavardhana 2024-01-25 17:20:54 -08:00 committed by GitHub
parent a113b2c394
commit f449a7ae2c
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -680,24 +680,17 @@ func (a adminAPIHandlers) ImportBucketMetadataHandler(w http.ResponseWriter, r *
if _, ok := bucketMap[bucket]; !ok { if _, ok := bucketMap[bucket]; !ok {
opts := MakeBucketOptions{ opts := MakeBucketOptions{
LockEnabled: config.Enabled(), LockEnabled: config.Enabled(),
ForceCreate: true, // ignore if it already exists
} }
err = objectAPI.MakeBucket(ctx, bucket, opts) err = objectAPI.MakeBucket(ctx, bucket, opts)
if err != nil { if err != nil {
if _, ok := err.(BucketExists); !ok { rpt.SetStatus(bucket, fileName, err)
rpt.SetStatus(bucket, fileName, err) continue
continue
}
} }
v := newBucketMetadata(bucket) v := newBucketMetadata(bucket)
bucketMap[bucket] = &v bucketMap[bucket] = &v
} }
// Deny object locking configuration settings on existing buckets without object lock enabled.
if _, _, err = globalBucketMetadataSys.GetObjectLockConfig(bucket); err != nil {
rpt.SetStatus(bucket, fileName, err)
continue
}
bucketMap[bucket].ObjectLockConfigXML = configData bucketMap[bucket].ObjectLockConfigXML = configData
bucketMap[bucket].ObjectLockConfigUpdatedAt = updatedAt bucketMap[bucket].ObjectLockConfigUpdatedAt = updatedAt
rpt.SetStatus(bucket, fileName, nil) rpt.SetStatus(bucket, fileName, nil)
@ -724,11 +717,11 @@ func (a adminAPIHandlers) ImportBucketMetadataHandler(w http.ResponseWriter, r *
continue continue
} }
if _, ok := bucketMap[bucket]; !ok { if _, ok := bucketMap[bucket]; !ok {
if err = objectAPI.MakeBucket(ctx, bucket, MakeBucketOptions{}); err != nil { if err = objectAPI.MakeBucket(ctx, bucket, MakeBucketOptions{
if _, ok := err.(BucketExists); !ok { ForceCreate: true, // ignore if it already exists
rpt.SetStatus(bucket, fileName, err) }); err != nil {
continue rpt.SetStatus(bucket, fileName, err)
} continue
} }
v := newBucketMetadata(bucket) v := newBucketMetadata(bucket)
bucketMap[bucket] = &v bucketMap[bucket] = &v
@ -776,12 +769,12 @@ func (a adminAPIHandlers) ImportBucketMetadataHandler(w http.ResponseWriter, r *
// create bucket if it does not exist yet. // create bucket if it does not exist yet.
if _, ok := bucketMap[bucket]; !ok { if _, ok := bucketMap[bucket]; !ok {
err = objectAPI.MakeBucket(ctx, bucket, MakeBucketOptions{}) err = objectAPI.MakeBucket(ctx, bucket, MakeBucketOptions{
ForceCreate: true, // ignore if it already exists
})
if err != nil { if err != nil {
if _, ok := err.(BucketExists); !ok { rpt.SetStatus(bucket, "", err)
rpt.SetStatus(bucket, "", err) continue
continue
}
} }
v := newBucketMetadata(bucket) v := newBucketMetadata(bucket)
bucketMap[bucket] = &v bucketMap[bucket] = &v