[#158] Rework app settings
Update settings by sighup using one lock/unlock operation Signed-off-by: Denis Kirillov <d.kirillov@yadro.com>
This commit is contained in:
parent
70846fdaec
commit
8dc5272965
2 changed files with 76 additions and 106 deletions
|
@ -6,13 +6,11 @@ import (
|
||||||
"crypto/x509"
|
"crypto/x509"
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
|
||||||
"net/http"
|
"net/http"
|
||||||
"os"
|
"os"
|
||||||
"os/signal"
|
"os/signal"
|
||||||
"runtime/debug"
|
"runtime/debug"
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
|
||||||
"sync"
|
"sync"
|
||||||
"syscall"
|
"syscall"
|
||||||
"time"
|
"time"
|
||||||
|
@ -159,23 +157,47 @@ func newApp(ctx context.Context, opt ...Option) App {
|
||||||
a.initResolver()
|
a.initResolver()
|
||||||
a.initMetrics()
|
a.initMetrics()
|
||||||
a.initTracing(ctx)
|
a.initTracing(ctx)
|
||||||
a.loadIndexPageTemplate()
|
|
||||||
|
|
||||||
return a
|
return a
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (a *app) initAppSettings() {
|
||||||
|
a.settings = &appSettings{
|
||||||
|
reconnectInterval: fetchReconnectInterval(a.cfg),
|
||||||
|
}
|
||||||
|
a.settings.update(a.cfg, a.log)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *appSettings) update(v *viper.Viper, l *zap.Logger) {
|
||||||
|
defaultTimestamp := v.GetBool(cfgUploaderHeaderEnableDefaultTimestamp)
|
||||||
|
zipCompression := v.GetBool(cfgZipCompression)
|
||||||
|
returnIndexPage := v.GetBool(cfgIndexPageEnabled)
|
||||||
|
clientCut := v.GetBool(cfgClientCut)
|
||||||
|
bufferMaxSizeForPut := v.GetUint64(cfgBufferMaxSizeForPut)
|
||||||
|
namespaceHeader := v.GetString(cfgResolveNamespaceHeader)
|
||||||
|
defaultNamespaces := fetchDefaultNamespaces(v)
|
||||||
|
indexPage, indexEnabled := fetchIndexPageTemplate(v, l)
|
||||||
|
|
||||||
|
s.mu.Lock()
|
||||||
|
defer s.mu.Unlock()
|
||||||
|
|
||||||
|
s.defaultTimestamp = defaultTimestamp
|
||||||
|
s.zipCompression = zipCompression
|
||||||
|
s.returnIndexPage = returnIndexPage
|
||||||
|
s.clientCut = clientCut
|
||||||
|
s.bufferMaxSizeForPut = bufferMaxSizeForPut
|
||||||
|
s.namespaceHeader = namespaceHeader
|
||||||
|
s.defaultNamespaces = defaultNamespaces
|
||||||
|
s.returnIndexPage = indexEnabled
|
||||||
|
s.indexPageTemplate = indexPage
|
||||||
|
}
|
||||||
|
|
||||||
func (s *appSettings) DefaultTimestamp() bool {
|
func (s *appSettings) DefaultTimestamp() bool {
|
||||||
s.mu.RLock()
|
s.mu.RLock()
|
||||||
defer s.mu.RUnlock()
|
defer s.mu.RUnlock()
|
||||||
return s.defaultTimestamp
|
return s.defaultTimestamp
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *appSettings) setDefaultTimestamp(val bool) {
|
|
||||||
s.mu.Lock()
|
|
||||||
s.defaultTimestamp = val
|
|
||||||
s.mu.Unlock()
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *appSettings) ZipCompression() bool {
|
func (s *appSettings) ZipCompression() bool {
|
||||||
s.mu.RLock()
|
s.mu.RLock()
|
||||||
defer s.mu.RUnlock()
|
defer s.mu.RUnlock()
|
||||||
|
@ -197,73 +219,33 @@ func (s *appSettings) IndexPageTemplate() string {
|
||||||
return s.indexPageTemplate
|
return s.indexPageTemplate
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *appSettings) setZipCompression(val bool) {
|
|
||||||
s.mu.Lock()
|
|
||||||
s.zipCompression = val
|
|
||||||
s.mu.Unlock()
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *appSettings) setReturnIndexPage(val bool) {
|
|
||||||
s.mu.Lock()
|
|
||||||
s.returnIndexPage = val
|
|
||||||
s.mu.Unlock()
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *appSettings) setIndexTemplate(val string) {
|
|
||||||
s.mu.Lock()
|
|
||||||
s.indexPageTemplate = val
|
|
||||||
s.mu.Unlock()
|
|
||||||
}
|
|
||||||
|
|
||||||
func (a *app) loadIndexPageTemplate() {
|
|
||||||
if !a.settings.IndexPageEnabled() {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
reader, err := os.Open(a.cfg.GetString(cfgIndexPageTemplatePath))
|
|
||||||
if err != nil {
|
|
||||||
a.settings.setIndexTemplate("")
|
|
||||||
a.log.Warn(logs.FailedToReadIndexPageTemplate, zap.Error(err))
|
|
||||||
return
|
|
||||||
}
|
|
||||||
tmpl, err := io.ReadAll(reader)
|
|
||||||
if err != nil {
|
|
||||||
a.settings.setIndexTemplate("")
|
|
||||||
a.log.Warn(logs.FailedToReadIndexPageTemplate, zap.Error(err))
|
|
||||||
return
|
|
||||||
}
|
|
||||||
a.settings.setIndexTemplate(string(tmpl))
|
|
||||||
a.log.Info(logs.SetCustomIndexPageTemplate)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *appSettings) ClientCut() bool {
|
func (s *appSettings) ClientCut() bool {
|
||||||
s.mu.RLock()
|
s.mu.RLock()
|
||||||
defer s.mu.RUnlock()
|
defer s.mu.RUnlock()
|
||||||
return s.clientCut
|
return s.clientCut
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *appSettings) setClientCut(val bool) {
|
|
||||||
s.mu.Lock()
|
|
||||||
s.clientCut = val
|
|
||||||
s.mu.Unlock()
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *appSettings) BufferMaxSizeForPut() uint64 {
|
func (s *appSettings) BufferMaxSizeForPut() uint64 {
|
||||||
s.mu.RLock()
|
s.mu.RLock()
|
||||||
defer s.mu.RUnlock()
|
defer s.mu.RUnlock()
|
||||||
return s.bufferMaxSizeForPut
|
return s.bufferMaxSizeForPut
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *appSettings) setBufferMaxSizeForPut(val uint64) {
|
func (s *appSettings) NamespaceHeader() string {
|
||||||
s.mu.Lock()
|
s.mu.RLock()
|
||||||
s.bufferMaxSizeForPut = val
|
defer s.mu.RUnlock()
|
||||||
s.mu.Unlock()
|
return s.namespaceHeader
|
||||||
}
|
}
|
||||||
|
|
||||||
func (a *app) initAppSettings() {
|
func (s *appSettings) FormContainerZone(ns string) (zone string, isDefault bool) {
|
||||||
a.settings = &appSettings{
|
s.mu.RLock()
|
||||||
reconnectInterval: fetchReconnectInterval(a.cfg),
|
namespaces := s.defaultNamespaces
|
||||||
|
s.mu.RUnlock()
|
||||||
|
if slices.Contains(namespaces, ns) {
|
||||||
|
return v2container.SysAttributeZoneDefault, true
|
||||||
}
|
}
|
||||||
a.updateSettings()
|
|
||||||
|
return ns + ".ns", false
|
||||||
}
|
}
|
||||||
|
|
||||||
func (a *app) initResolver() {
|
func (a *app) initResolver() {
|
||||||
|
@ -539,26 +521,15 @@ func (a *app) configReload(ctx context.Context) {
|
||||||
a.stopServices()
|
a.stopServices()
|
||||||
a.startServices()
|
a.startServices()
|
||||||
|
|
||||||
a.updateSettings()
|
a.settings.update(a.cfg, a.log)
|
||||||
|
|
||||||
a.metrics.SetEnabled(a.cfg.GetBool(cfgPrometheusEnabled))
|
a.metrics.SetEnabled(a.cfg.GetBool(cfgPrometheusEnabled))
|
||||||
a.initTracing(ctx)
|
a.initTracing(ctx)
|
||||||
a.loadIndexPageTemplate()
|
|
||||||
a.setHealthStatus()
|
a.setHealthStatus()
|
||||||
|
|
||||||
a.log.Info(logs.SIGHUPConfigReloadCompleted)
|
a.log.Info(logs.SIGHUPConfigReloadCompleted)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (a *app) updateSettings() {
|
|
||||||
a.settings.setDefaultTimestamp(a.cfg.GetBool(cfgUploaderHeaderEnableDefaultTimestamp))
|
|
||||||
a.settings.setZipCompression(a.cfg.GetBool(cfgZipCompression))
|
|
||||||
a.settings.setReturnIndexPage(a.cfg.GetBool(cfgIndexPageEnabled))
|
|
||||||
a.settings.setClientCut(a.cfg.GetBool(cfgClientCut))
|
|
||||||
a.settings.setBufferMaxSizeForPut(a.cfg.GetUint64(cfgBufferMaxSizeForPut))
|
|
||||||
a.settings.setNamespaceHeader(a.cfg.GetString(cfgResolveNamespaceHeader))
|
|
||||||
a.settings.setDefaultNamespaces(a.cfg.GetStringSlice(cfgResolveDefaultNamespaces))
|
|
||||||
}
|
|
||||||
|
|
||||||
func (a *app) startServices() {
|
func (a *app) startServices() {
|
||||||
pprofConfig := metrics.Config{Enabled: a.cfg.GetBool(cfgPprofEnabled), Address: a.cfg.GetString(cfgPprofAddress)}
|
pprofConfig := metrics.Config{Enabled: a.cfg.GetBool(cfgPprofEnabled), Address: a.cfg.GetString(cfgPprofAddress)}
|
||||||
pprofService := metrics.NewPprofService(a.log, pprofConfig)
|
pprofService := metrics.NewPprofService(a.log, pprofConfig)
|
||||||
|
@ -847,39 +818,6 @@ func (a *app) setRuntimeParameters() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *appSettings) NamespaceHeader() string {
|
|
||||||
s.mu.RLock()
|
|
||||||
defer s.mu.RUnlock()
|
|
||||||
return s.namespaceHeader
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *appSettings) setNamespaceHeader(nsHeader string) {
|
|
||||||
s.mu.Lock()
|
|
||||||
s.namespaceHeader = nsHeader
|
|
||||||
s.mu.Unlock()
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *appSettings) FormContainerZone(ns string) (zone string, isDefault bool) {
|
|
||||||
s.mu.RLock()
|
|
||||||
namespaces := s.defaultNamespaces
|
|
||||||
s.mu.RUnlock()
|
|
||||||
if slices.Contains(namespaces, ns) {
|
|
||||||
return v2container.SysAttributeZoneDefault, true
|
|
||||||
}
|
|
||||||
|
|
||||||
return ns + ".ns", false
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *appSettings) setDefaultNamespaces(namespaces []string) {
|
|
||||||
for i := range namespaces { // to be set namespaces in env variable as `HTTP_GW_RESOLVE_BUCKET_DEFAULT_NAMESPACES="" "root"`
|
|
||||||
namespaces[i] = strings.Trim(namespaces[i], "\"")
|
|
||||||
}
|
|
||||||
|
|
||||||
s.mu.Lock()
|
|
||||||
s.defaultNamespaces = namespaces
|
|
||||||
s.mu.Unlock()
|
|
||||||
}
|
|
||||||
|
|
||||||
func (a *app) scheduleReconnect(ctx context.Context, srv *fasthttp.Server) {
|
func (a *app) scheduleReconnect(ctx context.Context, srv *fasthttp.Server) {
|
||||||
go func() {
|
go func() {
|
||||||
t := time.NewTicker(a.settings.reconnectInterval)
|
t := time.NewTicker(a.settings.reconnectInterval)
|
||||||
|
|
|
@ -4,6 +4,7 @@ import (
|
||||||
"context"
|
"context"
|
||||||
"encoding/hex"
|
"encoding/hex"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"io"
|
||||||
"math"
|
"math"
|
||||||
"os"
|
"os"
|
||||||
"path"
|
"path"
|
||||||
|
@ -505,6 +506,37 @@ func fetchReconnectInterval(cfg *viper.Viper) time.Duration {
|
||||||
return reconnect
|
return reconnect
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func fetchIndexPageTemplate(v *viper.Viper, l *zap.Logger) (string, bool) {
|
||||||
|
if !v.GetBool(cfgIndexPageEnabled) {
|
||||||
|
return "", false
|
||||||
|
}
|
||||||
|
|
||||||
|
reader, err := os.Open(v.GetString(cfgIndexPageTemplatePath))
|
||||||
|
if err != nil {
|
||||||
|
l.Warn(logs.FailedToReadIndexPageTemplate, zap.Error(err))
|
||||||
|
return "", true
|
||||||
|
}
|
||||||
|
|
||||||
|
tmpl, err := io.ReadAll(reader)
|
||||||
|
if err != nil {
|
||||||
|
l.Warn(logs.FailedToReadIndexPageTemplate, zap.Error(err))
|
||||||
|
return "", true
|
||||||
|
}
|
||||||
|
|
||||||
|
l.Info(logs.SetCustomIndexPageTemplate)
|
||||||
|
return string(tmpl), true
|
||||||
|
}
|
||||||
|
|
||||||
|
func fetchDefaultNamespaces(v *viper.Viper) []string {
|
||||||
|
namespaces := v.GetStringSlice(cfgResolveDefaultNamespaces)
|
||||||
|
|
||||||
|
for i := range namespaces { // to be set namespaces in env variable as `HTTP_GW_RESOLVE_BUCKET_DEFAULT_NAMESPACES="" "root"`
|
||||||
|
namespaces[i] = strings.Trim(namespaces[i], "\"")
|
||||||
|
}
|
||||||
|
|
||||||
|
return namespaces
|
||||||
|
}
|
||||||
|
|
||||||
func fetchServers(v *viper.Viper, log *zap.Logger) []ServerInfo {
|
func fetchServers(v *viper.Viper, log *zap.Logger) []ServerInfo {
|
||||||
var servers []ServerInfo
|
var servers []ServerInfo
|
||||||
seen := make(map[string]struct{})
|
seen := make(map[string]struct{})
|
||||||
|
|
Loading…
Reference in a new issue