Allow etcd, cache setup to exit when starting gateway mode (#9842)

- Initialize etcd once per call
- Fail etcd, cache setup pro-actively for gateway setups
- Support deleting/updating bucket notification,
  tagging, lifecycle, sse-encryption
master
Harshavardhana 5 years ago committed by GitHub
parent 1a956424e0
commit cbb7a09376
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 6
      cmd/bucket-handlers.go
  2. 41
      cmd/bucket-metadata-sys.go
  3. 4
      cmd/bucket-metadata.go
  4. 16
      cmd/config-current.go
  5. 2
      cmd/erasure-zones.go

@ -46,7 +46,7 @@ import (
const ( const (
objectLockConfig = "object-lock.xml" objectLockConfig = "object-lock.xml"
bucketTaggingConfigFile = "tagging.xml" bucketTaggingConfig = "tagging.xml"
) )
// Check if there are buckets on server without corresponding entry in etcd backend and // Check if there are buckets on server without corresponding entry in etcd backend and
@ -1106,7 +1106,7 @@ func (api objectAPIHandlers) PutBucketTaggingHandler(w http.ResponseWriter, r *h
return return
} }
if err = globalBucketMetadataSys.Update(bucket, bucketTaggingConfigFile, configData); err != nil { if err = globalBucketMetadataSys.Update(bucket, bucketTaggingConfig, configData); err != nil {
writeErrorResponse(ctx, w, toAPIError(ctx, err), r.URL, guessIsBrowserReq(r)) writeErrorResponse(ctx, w, toAPIError(ctx, err), r.URL, guessIsBrowserReq(r))
return return
} }
@ -1174,7 +1174,7 @@ func (api objectAPIHandlers) DeleteBucketTaggingHandler(w http.ResponseWriter, r
return return
} }
if err := globalBucketMetadataSys.Update(bucket, bucketTaggingConfigFile, nil); err != nil { if err := globalBucketMetadataSys.Update(bucket, bucketTaggingConfig, nil); err != nil {
writeErrorResponse(ctx, w, toAPIError(ctx, err), r.URL, guessIsBrowserReq(r)) writeErrorResponse(ctx, w, toAPIError(ctx, err), r.URL, guessIsBrowserReq(r))
return return
} }

