diff --git a/internal/server/config.go b/internal/server/config.go index b7355900..31aca1d0 100644 --- a/internal/server/config.go +++ b/internal/server/config.go @@ -21,22 +21,23 @@ const ( // Config keys const ( - FollowHost = "follow_host" - FollowPort = "follow_port" - FollowID = "follow_id" - FollowPos = "follow_pos" - ServerID = "server_id" - ReadOnly = "read_only" - RequirePass = "requirepass" - LeaderAuth = "leaderauth" - ProtectedMode = "protected-mode" - MaxMemory = "maxmemory" - AutoGC = "autogc" - KeepAlive = "keepalive" - LogConfig = "logconfig" + FollowHost = "follow_host" + FollowPort = "follow_port" + FollowID = "follow_id" + FollowPos = "follow_pos" + ReplicaPriority = "replica-priority" + ServerID = "server_id" + ReadOnly = "read_only" + RequirePass = "requirepass" + LeaderAuth = "leaderauth" + ProtectedMode = "protected-mode" + MaxMemory = "maxmemory" + AutoGC = "autogc" + KeepAlive = "keepalive" + LogConfig = "logconfig" ) -var validProperties = []string{RequirePass, LeaderAuth, ProtectedMode, MaxMemory, AutoGC, KeepAlive, LogConfig} +var validProperties = []string{RequirePass, LeaderAuth, ProtectedMode, MaxMemory, AutoGC, KeepAlive, LogConfig, ReplicaPriority} // Config is a tile38 config type Config struct { @@ -44,12 +45,13 @@ type Config struct { mu sync.RWMutex - _followHost string - _followPort int64 - _followID string - _followPos int64 - _serverID string - _readOnly bool + _followHost string + _followPort int64 + _followID string + _followPos int64 + _replicaPriority int64 + _serverID string + _readOnly bool _requirePassP string _requirePass string @@ -99,6 +101,15 @@ func loadConfig(path string) (*Config, error) { config._serverID = randomKey(16) } + // Need to be sure we look for existence vs not zero because zero is an intentional setting + // anything less than zero will be considered default and will result in no slave_priority + // being output when INFO is called. + if gjson.Get(json, ReplicaPriority).Exists() { + config._replicaPriority = gjson.Get(json, ReplicaPriority).Int() + } else { + config._replicaPriority = -1 + } + // load properties if err := config.setProperty(RequirePass, config._requirePassP, true); err != nil { return nil, err @@ -167,6 +178,9 @@ func (config *Config) write(writeProperties bool) { if config._followPos != 0 { m[FollowPos] = config._followPos } + if config._replicaPriority >= 0 { + m[ReplicaPriority] = config._replicaPriority + } if config._serverID != "" { m[ServerID] = config._serverID } @@ -312,6 +326,13 @@ func (config *Config) setProperty(name, value string, fromLoad bool) error { } else { config._logConfig = value } + case ReplicaPriority: + replicaPriority, err := strconv.ParseUint(value, 10, 64) + if err != nil || replicaPriority < 0 { + invalid = true + } else { + config._replicaPriority = int64(replicaPriority) + } } if invalid { @@ -351,6 +372,12 @@ func (config *Config) getProperty(name string) string { return strconv.FormatUint(uint64(config._keepAlive), 10) case LogConfig: return config._logConfig + case ReplicaPriority: + if config._replicaPriority < 0 { + return "" + } else { + return strconv.FormatUint(uint64(config._replicaPriority), 10) + } } } @@ -426,6 +453,12 @@ func (config *Config) followPort() int { config.mu.RUnlock() return int(v) } +func (config *Config) replicaPriority() int { + config.mu.RLock() + v := config._replicaPriority + config.mu.RUnlock() + return int(v) +} func (config *Config) serverID() string { config.mu.RLock() v := config._serverID diff --git a/internal/server/stats.go b/internal/server/stats.go index 503beafe..b89c274e 100644 --- a/internal/server/stats.go +++ b/internal/server/stats.go @@ -408,6 +408,9 @@ func (s *Server) writeInfoReplication(w *bytes.Buffer) { fmt.Fprintf(w, "role:slave\r\n") fmt.Fprintf(w, "master_host:%s\r\n", s.config.followHost()) fmt.Fprintf(w, "master_port:%v\r\n", s.config.followPort()) + if s.config.replicaPriority() >= 0 { + fmt.Fprintf(w, "slave_priority:%v\r\n", s.config.replicaPriority()) + } } else { fmt.Fprintf(w, "role:master\r\n") var i int