mirror of
https://github.com/hanzoai/vector-go.git
synced 2026-10-30 18:18:35 +00:00
# Conflicts: # examples/simple/go.mod # examples/simple/go.sum # go.mod # go.sum # qdrant/collections_service_grpc.pb.go # qdrant/compare_versions.go # qdrant/config.go # qdrant/grpc_client.go # qdrant/points_service_grpc.pb.go # qdrant/qdrant_grpc.pb.go # qdrant/snapshots_service_grpc.pb.go
89 lines
2.0 KiB
Go
89 lines
2.0 KiB
Go
package qdrant
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"log/slog"
|
|
"strconv"
|
|
"strings"
|
|
"time"
|
|
"unicode"
|
|
)
|
|
|
|
const fullVersionParts = 3
|
|
const reducedVersionParts = 2
|
|
const unknownVersion = "Unknown"
|
|
|
|
type Version struct {
|
|
Major int
|
|
Minor int
|
|
}
|
|
|
|
func getServerVersion(clientConn *GrpcClient, timeout time.Duration) string {
|
|
logger := slog.Default()
|
|
ctx, cancel := context.WithTimeout(context.Background(), timeout)
|
|
defer cancel()
|
|
healthCheckResult, err := clientConn.qdrant.HealthCheck(ctx, &HealthCheckRequest{})
|
|
if err != nil {
|
|
logger.WarnContext(ctx, "Unable to get server version, use default", "err", err, "default", unknownVersion)
|
|
return unknownVersion
|
|
}
|
|
serverVersion := healthCheckResult.GetVersion()
|
|
|
|
return serverVersion
|
|
}
|
|
|
|
func removeLeadingNonNumeric(versionStr string) string {
|
|
return strings.TrimLeftFunc(versionStr, func(r rune) bool {
|
|
return !unicode.IsDigit(r)
|
|
})
|
|
}
|
|
|
|
// ParseVersion converts a version string "x.y[.z]" into a Version struct.
|
|
func ParseVersion(versionStr string) (*Version, error) {
|
|
cleanedVersionStr := removeLeadingNonNumeric(versionStr)
|
|
parts := strings.SplitN(cleanedVersionStr, ".", fullVersionParts)
|
|
if len(parts) < reducedVersionParts {
|
|
return nil, fmt.Errorf("unable to parse version, expected format: x.y[.z], found: %s", cleanedVersionStr)
|
|
}
|
|
|
|
major, err := strconv.Atoi(parts[0])
|
|
if err != nil {
|
|
return nil, fmt.Errorf("failed to parse major version: %w", err)
|
|
}
|
|
|
|
minor, err := strconv.Atoi(parts[1])
|
|
if err != nil {
|
|
return nil, fmt.Errorf("failed to parse minor version: %w", err)
|
|
}
|
|
|
|
return &Version{
|
|
Major: major,
|
|
Minor: minor,
|
|
}, nil
|
|
}
|
|
|
|
func IsCompatible(clientVersion, serverVersion string) bool {
|
|
if clientVersion == serverVersion {
|
|
return true
|
|
}
|
|
|
|
client, err := ParseVersion(clientVersion)
|
|
if err != nil {
|
|
return false
|
|
}
|
|
|
|
server, err := ParseVersion(serverVersion)
|
|
if err != nil {
|
|
return false
|
|
}
|
|
|
|
if client.Major != server.Major {
|
|
return false
|
|
}
|
|
|
|
diff := client.Minor - server.Minor
|
|
return diff <= 1 && diff >= -1
|
|
}
|
|
|