[#74] Replace atomics with mutex for reloadable params #84

Merged
alexvanin merged 1 commit from mbiryukova/frostfs-http-gw:feature/replace_atomics_with_mutex into master 2023-10-04 10:50:20 +00:00
4 changed files with 45 additions and 32 deletions

View file

@ -50,7 +50,7 @@ type (
resolver *resolver.ContainerResolver resolver *resolver.ContainerResolver
metrics *gateMetrics metrics *gateMetrics
services []*metrics.Service services []*metrics.Service
settings *handler.Settings settings *appSettings
servers []Server servers []Server
} }
@ -69,6 +69,13 @@ type (
mu sync.RWMutex mu sync.RWMutex
enabled bool enabled bool
} }
// appSettings stores reloading parameters, so it has to provide getters and setters which use RWMutex.
appSettings struct {
mu sync.RWMutex
defaultTimestamp bool
zipCompression bool
}
) )
// WithLogger returns Option to set a specific logger. // WithLogger returns Option to set a specific logger.
@ -133,8 +140,32 @@ func newApp(ctx context.Context, opt ...Option) App {
return a return a
} }
func (s *appSettings) DefaultTimestamp() bool {
s.mu.RLock()
defer s.mu.RUnlock()
return s.defaultTimestamp
}
func (s *appSettings) setDefaultTimestamp(val bool) {
s.mu.Lock()
s.defaultTimestamp = val
s.mu.Unlock()
}
func (s *appSettings) ZipCompression() bool {
s.mu.RLock()
defer s.mu.RUnlock()
return s.zipCompression
}
func (s *appSettings) setZipCompression(val bool) {
s.mu.Lock()
s.zipCompression = val
s.mu.Unlock()
}
func (a *app) initAppSettings() { func (a *app) initAppSettings() {
a.settings = &handler.Settings{} a.settings = &appSettings{}
a.updateSettings() a.updateSettings()
} }
@ -415,8 +446,8 @@ func (a *app) configReload(ctx context.Context) {
} }
func (a *app) updateSettings() { func (a *app) updateSettings() {
a.settings.SetDefaultTimestamp(a.cfg.GetBool(cfgUploaderHeaderEnableDefaultTimestamp)) a.settings.setDefaultTimestamp(a.cfg.GetBool(cfgUploaderHeaderEnableDefaultTimestamp))
a.settings.SetZipCompression(a.cfg.GetBool(cfgZipCompression)) a.settings.setZipCompression(a.cfg.GetBool(cfgZipCompression))
} }
func (a *app) startServices() { func (a *app) startServices() {

View file

@ -72,7 +72,7 @@ func (h *Handler) getContainer(ctx context.Context, cnrID cid.ID) (container.Con
func (h *Handler) addObjectToZip(zw *zip.Writer, obj *object.Object) (io.Writer, error) { func (h *Handler) addObjectToZip(zw *zip.Writer, obj *object.Object) (io.Writer, error) {
method := zip.Store method := zip.Store
if h.settings.ZipCompression() { if h.config.ZipCompression() {
method = zip.Deflate method = zip.Deflate
} }

View file

@ -5,7 +5,6 @@ import (
"errors" "errors"
"io" "io"
"net/url" "net/url"
"sync/atomic"
"git.frostfs.info/TrueCloudLab/frostfs-http-gw/internal/logs" "git.frostfs.info/TrueCloudLab/frostfs-http-gw/internal/logs"
"git.frostfs.info/TrueCloudLab/frostfs-http-gw/resolver" "git.frostfs.info/TrueCloudLab/frostfs-http-gw/resolver"
@ -21,43 +20,26 @@ import (
"go.uber.org/zap" "go.uber.org/zap"
) )
type Config interface {
DefaultTimestamp() bool
ZipCompression() bool
dkirillov marked this conversation as resolved Outdated

Why do we need setters now?

Why do we need setters now?

Removed

Removed
}
type Handler struct { type Handler struct {
log *zap.Logger log *zap.Logger
pool *pool.Pool pool *pool.Pool
ownerID *user.ID ownerID *user.ID
settings *Settings config Config
containerResolver *resolver.ContainerResolver containerResolver *resolver.ContainerResolver
tree *tree.Tree tree *tree.Tree
} }
// Settings stores reloading parameters, so it has to provide atomic getters and setters. func New(params *utils.AppParams, config Config, tree *tree.Tree) *Handler {
type Settings struct {
defaultTimestamp atomic.Bool
zipCompression atomic.Bool
}
func (s *Settings) DefaultTimestamp() bool {
return s.defaultTimestamp.Load()
}
func (s *Settings) SetDefaultTimestamp(val bool) {
s.defaultTimestamp.Store(val)
}
func (s *Settings) ZipCompression() bool {
return s.zipCompression.Load()
}
func (s *Settings) SetZipCompression(val bool) {
s.zipCompression.Store(val)
}
func New(params *utils.AppParams, settings *Settings, tree *tree.Tree) *Handler {
return &Handler{ return &Handler{
log: params.Logger, log: params.Logger,
pool: params.Pool, pool: params.Pool,
ownerID: params.Owner, ownerID: params.Owner,
settings: settings, config: config,
containerResolver: params.Resolver, containerResolver: params.Resolver,
tree: tree, tree: tree,
} }

View file

@ -121,7 +121,7 @@ func (h *Handler) Upload(req *fasthttp.RequestCtx) {
attributes = append(attributes, *filename) attributes = append(attributes, *filename)
} }
// sets Timestamp attribute if it wasn't set from header and enabled by settings // sets Timestamp attribute if it wasn't set from header and enabled by settings
if _, ok := filtered[object.AttributeTimestamp]; !ok && h.settings.DefaultTimestamp() { if _, ok := filtered[object.AttributeTimestamp]; !ok && h.config.DefaultTimestamp() {
timestamp := object.NewAttribute() timestamp := object.NewAttribute()
timestamp.SetKey(object.AttributeTimestamp) timestamp.SetKey(object.AttributeTimestamp)
timestamp.SetValue(strconv.FormatInt(time.Now().Unix(), 10)) timestamp.SetValue(strconv.FormatInt(time.Now().Unix(), 10))