mirror of
https://github.com/pgsty/minio.git
synced 2026-11-01 05:12:07 +03:00
fix: preserve metadata during bucket creation and adoption
After storage bucket creation, merge required versioning and lock defaults into the latest on-disk metadata under metadata.lock. Avoid ForceCreate and site-adoption rewrites that replaced existing bucket configuration.\n\nRefs: #102 Signed-off-by: Feng Ruohang <rh@vonng.com>
This commit is contained in:
+44
-13
@@ -882,23 +882,54 @@ func (z *erasureServerPools) MakeBucket(ctx context.Context, bucket string, opts
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
// If it doesn't exist we get a new, so ignore errors
|
if isMinioMetaBucketName(bucket) {
|
||||||
meta := newBucketMetadata(bucket)
|
meta := newBucketMetadata(bucket)
|
||||||
meta.SetCreatedAt(opts.CreatedAt)
|
meta.SetCreatedAt(opts.CreatedAt)
|
||||||
if opts.LockEnabled {
|
if err := meta.Save(context.Background(), z); err != nil {
|
||||||
meta.VersioningConfigXML = enabledBucketVersioningConfig
|
return toObjectErr(err, bucket)
|
||||||
meta.ObjectLockConfigXML = enabledBucketObjectLockConfig
|
}
|
||||||
|
globalBucketMetadataSys.Set(bucket, meta)
|
||||||
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
if opts.VersioningEnabled {
|
ctx, unlock, err := lockBucketMetadata(ctx, z, bucket)
|
||||||
meta.VersioningConfigXML = enabledBucketVersioningConfig
|
if err != nil {
|
||||||
}
|
return toObjectErr(err, bucket)
|
||||||
|
}
|
||||||
if err := meta.Save(context.Background(), z); err != nil {
|
err = func() error {
|
||||||
|
defer unlock()
|
||||||
|
meta, err := readBucketMetadata(ctx, z, bucket)
|
||||||
|
if errors.Is(err, errConfigNotFound) {
|
||||||
|
meta = newBucketMetadata(bucket)
|
||||||
|
} else if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if meta.Created.IsZero() {
|
||||||
|
meta.SetCreatedAt(opts.CreatedAt)
|
||||||
|
}
|
||||||
|
if opts.LockEnabled {
|
||||||
|
if len(meta.VersioningConfigXML) == 0 {
|
||||||
|
meta.VersioningConfigXML = enabledBucketVersioningConfig
|
||||||
|
meta.VersioningConfigUpdatedAt = meta.Created
|
||||||
|
}
|
||||||
|
if len(meta.ObjectLockConfigXML) == 0 {
|
||||||
|
meta.ObjectLockConfigXML = enabledBucketObjectLockConfig
|
||||||
|
meta.ObjectLockConfigUpdatedAt = meta.Created
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if opts.VersioningEnabled && len(meta.VersioningConfigXML) == 0 {
|
||||||
|
meta.VersioningConfigXML = enabledBucketVersioningConfig
|
||||||
|
meta.VersioningConfigUpdatedAt = meta.Created
|
||||||
|
}
|
||||||
|
if err = meta.Save(ctx, z); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
globalBucketMetadataSys.Set(bucket, meta)
|
||||||
|
return nil
|
||||||
|
}()
|
||||||
|
if err != nil {
|
||||||
return toObjectErr(err, bucket)
|
return toObjectErr(err, bucket)
|
||||||
}
|
}
|
||||||
|
|
||||||
globalBucketMetadataSys.Set(bucket, meta)
|
|
||||||
|
|
||||||
// Success.
|
// Success.
|
||||||
return nil
|
return nil
|
||||||
|
|||||||
+20
-21
@@ -930,35 +930,34 @@ func (c *SiteReplicationSys) PeerBucketMakeWithVersioningHandler(ctx context.Con
|
|||||||
if !ok1 && !ok2 {
|
if !ok1 && !ok2 {
|
||||||
return wrapSRErr(c.annotateErr(makeBucketWithVersion, err))
|
return wrapSRErr(c.annotateErr(makeBucketWithVersion, err))
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
// Load updated bucket metadata into memory as new
|
|
||||||
// bucket was created.
|
|
||||||
globalNotificationSys.LoadBucketMetadata(GlobalContext, bucket)
|
|
||||||
}
|
}
|
||||||
|
ctx, unlock, err := lockBucketMetadata(ctx, objAPI, bucket)
|
||||||
meta, err := globalBucketMetadataSys.Get(bucket)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return wrapSRErr(c.annotateErr(makeBucketWithVersion, err))
|
return wrapSRErr(c.annotateErr(makeBucketWithVersion, err))
|
||||||
}
|
}
|
||||||
|
err = func() error {
|
||||||
meta.SetCreatedAt(opts.CreatedAt)
|
defer unlock()
|
||||||
|
meta, err := loadBucketMetadataParse(ctx, objAPI, bucket, true)
|
||||||
if err := enablePeerBucketVersioning(&meta); err != nil {
|
if err != nil {
|
||||||
return wrapSRErr(err)
|
return err
|
||||||
}
|
|
||||||
if opts.LockEnabled && len(meta.ObjectLockConfigXML) == 0 {
|
|
||||||
meta.ObjectLockConfigXML = enabledBucketObjectLockConfig
|
|
||||||
if meta.ObjectLockConfigUpdatedAt.IsZero() {
|
|
||||||
meta.ObjectLockConfigUpdatedAt = meta.Created
|
|
||||||
}
|
}
|
||||||
}
|
meta.SetCreatedAt(opts.CreatedAt)
|
||||||
|
|
||||||
if err := meta.Save(context.Background(), objAPI); err != nil {
|
if err = enablePeerBucketVersioning(&meta); err != nil {
|
||||||
return wrapSRErr(err)
|
return err
|
||||||
|
}
|
||||||
|
if opts.LockEnabled && len(meta.ObjectLockConfigXML) == 0 {
|
||||||
|
meta.ObjectLockConfigXML = enabledBucketObjectLockConfig
|
||||||
|
if meta.ObjectLockConfigUpdatedAt.IsZero() {
|
||||||
|
meta.ObjectLockConfigUpdatedAt = meta.Created
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return globalBucketMetadataSys.saveMetadata(ctx, objAPI, meta)
|
||||||
|
}()
|
||||||
|
if err != nil {
|
||||||
|
return wrapSRErr(c.annotateErr(makeBucketWithVersion, err))
|
||||||
}
|
}
|
||||||
|
|
||||||
globalBucketMetadataSys.Set(bucket, meta)
|
|
||||||
|
|
||||||
// Load updated bucket metadata into memory as new metadata updated.
|
// Load updated bucket metadata into memory as new metadata updated.
|
||||||
globalNotificationSys.LoadBucketMetadata(GlobalContext, bucket)
|
globalNotificationSys.LoadBucketMetadata(GlobalContext, bucket)
|
||||||
return nil
|
return nil
|
||||||
|
|||||||
Reference in New Issue
Block a user