From a5f670d904aa71fef7ade4243b1aae503808235d Mon Sep 17 00:00:00 2001 From: Roman Loginov Date: Fri, 16 Aug 2024 14:19:57 +0300 Subject: [PATCH] [#329] Reduce using mutex when update app settings Signed-off-by: Roman Loginov --- cmd/s3-gw/app.go | 132 ++++++++++++++--------------------------------- 1 file changed, 38 insertions(+), 94 deletions(-) diff --git a/cmd/s3-gw/app.go b/cmd/s3-gw/app.go index f77bcda..8989a7f 100644 --- a/cmd/s3-gw/app.go +++ b/cmd/s3-gw/app.go @@ -234,51 +234,55 @@ func newAppSettings(log *Logger, v *viper.Viper) *appSettings { } func (s *appSettings) update(v *viper.Viper, log *zap.Logger) { - s.updateNamespacesSettings(v, log) - s.useDefaultXMLNamespace(v.GetBool(cfgKludgeUseDefaultXMLNS)) - s.setBypassContentEncodingInChunks(v.GetBool(cfgKludgeBypassContentEncodingCheckInChunks)) - s.setClientCut(v.GetBool(cfgClientCut)) - s.setBufferMaxSizeForPut(v.GetUint64(cfgBufferMaxSizeForPut)) - s.setMD5Enabled(v.GetBool(cfgMD5Enabled)) - s.setPolicyDenyByDefault(v.GetBool(cfgPolicyDenyByDefault)) - s.setSourceIPHeader(v.GetString(cfgSourceIPHeader)) - s.setRetryMaxAttempts(fetchRetryMaxAttempts(v)) - s.setRetryMaxBackoff(fetchRetryMaxBackoff(v)) - s.setRetryStrategy(fetchRetryStrategy(v)) - s.setVHSSettings(v, log) -} - -func (s *appSettings) updateNamespacesSettings(v *viper.Viper, log *zap.Logger) { - nsHeader := v.GetString(cfgResolveNamespaceHeader) + namespaceHeader := v.GetString(cfgResolveNamespaceHeader) nsConfig, defaultNamespaces := fetchNamespacesConfig(log, v) - - s.mu.Lock() - defer s.mu.Unlock() - - s.namespaceHeader = nsHeader - s.defaultNamespaces = defaultNamespaces - s.namespaces = nsConfig.Namespaces -} - -func (s *appSettings) setVHSSettings(v *viper.Viper, log *zap.Logger) { + defaultXMLNS := v.GetBool(cfgKludgeUseDefaultXMLNS) + bypassContentEncodingInChunks := v.GetBool(cfgKludgeBypassContentEncodingCheckInChunks) + clientCut := v.GetBool(cfgClientCut) + maxBufferSizeForPut := v.GetUint64(cfgBufferMaxSizeForPut) + md5Enabled := v.GetBool(cfgMD5Enabled) + policyDenyByDefault := v.GetBool(cfgPolicyDenyByDefault) + sourceIPHeader := v.GetString(cfgSourceIPHeader) + retryMaxAttempts := fetchRetryMaxAttempts(v) + retryMaxBackoff := fetchRetryMaxBackoff(v) + retryStrategy := fetchRetryStrategy(v) domains := fetchDomains(v, log) vhsEnabled := v.GetBool(cfgVHSEnabled) vhsHeader := v.GetString(cfgVHSHeader) servernameHeader := v.GetString(cfgServernameHeader) + vhsNamespacesEnabled := s.prepareVHSNamespaces(v, log) + + s.mu.Lock() + defer s.mu.Unlock() + + s.namespaceHeader = namespaceHeader + s.defaultNamespaces = defaultNamespaces + s.namespaces = nsConfig.Namespaces + s.defaultXMLNS = defaultXMLNS + s.bypassContentEncodingInChunks = bypassContentEncodingInChunks + s.clientCut = clientCut + s.maxBufferSizeForPut = maxBufferSizeForPut + s.md5Enabled = md5Enabled + s.policyDenyByDefault = policyDenyByDefault + s.sourceIPHeader = sourceIPHeader + s.retryMaxAttempts = retryMaxAttempts + s.retryMaxBackoff = retryMaxBackoff + s.retryStrategy = retryStrategy + s.domains = domains + s.vhsEnabled = vhsEnabled + s.vhsHeader = vhsHeader + s.servernameHeader = servernameHeader + s.vhsNamespacesEnabled = vhsNamespacesEnabled +} + +func (s *appSettings) prepareVHSNamespaces(v *viper.Viper, log *zap.Logger) map[string]bool { nsMap := fetchVHSNamespaces(v, log) vhsNamespaces := make(map[string]bool, len(nsMap)) for ns, flag := range nsMap { vhsNamespaces[s.ResolveNamespaceAlias(ns)] = flag } - s.mu.Lock() - defer s.mu.Unlock() - - s.domains = domains - s.vhsEnabled = vhsEnabled - s.vhsHeader = vhsHeader - s.servernameHeader = servernameHeader - s.vhsNamespacesEnabled = vhsNamespaces + return vhsNamespaces } func (s *appSettings) Domains() []string { @@ -317,36 +321,18 @@ func (s *appSettings) BypassContentEncodingInChunks() bool { return s.bypassContentEncodingInChunks } -func (s *appSettings) setBypassContentEncodingInChunks(bypass bool) { - s.mu.Lock() - s.bypassContentEncodingInChunks = bypass - s.mu.Unlock() -} - func (s *appSettings) ClientCut() bool { s.mu.RLock() defer s.mu.RUnlock() return s.clientCut } -func (s *appSettings) setClientCut(clientCut bool) { - s.mu.Lock() - s.clientCut = clientCut - s.mu.Unlock() -} - func (s *appSettings) BufferMaxSizeForPut() uint64 { s.mu.RLock() defer s.mu.RUnlock() return s.maxBufferSizeForPut } -func (s *appSettings) setBufferMaxSizeForPut(size uint64) { - s.mu.Lock() - s.maxBufferSizeForPut = size - s.mu.Unlock() -} - func (s *appSettings) DefaultPlacementPolicy(namespace string) netmap.PlacementPolicy { s.mu.RLock() defer s.mu.RUnlock() @@ -394,12 +380,6 @@ func (s *appSettings) NewXMLDecoder(r io.Reader) *xml.Decoder { return dec } -func (s *appSettings) useDefaultXMLNamespace(useDefaultNamespace bool) { - s.mu.Lock() - s.defaultXMLNS = useDefaultNamespace - s.mu.Unlock() -} - func (s *appSettings) DefaultMaxAge() int { return s.defaultMaxAge } @@ -418,12 +398,6 @@ func (s *appSettings) MD5Enabled() bool { return s.md5Enabled } -func (s *appSettings) setMD5Enabled(md5Enabled bool) { - s.mu.Lock() - s.md5Enabled = md5Enabled - s.mu.Unlock() -} - func (s *appSettings) NamespaceHeader() string { s.mu.RLock() defer s.mu.RUnlock() @@ -459,54 +433,24 @@ func (s *appSettings) PolicyDenyByDefault() bool { return s.policyDenyByDefault } -func (s *appSettings) setPolicyDenyByDefault(policyDenyByDefault bool) { - s.mu.Lock() - s.policyDenyByDefault = policyDenyByDefault - s.mu.Unlock() -} - -func (s *appSettings) setSourceIPHeader(header string) { - s.mu.Lock() - s.sourceIPHeader = header - s.mu.Unlock() -} - func (s *appSettings) SourceIPHeader() string { s.mu.RLock() defer s.mu.RUnlock() return s.sourceIPHeader } -func (s *appSettings) setRetryMaxAttempts(maxAttempts int) { - s.mu.Lock() - s.retryMaxAttempts = maxAttempts - s.mu.Unlock() -} - func (s *appSettings) RetryMaxAttempts() int { s.mu.RLock() defer s.mu.RUnlock() return s.retryMaxAttempts } -func (s *appSettings) setRetryMaxBackoff(maxBackoff time.Duration) { - s.mu.Lock() - s.retryMaxBackoff = maxBackoff - s.mu.Unlock() -} - func (s *appSettings) RetryMaxBackoff() time.Duration { s.mu.RLock() defer s.mu.RUnlock() return s.retryMaxBackoff } -func (s *appSettings) setRetryStrategy(strategy handler.RetryStrategy) { - s.mu.Lock() - s.retryStrategy = strategy - s.mu.Unlock() -} - func (s *appSettings) RetryStrategy() handler.RetryStrategy { s.mu.RLock() defer s.mu.RUnlock()