From dcd63b41466edd7207eb7a64ec5a49ea96bbdf18 Mon Sep 17 00:00:00 2001 From: Harshavardhana Date: Mon, 24 Feb 2020 06:39:11 +0530 Subject: [PATCH] fix: avoid double ListBuckets() loading object lock (#9031) --- cmd/notification.go | 53 +-------------------------------------------- cmd/object-lock.go | 43 ++++++++++++++++++++++++++++++++++++ cmd/server-main.go | 8 ++++++- 3 files changed, 51 insertions(+), 53 deletions(-) diff --git a/cmd/notification.go b/cmd/notification.go index 8abbc1892..3f0de203d 100644 --- a/cmd/notification.go +++ b/cmd/notification.go @@ -688,53 +688,6 @@ func (sys *NotificationSys) load(buckets []BucketInfo, objAPI ObjectLayer) error return nil } -func (sys *NotificationSys) initBucketObjectLockConfig(objAPI ObjectLayer) error { - buckets, err := objAPI.ListBuckets(context.Background()) - if err != nil { - return err - } - for _, bucket := range buckets { - ctx := logger.SetReqInfo(context.Background(), &logger.ReqInfo{BucketName: bucket.Name}) - configFile := path.Join(bucketConfigPrefix, bucket.Name, bucketObjectLockEnabledConfigFile) - bucketObjLockData, err := readConfig(ctx, objAPI, configFile) - - if err != nil { - if err == errConfigNotFound { - continue - } - return err - } - - if string(bucketObjLockData) != bucketObjectLockEnabledConfig { - // this should never happen - logger.LogIf(ctx, objectlock.ErrMalformedBucketObjectConfig) - continue - } - - configFile = path.Join(bucketConfigPrefix, bucket.Name, objectLockConfig) - configData, err := readConfig(ctx, objAPI, configFile) - - if err != nil { - if err == errConfigNotFound { - globalBucketObjectLockConfig.Set(bucket.Name, objectlock.Retention{}) - continue - } - return err - } - - config, err := objectlock.ParseObjectLockConfig(bytes.NewReader(configData)) - if err != nil { - return err - } - retention := objectlock.Retention{} - if config.Rule != nil { - retention = config.ToRetention() - } - globalBucketObjectLockConfig.Set(bucket.Name, retention) - } - return nil -} - // Init - initializes notification system from notification.xml and listener.json of all buckets. func (sys *NotificationSys) Init(buckets []BucketInfo, objAPI ObjectLayer) error { if objAPI == nil { @@ -754,11 +707,7 @@ func (sys *NotificationSys) Init(buckets []BucketInfo, objAPI ObjectLayer) error } } - if err := sys.load(buckets, objAPI); err != nil { - return err - } - - return sys.initBucketObjectLockConfig(objAPI) + return sys.load(buckets, objAPI) } // AddRulesMap - adds rules map for bucket name. diff --git a/cmd/object-lock.go b/cmd/object-lock.go index 159f601af..1d0e97534 100644 --- a/cmd/object-lock.go +++ b/cmd/object-lock.go @@ -17,8 +17,10 @@ package cmd import ( + "bytes" "context" "net/http" + "path" "github.com/minio/minio/cmd/logger" objectlock "github.com/minio/minio/pkg/bucket/object/lock" @@ -244,3 +246,44 @@ func checkPutObjectLockAllowed(ctx context.Context, r *http.Request, bucket, obj } return mode, retainDate, legalHold, ErrNone } + +func initBucketObjectLockConfig(buckets []BucketInfo, objAPI ObjectLayer) error { + for _, bucket := range buckets { + ctx := logger.SetReqInfo(context.Background(), &logger.ReqInfo{BucketName: bucket.Name}) + configFile := path.Join(bucketConfigPrefix, bucket.Name, bucketObjectLockEnabledConfigFile) + bucketObjLockData, err := readConfig(ctx, objAPI, configFile) + if err != nil { + if err == errConfigNotFound { + continue + } + return err + } + + if string(bucketObjLockData) != bucketObjectLockEnabledConfig { + // this should never happen + logger.LogIf(ctx, objectlock.ErrMalformedBucketObjectConfig) + continue + } + + configFile = path.Join(bucketConfigPrefix, bucket.Name, objectLockConfig) + configData, err := readConfig(ctx, objAPI, configFile) + if err != nil { + if err == errConfigNotFound { + globalBucketObjectLockConfig.Set(bucket.Name, objectlock.Retention{}) + continue + } + return err + } + + config, err := objectlock.ParseObjectLockConfig(bytes.NewReader(configData)) + if err != nil { + return err + } + retention := objectlock.Retention{} + if config.Rule != nil { + retention = config.ToRetention() + } + globalBucketObjectLockConfig.Set(bucket.Name, retention) + } + return nil +} diff --git a/cmd/server-main.go b/cmd/server-main.go index b88371d29..d8c86316f 100644 --- a/cmd/server-main.go +++ b/cmd/server-main.go @@ -263,7 +263,12 @@ func initAllSubsystems(buckets []BucketInfo, newObject ObjectLayer) (err error) // Initialize policy system. if err = globalPolicySys.Init(buckets, newObject); err != nil { - return fmt.Errorf("Unable to initialize policy system; %w", err) + return fmt.Errorf("Unable to initialize policy system: %w", err) + } + + // Initialize bucket object lock. + if err = initBucketObjectLockConfig(buckets, newObject); err != nil { + return fmt.Errorf("Unable to initialize object lock system: %w", err) } // Initialize lifecycle system. @@ -275,6 +280,7 @@ func initAllSubsystems(buckets []BucketInfo, newObject ObjectLayer) (err error) if err = globalBucketSSEConfigSys.Init(buckets, newObject); err != nil { return fmt.Errorf("Unable to initialize bucket encryption subsystem: %w", err) } + return nil }