From 3b5d34ccd81a100c8ee195760d7904950322b707 Mon Sep 17 00:00:00 2001 From: Qiu Jian Date: Mon, 30 Mar 2020 09:17:58 +0800 Subject: [PATCH] fix: refine service-config change detection --- go.mod | 2 +- go.sum | 4 +-- pkg/cloudcommon/options/manager.go | 24 +++++++++++-- pkg/cloudcommon/options/options.go | 2 +- pkg/cloudcommon/pending_delete/options.go | 2 +- vendor/modules.txt | 2 +- vendor/yunion.io/x/jsonutils/dict.go | 43 +++++++++++++++++++++++ 7 files changed, 71 insertions(+), 8 deletions(-) diff --git a/go.mod b/go.mod index 48fd053965..e2e9702928 100644 --- a/go.mod +++ b/go.mod @@ -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 diff --git a/go.sum b/go.sum index 5c2b948f4c..8af2845677 100644 --- a/go.sum +++ b/go.sum @@ -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= diff --git a/pkg/cloudcommon/options/manager.go b/pkg/cloudcommon/options/manager.go index 3df3353da7..d89a3b8566 100644 --- a/pkg/cloudcommon/options/manager.go +++ b/pkg/cloudcommon/options/manager.go @@ -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() diff --git a/pkg/cloudcommon/options/options.go b/pkg/cloudcommon/options/options.go index 7919876049..dee20a6022 100644 --- a/pkg/cloudcommon/options/options.go +++ b/pkg/cloudcommon/options/options.go @@ -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"` structarg.BaseOptions } diff --git a/pkg/cloudcommon/pending_delete/options.go b/pkg/cloudcommon/pending_delete/options.go index 14db6811f8..550178304a 100644 --- a/pkg/cloudcommon/pending_delete/options.go +++ b/pkg/cloudcommon/pending_delete/options.go @@ -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"` diff --git a/vendor/modules.txt b/vendor/modules.txt index 9b2c76efe9..f849294796 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -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 diff --git a/vendor/yunion.io/x/jsonutils/dict.go b/vendor/yunion.io/x/jsonutils/dict.go index 87db0ca23b..9f15f3c8c3 100644 --- a/vendor/yunion.io/x/jsonutils/dict.go +++ b/vendor/yunion.io/x/jsonutils/dict.go @@ -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 +}