@ -77,7 +77,44 @@ func (sys *BucketMetadataSys) Update(bucket string, configFile string, configDat
if globalIsGateway { if globalIsGateway {
// This code is needed only for gateway implementations. // This code is needed only for gateway implementations.
if configFile == bucketPolicyConfig { switch configFile {
case bucketSSEConfig:
if globalGatewayName == "nas" {
meta, err := loadBucketMetadata(GlobalContext, objAPI, bucket)
if err != nil {
return err
}
meta.EncryptionConfigXML = configData
return meta.Save(GlobalContext, objAPI)
}
case bucketLifecycleConfig:
if globalGatewayName == "nas" {
meta, err := loadBucketMetadata(GlobalContext, objAPI, bucket)
if err != nil {
return err
}
meta.LifecycleConfigXML = configData
return meta.Save(GlobalContext, objAPI)
}
case bucketTaggingConfig:
if globalGatewayName == "nas" {
meta, err := loadBucketMetadata(GlobalContext, objAPI, bucket)
if err != nil {
return err
}
meta.TaggingConfigXML = configData
return meta.Save(GlobalContext, objAPI)
}
case bucketNotificationConfig:
if globalGatewayName == "nas" {
meta, err := loadBucketMetadata(GlobalContext, objAPI, bucket)
if err != nil {
return err
}
meta.NotificationConfigXML = configData
return meta.Save(GlobalContext, objAPI)
}
case bucketPolicyConfig:
if configData == nil { if configData == nil {
return objAPI.DeleteBucketPolicy(GlobalContext, bucket) return objAPI.DeleteBucketPolicy(GlobalContext, bucket)
} }
@ -108,7 +145,7 @@ func (sys *BucketMetadataSys) Update(bucket string, configFile string, configDat
meta.LifecycleConfigXML = configData meta.LifecycleConfigXML = configData
case bucketSSEConfig: case bucketSSEConfig:
meta.EncryptionConfigXML = configData meta.EncryptionConfigXML = configData
case bucketTaggingConfigFile: case bucketTaggingConfig:
meta.TaggingConfigXML = configData meta.TaggingConfigXML = configData
case objectLockConfig: case objectLockConfig:
meta.ObjectLockConfigXML = configData meta.ObjectLockConfigXML = configData

@ -220,7 +220,7 @@ func (b *BucketMetadata) convertLegacyConfigs(ctx context.Context, objectAPI Obj
bucketLifecycleConfig, bucketLifecycleConfig,
bucketQuotaConfigFile, bucketQuotaConfigFile,
bucketSSEConfig, bucketSSEConfig,
bucketTaggingConfigFile, bucketTaggingConfig,
objectLockConfig, objectLockConfig,
} }
@ -270,7 +270,7 @@ func (b *BucketMetadata) convertLegacyConfigs(ctx context.Context, objectAPI Obj
b.LifecycleConfigXML = configData b.LifecycleConfigXML = configData
case bucketSSEConfig: case bucketSSEConfig:
b.EncryptionConfigXML = configData b.EncryptionConfigXML = configData
case bucketTaggingConfigFile: case bucketTaggingConfig:
b.TaggingConfigXML = configData b.TaggingConfigXML = configData
case objectLockConfig: case objectLockConfig:
b.ObjectLockConfigXML = configData b.ObjectLockConfigXML = configData

@ -311,6 +311,8 @@ func validateConfig(s config.Config) error {
globalNotificationSys.ConfiguredTargetIDs()) globalNotificationSys.ConfiguredTargetIDs())
} }
var syncEtcdOnce sync.Once
func lookupConfigs(s config.Config) { func lookupConfigs(s config.Config) {
ctx := GlobalContext ctx := GlobalContext
@ -325,15 +327,25 @@ func lookupConfigs(s config.Config) {
etcdCfg, err := etcd.LookupConfig(s[config.EtcdSubSys][config.Default], globalRootCAs) etcdCfg, err := etcd.LookupConfig(s[config.EtcdSubSys][config.Default], globalRootCAs)
if err != nil { if err != nil {
if globalIsGateway {
logger.FatalIf(err, "Unable to initialize etcd config")
} else {
logger.LogIf(ctx, fmt.Errorf("Unable to initialize etcd config: %w", err)) logger.LogIf(ctx, fmt.Errorf("Unable to initialize etcd config: %w", err))
} }
}
if etcdCfg.Enabled { if etcdCfg.Enabled {
syncEtcdOnce.Do(func() {
globalEtcdClient, err = etcd.New(etcdCfg) globalEtcdClient, err = etcd.New(etcdCfg)
if err != nil { if err != nil {
if globalIsGateway {
logger.FatalIf(err, "Unable to initialize etcd config")
} else {
logger.LogIf(ctx, fmt.Errorf("Unable to initialize etcd config: %w", err)) logger.LogIf(ctx, fmt.Errorf("Unable to initialize etcd config: %w", err))
} }
} }
})
}
// Bucket federation is 'true' only when IAM assets are not namespaced // Bucket federation is 'true' only when IAM assets are not namespaced
// per tenant and all tenants interested in globally available users // per tenant and all tenants interested in globally available users
@ -377,8 +389,12 @@ func lookupConfigs(s config.Config) {
globalCacheConfig, err = cache.LookupConfig(s[config.CacheSubSys][config.Default]) globalCacheConfig, err = cache.LookupConfig(s[config.CacheSubSys][config.Default])
if err != nil { if err != nil {
if globalIsGateway {
logger.FatalIf(err, "Unable to setup cache")
} else {
logger.LogIf(ctx, fmt.Errorf("Unable to setup cache: %w", err)) logger.LogIf(ctx, fmt.Errorf("Unable to setup cache: %w", err))
} }
}
if globalCacheConfig.Enabled { if globalCacheConfig.Enabled {
if cacheEncKey := env.Get(cache.EnvCacheEncryptionMasterKey, ""); cacheEncKey != "" { if cacheEncKey := env.Get(cache.EnvCacheEncryptionMasterKey, ""); cacheEncKey != "" {

@ -1867,7 +1867,7 @@ func (z *erasureZones) getZoneAndSet(id string) (int, int, error) {
} }
} }
} }
return 0, 0, fmt.Errorf("ID(%s) %w", errDiskNotFound) return 0, 0, fmt.Errorf("DiskID(%s) %w", id, errDiskNotFound)
} }
// IsReady - Returns true, when all the erasure sets are writable. // IsReady - Returns true, when all the erasure sets are writable.

Loading…
Cancel
Save