Add support for reloading raft config (#29485)

This commit is contained in:
Nick Cabatoff
2025-02-05 10:08:46 -05:00
committed by GitHub
parent 0c3449dacd
commit 38c3e15e1e
8 changed files with 61 additions and 15 deletions

View File

@@ -34,7 +34,7 @@ func TestRaft_Chunking_Lifecycle(t *testing.T) {
t.Log("applying configuration")
b.applyConfigSettings(raft.DefaultConfig())
ApplyConfigSettings(b.logger, b.conf, raft.DefaultConfig())
t.Log("chunking")
@@ -119,7 +119,7 @@ func TestFSM_Chunking_TermChange(t *testing.T) {
t.Log("applying configuration")
b.applyConfigSettings(raft.DefaultConfig())
ApplyConfigSettings(b.logger, b.conf, raft.DefaultConfig())
t.Log("chunking")

View File

@@ -1069,9 +1069,9 @@ func (b *RaftBackend) SetRemovedCallback(cb func()) {
b.removedCallback = cb
}
func (b *RaftBackend) applyConfigSettings(config *raft.Config) error {
config.Logger = b.logger
multiplierRaw, ok := b.conf["performance_multiplier"]
func ApplyConfigSettings(logger log.Logger, parsedConf map[string]string, config *raft.Config) error {
config.Logger = logger
multiplierRaw, ok := parsedConf["performance_multiplier"]
multiplier := 5
if ok {
var err error
@@ -1084,7 +1084,7 @@ func (b *RaftBackend) applyConfigSettings(config *raft.Config) error {
config.HeartbeatTimeout *= time.Duration(multiplier)
config.LeaderLeaseTimeout *= time.Duration(multiplier)
snapThresholdRaw, ok := b.conf["snapshot_threshold"]
snapThresholdRaw, ok := parsedConf["snapshot_threshold"]
if ok {
var err error
snapThreshold, err := strconv.Atoi(snapThresholdRaw)
@@ -1094,7 +1094,7 @@ func (b *RaftBackend) applyConfigSettings(config *raft.Config) error {
config.SnapshotThreshold = uint64(snapThreshold)
}
trailingLogsRaw, ok := b.conf["trailing_logs"]
trailingLogsRaw, ok := parsedConf["trailing_logs"]
if ok {
var err error
trailingLogs, err := strconv.Atoi(trailingLogsRaw)
@@ -1103,7 +1103,7 @@ func (b *RaftBackend) applyConfigSettings(config *raft.Config) error {
}
config.TrailingLogs = uint64(trailingLogs)
}
snapshotIntervalRaw, ok := b.conf["snapshot_interval"]
snapshotIntervalRaw, ok := parsedConf["snapshot_interval"]
if ok {
var err error
snapshotInterval, err := parseutil.ParseDurationSecond(snapshotIntervalRaw)
@@ -1121,7 +1121,7 @@ func (b *RaftBackend) applyConfigSettings(config *raft.Config) error {
// scheduler.
config.BatchApplyCh = true
b.logger.Trace("applying raft config", "inputs", b.conf)
logger.Trace("applying raft config", "inputs", parsedConf)
return nil
}
@@ -1200,7 +1200,7 @@ func (b *RaftBackend) SetupCluster(ctx context.Context, opts SetupOpts) error {
// Setup the raft config
raftConfig := raft.DefaultConfig()
if err := b.applyConfigSettings(raftConfig); err != nil {
if err := ApplyConfigSettings(b.logger, b.conf, raftConfig); err != nil {
return err
}
@@ -2322,3 +2322,17 @@ func isRaftLogVerifyCheckpoint(l *raft.Log) bool {
// Must be the last chunk of a chunked object that has chunking meta
return false
}
func (b *RaftBackend) ReloadConfig(config raft.ReloadableConfig) error {
b.l.RLock()
defer b.l.RUnlock()
if b.raft != nil {
if err := b.raft.ReloadConfig(config); err != nil {
return err
} else {
b.logger.Info("reloaded raft config", "settings", config)
}
}
return nil
}

View File

@@ -894,7 +894,7 @@ func TestRaft_Backend_Performance(t *testing.T) {
defaultConfig := raft.DefaultConfig()
localConfig := raft.DefaultConfig()
err := b.applyConfigSettings(localConfig)
err := ApplyConfigSettings(b.logger, b.conf, localConfig)
if err != nil {
t.Fatal(err)
}
@@ -915,7 +915,7 @@ func TestRaft_Backend_Performance(t *testing.T) {
}
localConfig = raft.DefaultConfig()
err = b.applyConfigSettings(localConfig)
err = ApplyConfigSettings(b.logger, b.conf, localConfig)
if err != nil {
t.Fatal(err)
}
@@ -936,7 +936,7 @@ func TestRaft_Backend_Performance(t *testing.T) {
}
localConfig = raft.DefaultConfig()
err = b.applyConfigSettings(localConfig)
err = ApplyConfigSettings(b.logger, b.conf, localConfig)
if err != nil {
t.Fatal(err)
}