From 17dd299c0f8b16b328a15cae4f4d29574a538dd6 Mon Sep 17 00:00:00 2001 From: Gabriele Santomaggio Date: Mon, 29 Jul 2024 11:59:54 +0200 Subject: [PATCH 1/3] Check version when version is not and is less than 3.11 Signed-off-by: Gabriele Santomaggio --- pkg/stream/client.go | 7 ++++- pkg/stream/utils.go | 69 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 75 insertions(+), 1 deletion(-) diff --git a/pkg/stream/client.go b/pkg/stream/client.go index a5adc857..e7f3aee4 100644 --- a/pkg/stream/client.go +++ b/pkg/stream/client.go @@ -213,7 +213,12 @@ func (c *Client) connect() error { } logs.LogDebug("Server properties: %s", c.serverProperties) - if serverProperties["version"] == "" { + more, err := Is311OrMore(c.serverProperties["version"]) + if err != nil { + logs.LogWarn("Error checking server version: %s", err) + } + + if serverProperties["version"] == "" || !more { logs.LogInfo( "Server version is less than 3.11.0, skipping command version exchange") } else { diff --git a/pkg/stream/utils.go b/pkg/stream/utils.go index c62b8891..2b659e12 100644 --- a/pkg/stream/utils.go +++ b/pkg/stream/utils.go @@ -3,6 +3,8 @@ package stream import ( "fmt" "github.com/rabbitmq/rabbitmq-stream-go-client/pkg/logs" + "regexp" + "strconv" "strings" "time" ) @@ -57,3 +59,70 @@ func SetLevelInfo(value int8) { func containsOnlySpaces(input string) bool { return len(input) > 0 && len(strings.TrimSpace(input)) == 0 } + +//private static string ExtractVersion(string fullVersion) +//{ +//const string Pattern = @"(\d+\.\d+\.\d+)"; +//var match = Regex.Match(fullVersion, Pattern); +// +//return match.Success +//? match.Groups[1].Value +//: string.Empty; +//} + +func ExtractVersion(fullVersion string) string { + const pattern = `(\d+\.\d+\.\d+)` + re := regexp.MustCompile(pattern) + match := re.FindStringSubmatch(fullVersion) + if len(match) > 0 { + return match[1] + } + return "" +} + +func Is311OrMore(version string) (bool, error) { + v := ExtractVersion(version) + compare, err := CompareSemver(v, "3.11.0") + if err != nil { + return false, err + } + return compare >= 0, nil +} + +// CompareSemver compares two semantic version strings. +// Returns -1 if v1 < v2, 1 if v1 > v2, and 0 if they are equal. +func CompareSemver(v1, v2 string) (int, error) { + parseVersion := func(v string) ([]int, error) { + parts := strings.Split(v, ".") + if len(parts) != 3 { + return nil, fmt.Errorf("invalid semantic version: %s", v) + } + version := make([]int, 3) + for i, part := range parts { + num, err := strconv.Atoi(part) + if err != nil { + return nil, fmt.Errorf("invalid number in version: %s", part) + } + version[i] = num + } + return version, nil + } + + v1Parts, err := parseVersion(v1) + if err != nil { + return 0, err + } + v2Parts, err := parseVersion(v2) + if err != nil { + return 0, err + } + + for i := 0; i < 3; i++ { + if v1Parts[i] < v2Parts[i] { + return -1, nil + } else if v1Parts[i] > v2Parts[i] { + return 1, nil + } + } + return 0, nil +} From ed1606e8b620b01e9081a745d7ba5b7679f5e89b Mon Sep 17 00:00:00 2001 From: Gabriele Santomaggio Date: Mon, 29 Jul 2024 13:49:36 +0200 Subject: [PATCH 2/3] Check version when version is not and is less than 3.11 Signed-off-by: Gabriele Santomaggio --- pkg/stream/available_features.go | 2 +- pkg/stream/client.go | 5 +-- pkg/stream/utils.go | 69 -------------------------------- 3 files changed, 3 insertions(+), 73 deletions(-) diff --git a/pkg/stream/available_features.go b/pkg/stream/available_features.go index 2f9b787e..22f1a409 100644 --- a/pkg/stream/available_features.go +++ b/pkg/stream/available_features.go @@ -45,7 +45,7 @@ func (a *availableFeatures) BrokerFilterEnabled() bool { func (a *availableFeatures) IsBrokerSingleActiveConsumerEnabled() bool { lock.Lock() defer lock.Unlock() - return a.brokerSingleActiveConsumerEnabled == a.is311OrMore + return a.brokerSingleActiveConsumerEnabled } func (a *availableFeatures) SetVersion(version string) error { diff --git a/pkg/stream/client.go b/pkg/stream/client.go index e7f3aee4..54f2fbf5 100644 --- a/pkg/stream/client.go +++ b/pkg/stream/client.go @@ -212,13 +212,12 @@ func (c *Client) connect() error { return err2 } - logs.LogDebug("Server properties: %s", c.serverProperties) - more, err := Is311OrMore(c.serverProperties["version"]) + err = c.availableFeatures.SetVersion(serverProperties["version"]) if err != nil { logs.LogWarn("Error checking server version: %s", err) } - if serverProperties["version"] == "" || !more { + if serverProperties["version"] == "" || !c.availableFeatures.Is311OrMore() { logs.LogInfo( "Server version is less than 3.11.0, skipping command version exchange") } else { diff --git a/pkg/stream/utils.go b/pkg/stream/utils.go index 2b659e12..c62b8891 100644 --- a/pkg/stream/utils.go +++ b/pkg/stream/utils.go @@ -3,8 +3,6 @@ package stream import ( "fmt" "github.com/rabbitmq/rabbitmq-stream-go-client/pkg/logs" - "regexp" - "strconv" "strings" "time" ) @@ -59,70 +57,3 @@ func SetLevelInfo(value int8) { func containsOnlySpaces(input string) bool { return len(input) > 0 && len(strings.TrimSpace(input)) == 0 } - -//private static string ExtractVersion(string fullVersion) -//{ -//const string Pattern = @"(\d+\.\d+\.\d+)"; -//var match = Regex.Match(fullVersion, Pattern); -// -//return match.Success -//? match.Groups[1].Value -//: string.Empty; -//} - -func ExtractVersion(fullVersion string) string { - const pattern = `(\d+\.\d+\.\d+)` - re := regexp.MustCompile(pattern) - match := re.FindStringSubmatch(fullVersion) - if len(match) > 0 { - return match[1] - } - return "" -} - -func Is311OrMore(version string) (bool, error) { - v := ExtractVersion(version) - compare, err := CompareSemver(v, "3.11.0") - if err != nil { - return false, err - } - return compare >= 0, nil -} - -// CompareSemver compares two semantic version strings. -// Returns -1 if v1 < v2, 1 if v1 > v2, and 0 if they are equal. -func CompareSemver(v1, v2 string) (int, error) { - parseVersion := func(v string) ([]int, error) { - parts := strings.Split(v, ".") - if len(parts) != 3 { - return nil, fmt.Errorf("invalid semantic version: %s", v) - } - version := make([]int, 3) - for i, part := range parts { - num, err := strconv.Atoi(part) - if err != nil { - return nil, fmt.Errorf("invalid number in version: %s", part) - } - version[i] = num - } - return version, nil - } - - v1Parts, err := parseVersion(v1) - if err != nil { - return 0, err - } - v2Parts, err := parseVersion(v2) - if err != nil { - return 0, err - } - - for i := 0; i < 3; i++ { - if v1Parts[i] < v2Parts[i] { - return -1, nil - } else if v1Parts[i] > v2Parts[i] { - return 1, nil - } - } - return 0, nil -} From 2d7a67ea497385a0a47c0a76c7c96cb0a802fd77 Mon Sep 17 00:00:00 2001 From: Gabriele Santomaggio Date: Tue, 30 Jul 2024 10:16:18 +0200 Subject: [PATCH 3/3] Reduce the log level Signed-off-by: Gabriele Santomaggio --- pkg/stream/client.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/stream/client.go b/pkg/stream/client.go index 54f2fbf5..7a713b1b 100644 --- a/pkg/stream/client.go +++ b/pkg/stream/client.go @@ -218,7 +218,7 @@ func (c *Client) connect() error { } if serverProperties["version"] == "" || !c.availableFeatures.Is311OrMore() { - logs.LogInfo( + logs.LogDebug( "Server version is less than 3.11.0, skipping command version exchange") } else { err := c.exchangeVersion(c.serverProperties["version"])