From 3e38fa54a5c3bbc270da00c275592879cc85717e Mon Sep 17 00:00:00 2001 From: Harshavardhana Date: Wed, 27 Mar 2024 18:08:07 -0700 Subject: [PATCH] set max versions to be IntMax to avoid premature failures (#19360) let users/customers set relevant values make default value to be non-applicable. --- cmd/handler-api.go | 9 +++++---- cmd/xl-storage-format-v2.go | 7 ++----- internal/config/api/api.go | 25 +++++++++++++++---------- 3 files changed, 22 insertions(+), 19 deletions(-) diff --git a/cmd/handler-api.go b/cmd/handler-api.go index e015ca143..93108af96 100644 --- a/cmd/handler-api.go +++ b/cmd/handler-api.go @@ -18,6 +18,7 @@ package cmd import ( + "math" "net/http" "os" "runtime" @@ -55,7 +56,7 @@ type apiConfig struct { gzipObjects bool rootAccess bool syncEvents bool - objectMaxVersions int + objectMaxVersions int64 } const ( @@ -393,13 +394,13 @@ func (t *apiConfig) isSyncEventsEnabled() bool { return t.syncEvents } -func (t *apiConfig) getObjectMaxVersions() int { +func (t *apiConfig) getObjectMaxVersions() int64 { t.mu.RLock() defer t.mu.RUnlock() if t.objectMaxVersions <= 0 { - // defaults to 'maxObjectVersions' when unset. - return maxObjectVersions + // defaults to 'IntMax' when unset. + return math.MaxInt64 } return t.objectMaxVersions diff --git a/cmd/xl-storage-format-v2.go b/cmd/xl-storage-format-v2.go index 6e710db8f..f36878fa9 100644 --- a/cmd/xl-storage-format-v2.go +++ b/cmd/xl-storage-format-v2.go @@ -40,9 +40,6 @@ import ( "github.com/tinylib/msgp/msgp" ) -// Reject creating new versions when a single object is cross maxObjectVersions -var maxObjectVersions = 10000 - var ( // XL header specifies the format xlHeader = [4]byte{'X', 'L', '2', ' '} @@ -1091,8 +1088,8 @@ func (x *xlMetaV2) addVersion(ver xlMetaV2Version) error { return err } - // returns error if we have exceeded maxObjectVersions - if len(x.versions)+1 > globalAPIConfig.getObjectMaxVersions() { + // returns error if we have exceeded configured object max versions + if int64(len(x.versions)+1) > globalAPIConfig.getObjectMaxVersions() { return errMaxVersionsExceeded } diff --git a/internal/config/api/api.go b/internal/config/api/api.go index e8bee1ded..487afc307 100644 --- a/internal/config/api/api.go +++ b/internal/config/api/api.go @@ -21,6 +21,7 @@ import ( "encoding/json" "errors" "fmt" + "math" "strconv" "strings" "time" @@ -155,7 +156,7 @@ var ( }, config.KV{ Key: apiObjectMaxVersions, - Value: "10000", + Value: "9223372036854775807", }, } ) @@ -178,7 +179,7 @@ type Config struct { GzipObjects bool `json:"gzip_objects"` RootAccess bool `json:"root_access"` SyncEvents bool `json:"sync_events"` - ObjectMaxVersions int `json:"object_max_versions"` + ObjectMaxVersions int64 `json:"object_max_versions"` } // UnmarshalJSON - Validate SS and RRS parity when unmarshalling JSON. @@ -317,16 +318,20 @@ func LookupConfig(kvs config.KVS) (cfg Config, err error) { maxVerStr := env.Get(EnvAPIObjectMaxVersions, "") if maxVerStr == "" { - maxVerStr = env.Get(EnvAPIObjectMaxVersionsLegacy, kvs.GetWithDefault(apiObjectMaxVersions, DefaultKVS)) + maxVerStr = env.Get(EnvAPIObjectMaxVersionsLegacy, kvs.Get(apiObjectMaxVersions)) } - maxVersions, err := strconv.Atoi(maxVerStr) - if err != nil { - return cfg, err + if maxVerStr != "" { + maxVersions, err := strconv.ParseInt(maxVerStr, 10, 64) + if err != nil { + return cfg, err + } + if maxVersions <= 0 { + return cfg, fmt.Errorf("invalid object max versions value: %v", maxVersions) + } + cfg.ObjectMaxVersions = maxVersions + } else { + cfg.ObjectMaxVersions = math.MaxInt64 } - if maxVersions <= 0 { - return cfg, fmt.Errorf("invalid object max versions value: %v", maxVersions) - } - cfg.ObjectMaxVersions = maxVersions return cfg, nil }