From b0a30b9a2f9f95fe830b97c78ae6d95d858912ed Mon Sep 17 00:00:00 2001 From: Chlins Zhang Date: Tue, 13 Dec 2022 18:22:41 +0800 Subject: [PATCH] fix: fix the time duration type duplicated parse for config (#17981) Fix the time duration type duplicated parse for config, maintaining the idempotency of set and get operations. Signed-off-by: chlins Signed-off-by: chlins --- src/lib/config/metadata/type.go | 3 ++- src/lib/config/metadata/type_test.go | 11 +++++++++++ src/lib/config/metadata/value.go | 12 ++++++++++-- 3 files changed, 23 insertions(+), 3 deletions(-) diff --git a/src/lib/config/metadata/type.go b/src/lib/config/metadata/type.go index 264d60fb6..48ca46347 100644 --- a/src/lib/config/metadata/type.go +++ b/src/lib/config/metadata/type.go @@ -245,7 +245,8 @@ func (t *DurationType) validate(str string) error { } func (t *DurationType) get(str string) (interface{}, error) { - return time.ParseDuration(str) + // should not parse the duration to avoid duplicate parse. + return str, nil } // parseInt64 returns int64 from string which support scientific notation diff --git a/src/lib/config/metadata/type_test.go b/src/lib/config/metadata/type_test.go index e0d81f157..a96f7b845 100644 --- a/src/lib/config/metadata/type_test.go +++ b/src/lib/config/metadata/type_test.go @@ -110,6 +110,17 @@ func TestStringToStringMapType_get(t *testing.T) { assert.Equal(t, map[string]string{"sample": "abc", "another": "welcome"}, result) } +func TestDurationType(t *testing.T) { + test := &DurationType{} + // test get + result, err := test.get("5m") + assert.Nil(t, err) + assert.Equal(t, "5m", result) + // test validate + assert.Nil(t, test.validate("5m")) + assert.NotNil(t, test.validate("100")) +} + func Test_parseInt64(t *testing.T) { type args struct { str string diff --git a/src/lib/config/metadata/value.go b/src/lib/config/metadata/value.go index 6f3b17c12..82876d5ba 100644 --- a/src/lib/config/metadata/value.go +++ b/src/lib/config/metadata/value.go @@ -153,10 +153,18 @@ func (c *ConfigureValue) GetDuration() time.Duration { log.Errorf("GetDuration failed, error: %+v", err) return 0 } - if durationValue, suc := val.(time.Duration); suc { - return durationValue + + if durationStr, suc := val.(string); suc { + durationVal, err := time.ParseDuration(durationStr) + if err != nil { + log.Errorf("Parse %s to time duration failed, error: %v", durationStr, err) + return 0 + } + + return durationVal } } + log.Errorf("GetDuration failed, the current value's metadata is not defined, %+v", c) return 0 }