Merge pull request #5615 from swordqiu/hotfix/qj-service-config-change-detection

fix: refine service-config change detection
This commit is contained in:
Zexi Li
2020-03-30 20:02:26 +08:00
committed by GitHub
7 changed files with 71 additions and 8 deletions

2
go.mod
View File

@@ -128,7 +128,7 @@ require (
k8s.io/cluster-bootstrap v0.17.3
k8s.io/kubernetes v1.16.0
yunion.io/x/executor v0.0.0-20200227030256-a18417815e74
yunion.io/x/jsonutils v0.0.0-20200324102731-ecaf3132aad8
yunion.io/x/jsonutils v0.0.0-20200330063846-589d9924bb8b
yunion.io/x/log v0.0.0-20200313080802-57a4ce5966b3
yunion.io/x/pkg v0.0.0-20200312093207-f07f4cb157e0
yunion.io/x/s3cli v0.0.0-20190917004522-13ac36d8687e

4
go.sum
View File

@@ -1106,8 +1106,8 @@ vbom.ml/util v0.0.0-20160121211510-db5cfe13f5cc/go.mod h1:so/NYdZXCz+E3ZpW0uAoCj
yunion.io/x/executor v0.0.0-20200227030256-a18417815e74 h1:A15C6VdVRWvmQ9pAJHrUs9yan5qKlYH7uaRxHg1kRbk=
yunion.io/x/executor v0.0.0-20200227030256-a18417815e74/go.mod h1:Uxuou9WQIeJXNpy7t2fPLL0BYLvLiMvGQwY7Qc6aSws=
yunion.io/x/jsonutils v0.0.0-20190625054549-a964e1e8a051/go.mod h1:4N0/RVzsYL3kH3WE/H1BjUQdFiWu50JGCFQuuy+Z634=
yunion.io/x/jsonutils v0.0.0-20200324102731-ecaf3132aad8 h1:BzxFrksUauP57RDc8TW4ajkO374sqdtSVKyMKXsP8zI=
yunion.io/x/jsonutils v0.0.0-20200324102731-ecaf3132aad8/go.mod h1:T7kxQJR13+t7z0TuT+Wzd7MTxBOk2H9c0pO1ONQSv90=
yunion.io/x/jsonutils v0.0.0-20200330063846-589d9924bb8b h1:mt0TOKRk76yeH0whJfmKsceXBuudXLjvoj8NKGTqpEU=
yunion.io/x/jsonutils v0.0.0-20200330063846-589d9924bb8b/go.mod h1:T7kxQJR13+t7z0TuT+Wzd7MTxBOk2H9c0pO1ONQSv90=
yunion.io/x/log v0.0.0-20190514041436-04ce53b17c6b/go.mod h1:+gauLs73omeJAPlsXcevLsJLKixV+sR/E7WSYTSx1fE=
yunion.io/x/log v0.0.0-20190629062853-9f6483a7103d h1:59zrDL7Ft+hDukguJRmLr/Gdu/9V75x+yX99ovZwfaA=
yunion.io/x/log v0.0.0-20190629062853-9f6483a7103d/go.mod h1:LC6f/4FozL0iaAbnFt2eDX9jlsyo3WiOUPm03d7+U4U=

View File

@@ -79,13 +79,33 @@ func copyOptions(dst, src interface{}) {
dstValue.Set(reflect.ValueOf(src).Elem())
}
func optionsEquals(newOpts interface{}, oldOpts interface{}) bool {
newOptsDict := jsonutils.Marshal(newOpts).(*jsonutils.JSONDict)
oldOptsDict := jsonutils.Marshal(oldOpts).(*jsonutils.JSONDict)
deleted, diff, _, added := jsonutils.Diff(oldOptsDict, newOptsDict)
if deleted.Length() > 0 {
log.Infof("Options removed: %s", deleted)
return false
}
if diff.Length() > 0 {
log.Infof("Options changed: %s", diff)
return false
}
if added.Length() > 0 {
log.Infof("Options added: %s", added)
return false
}
return true
}
func (manager *SOptionManager) doSync(first bool) {
newOpts := manager.newOptions()
copyOptions(newOpts, manager.options)
merged := manager.session.Merge(newOpts, manager.serviceType, manager.serviceVersion)
if merged && !reflect.DeepEqual(newOpts, manager.options) {
log.Infof("Service config changed ... %s %s", jsonutils.Marshal(newOpts), jsonutils.Marshal(manager.options))
if merged && !optionsEquals(newOpts, manager.options) {
if manager.onOptionsChange != nil && manager.onOptionsChange(manager.options, newOpts) && !first {
log.Infof("Option changes detected and going to restart the program...")
appsrv.SetExitFlag()

View File

@@ -86,7 +86,7 @@ type BaseOptions struct {
TimeZone string `help:"time zone" default:"Asia/Shanghai"`
DomainizedNamespace bool `help:"turn on global name space, default is on" default:"false" json:"global_namespace,allowfalse"`
DomainizedNamespace bool `help:"turn on global name space, default is on" default:"false" json:"domainized_namespace,allowfalse"`
ApiServer string `help:"URL to access frontend webconsole" default:"http://webconsole.yunion.io"`

View File

@@ -15,7 +15,7 @@
package pending_delete
type SPendingDeleteOptions struct {
EnablePendingDelete bool `default:"true" help:"Turn on/off pending-delete resource, default is on" alias:"delayed_delete"`
EnablePendingDelete bool `default:"true" help:"Turn on/off pending-delete resource, default is on" json:"enable_pending_delete"`
PendingDeleteCheckSeconds int `default:"3600" help:"How long to wait to scan pending-delete resource, default is 1 hour"`
PendingDeleteExpireSeconds int `default:"259200" help:"How long a pending-delete resource cleaned automatically, default 3 days" alias:"scrub_time"`
PendingDeleteMaxCleanBatchSize int `default:"50" help:"How many pending-delete items can be clean in a batch"`

2
vendor/modules.txt vendored
View File

@@ -1014,7 +1014,7 @@ sigs.k8s.io/yaml
yunion.io/x/executor/apis
yunion.io/x/executor/client
yunion.io/x/executor/server
# yunion.io/x/jsonutils v0.0.0-20200324102731-ecaf3132aad8
# yunion.io/x/jsonutils v0.0.0-20200330063846-589d9924bb8b
yunion.io/x/jsonutils
# yunion.io/x/log v0.0.0-20200313080802-57a4ce5966b3
yunion.io/x/log

43
vendor/yunion.io/x/jsonutils/dict.go generated vendored
View File

@@ -35,3 +35,46 @@ func (dict *JSONDict) UpdateDefault(json JSONObject) {
}
}
}
func Diff(a, b *JSONDict) (aNoB, aDiffB, aAndB, bNoA *JSONDict) {
keysA := a.SortedKeys()
keysB := b.SortedKeys()
aNoB = NewDict()
aDiffB = NewDict()
aAndB = NewDict()
bNoA = NewDict()
i := 0
j := 0
for i < len(keysA) || j < len(keysB) {
if i < len(keysA) && j < len(keysB) {
keyA := keysA[i]
keyB := keysB[j]
if keyA > keyB {
aNoB.data[keyA] = a.data[keyA]
i += 1
} else if keyA < keyB {
bNoA.data[keyB] = b.data[keyB]
j += 1
} else {
valA := a.data[keysA[i]].String()
valB := b.data[keysB[i]].String()
if valA != valB {
aDiffB.data[keyA] = NewArray(a.data[keyA], b.data[keyB])
} else {
aAndB.data[keyA] = a.data[keyA]
}
i += 1
j += 1
}
} else if i < len(keysA) {
aNoB.data[keysA[i]] = a.data[keysA[i]]
i = i + 1
} else if j < len(keysB) {
bNoA.data[keysB[j]] = b.data[keysB[j]]
j = j + 1
}
}
return
}