Adding a node does not require restart; move logic to config package

This commit is contained in:
Jakob Borg 2014-09-20 18:42:09 +02:00
parent 5144330807
commit e13976a3b3
2 changed files with 35 additions and 32 deletions

View File

@ -332,34 +332,7 @@ func restPostConfig(m *model.Model, w http.ResponseWriter, r *http.Request) {
} }
} }
// Figure out if any changes require a restart // Start or stop usage reporting as appropriate
if len(cfg.Repositories) != len(newCfg.Repositories) {
configInSync = false
} else {
om := cfg.RepoMap()
nm := newCfg.RepoMap()
for id := range om {
if !reflect.DeepEqual(om[id], nm[id]) {
configInSync = false
break
}
}
}
if len(cfg.Nodes) != len(newCfg.Nodes) {
configInSync = false
} else {
om := cfg.NodeMap()
nm := newCfg.NodeMap()
for k := range om {
if _, ok := nm[k]; !ok {
// A node was removed and another added
configInSync = false
break
}
}
}
if newCfg.Options.URAccepted > cfg.Options.URAccepted { if newCfg.Options.URAccepted > cfg.Options.URAccepted {
// UR was enabled // UR was enabled
@ -375,12 +348,9 @@ func restPostConfig(m *model.Model, w http.ResponseWriter, r *http.Request) {
stopUsageReporting() stopUsageReporting()
} }
if !reflect.DeepEqual(cfg.Options, newCfg.Options) || !reflect.DeepEqual(cfg.GUI, newCfg.GUI) {
configInSync = false
}
// Activate and save // Activate and save
configInSync = !config.ChangeRequiresRestart(cfg, newCfg)
newCfg.Location = cfg.Location newCfg.Location = cfg.Location
newCfg.Save() newCfg.Save()
cfg = newCfg cfg = newCfg

View File

@ -423,6 +423,39 @@ func Load(location string, myID protocol.NodeID) (Configuration, error) {
return cfg, err return cfg, err
} }
// ChangeRequiresRestart returns true if updating the configuration requires a
// complete restart.
func ChangeRequiresRestart(from, to Configuration) bool {
// Adding, removing or changing repos requires restart
if len(from.Repositories) != len(to.Repositories) {
return true
}
fromRepos := from.RepoMap()
toRepos := to.RepoMap()
for id := range fromRepos {
if !reflect.DeepEqual(fromRepos[id], toRepos[id]) {
return true
}
}
// Removing a node requires a restart. Adding one does not. Changing
// address or name does not.
fromNodes := from.NodeMap()
toNodes := to.NodeMap()
for nodeID := range fromNodes {
if _, ok := toNodes[nodeID]; !ok {
return true
}
}
// All of the generic options require restart
if !reflect.DeepEqual(from.Options, to.Options) || !reflect.DeepEqual(from.GUI, to.GUI) {
return true
}
return false
}
func convertV3V4(cfg *Configuration) { func convertV3V4(cfg *Configuration) {
// In previous versions, rescan interval was common for each repository. // In previous versions, rescan interval was common for each repository.
// From now, it can be set independently. We have to make sure, that after upgrade // From now, it can be set independently. We have to make sure, that after upgrade