From 85092cce9b7caa162efa6ba38e119204da8c5153 Mon Sep 17 00:00:00 2001 From: qshuai Date: Sun, 8 Oct 2023 20:59:41 +0800 Subject: [PATCH 1/2] fix: compile regex pattern redundantly when parsing kafka version(#2662) Signed-off-by: qshuai --- utils.go | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/utils.go b/utils.go index 748d66412..f10a5980a 100644 --- a/utils.go +++ b/utils.go @@ -280,6 +280,11 @@ var ( } ) +var ( + validKafkaVersion1 = regexp.MustCompile(`^0\.\d+\.\d+\.\d+$`) + validKafkaVersion2 = regexp.MustCompile(`^\d+\.\d+\.\d+$`) +) + // ParseKafkaVersion parses and returns kafka version or error from a string func ParseKafkaVersion(s string) (KafkaVersion, error) { if len(s) < 5 { @@ -288,9 +293,9 @@ func ParseKafkaVersion(s string) (KafkaVersion, error) { var major, minor, veryMinor, patch uint var err error if s[0] == '0' { - err = scanKafkaVersion(s, `^0\.\d+\.\d+\.\d+$`, "0.%d.%d.%d", [3]*uint{&minor, &veryMinor, &patch}) + err = scanKafkaVersion(s, validKafkaVersion1, "0.%d.%d.%d", [3]*uint{&minor, &veryMinor, &patch}) } else { - err = scanKafkaVersion(s, `^\d+\.\d+\.\d+$`, "%d.%d.%d", [3]*uint{&major, &minor, &veryMinor}) + err = scanKafkaVersion(s, validKafkaVersion2, "%d.%d.%d", [3]*uint{&major, &minor, &veryMinor}) } if err != nil { return DefaultVersion, err @@ -298,8 +303,8 @@ func ParseKafkaVersion(s string) (KafkaVersion, error) { return newKafkaVersion(major, minor, veryMinor, patch), nil } -func scanKafkaVersion(s string, pattern string, format string, v [3]*uint) error { - if !regexp.MustCompile(pattern).MatchString(s) { +func scanKafkaVersion(s string, pattern *regexp.Regexp, format string, v [3]*uint) error { + if !pattern.MatchString(s) { return fmt.Errorf("invalid version `%s`", s) } _, err := fmt.Sscanf(s, format, v[0], v[1], v[2]) From 0b261dc70610a46dcda26cac9c11e42b6fae015c Mon Sep 17 00:00:00 2001 From: qshuai Date: Wed, 11 Oct 2023 13:21:22 +0800 Subject: [PATCH 2/2] chore: using clear variable name & add comments Signed-off-by: qshuai --- utils.go | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/utils.go b/utils.go index f10a5980a..fe5f0a52f 100644 --- a/utils.go +++ b/utils.go @@ -281,8 +281,11 @@ var ( ) var ( - validKafkaVersion1 = regexp.MustCompile(`^0\.\d+\.\d+\.\d+$`) - validKafkaVersion2 = regexp.MustCompile(`^\d+\.\d+\.\d+$`) + // This regex validates that a string complies with the pre kafka 1.0.0 format for version strings, for example 0.11.0.3 + validPreKafka1Version = regexp.MustCompile(`^0\.\d+\.\d+\.\d+$`) + + // This regex validates that a string complies with the post Kafka 1.0.0 format, for example 1.0.0 + validPostKafka1Version = regexp.MustCompile(`^\d+\.\d+\.\d+$`) ) // ParseKafkaVersion parses and returns kafka version or error from a string @@ -293,9 +296,9 @@ func ParseKafkaVersion(s string) (KafkaVersion, error) { var major, minor, veryMinor, patch uint var err error if s[0] == '0' { - err = scanKafkaVersion(s, validKafkaVersion1, "0.%d.%d.%d", [3]*uint{&minor, &veryMinor, &patch}) + err = scanKafkaVersion(s, validPreKafka1Version, "0.%d.%d.%d", [3]*uint{&minor, &veryMinor, &patch}) } else { - err = scanKafkaVersion(s, validKafkaVersion2, "%d.%d.%d", [3]*uint{&major, &minor, &veryMinor}) + err = scanKafkaVersion(s, validPostKafka1Version, "%d.%d.%d", [3]*uint{&major, &minor, &veryMinor}) } if err != nil { return DefaultVersion, err