mirror of
https://github.com/etcd-io/etcd.git
synced 2024-09-27 06:25:44 +00:00
Merge pull request #16313 from CaojiamingAlan/check_version
checks the client supported versions based on the current version
This commit is contained in:
commit
9ad5189d3d
@ -44,6 +44,9 @@ var (
|
|||||||
V3_6 = semver.Version{Major: 3, Minor: 6}
|
V3_6 = semver.Version{Major: 3, Minor: 6}
|
||||||
V3_7 = semver.Version{Major: 3, Minor: 7}
|
V3_7 = semver.Version{Major: 3, Minor: 7}
|
||||||
V4_0 = semver.Version{Major: 4, Minor: 0}
|
V4_0 = semver.Version{Major: 4, Minor: 0}
|
||||||
|
|
||||||
|
// AllVersions keeps all the versions in ascending order.
|
||||||
|
AllVersions = []semver.Version{V3_0, V3_1, V3_2, V3_3, V3_4, V3_5, V3_6, V3_7, V4_0}
|
||||||
)
|
)
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
|
@ -18,11 +18,11 @@ import (
|
|||||||
"context"
|
"context"
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"strconv"
|
|
||||||
"strings"
|
"strings"
|
||||||
"sync"
|
"sync"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
"github.com/coreos/go-semver/semver"
|
||||||
"go.uber.org/zap"
|
"go.uber.org/zap"
|
||||||
"google.golang.org/grpc"
|
"google.golang.org/grpc"
|
||||||
"google.golang.org/grpc/codes"
|
"google.golang.org/grpc/codes"
|
||||||
@ -32,6 +32,7 @@ import (
|
|||||||
"google.golang.org/grpc/status"
|
"google.golang.org/grpc/status"
|
||||||
|
|
||||||
"go.etcd.io/etcd/api/v3/v3rpc/rpctypes"
|
"go.etcd.io/etcd/api/v3/v3rpc/rpctypes"
|
||||||
|
"go.etcd.io/etcd/api/v3/version"
|
||||||
"go.etcd.io/etcd/client/pkg/v3/logutil"
|
"go.etcd.io/etcd/client/pkg/v3/logutil"
|
||||||
"go.etcd.io/etcd/client/v3/credentials"
|
"go.etcd.io/etcd/client/v3/credentials"
|
||||||
"go.etcd.io/etcd/client/v3/internal/endpoint"
|
"go.etcd.io/etcd/client/v3/internal/endpoint"
|
||||||
@ -475,6 +476,22 @@ func (c *Client) roundRobinQuorumBackoff(waitBetween time.Duration, jitterFracti
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// minSupportedVersion returns the minimum version supported, which is the previous minor release.
|
||||||
|
func minSupportedVersion() *semver.Version {
|
||||||
|
ver := semver.Must(semver.NewVersion(version.Version))
|
||||||
|
// consider only major and minor version
|
||||||
|
ver = &semver.Version{Major: ver.Major, Minor: ver.Minor}
|
||||||
|
for i := range version.AllVersions {
|
||||||
|
if version.AllVersions[i].Equal(*ver) {
|
||||||
|
if i == 0 {
|
||||||
|
return ver
|
||||||
|
}
|
||||||
|
return &version.AllVersions[i-1]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
panic("current version is not in the version list")
|
||||||
|
}
|
||||||
|
|
||||||
func (c *Client) checkVersion() (err error) {
|
func (c *Client) checkVersion() (err error) {
|
||||||
var wg sync.WaitGroup
|
var wg sync.WaitGroup
|
||||||
|
|
||||||
@ -496,20 +513,13 @@ func (c *Client) checkVersion() (err error) {
|
|||||||
errc <- rerr
|
errc <- rerr
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
vs := strings.Split(resp.Version, ".")
|
vs, serr := semver.NewVersion(resp.Version)
|
||||||
maj, min := 0, 0
|
if serr != nil {
|
||||||
if len(vs) >= 2 {
|
|
||||||
var serr error
|
|
||||||
if maj, serr = strconv.Atoi(vs[0]); serr != nil {
|
|
||||||
errc <- serr
|
errc <- serr
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
if min, serr = strconv.Atoi(vs[1]); serr != nil {
|
|
||||||
errc <- serr
|
if vs.LessThan(*minSupportedVersion()) {
|
||||||
return
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if maj < 3 || (maj == 3 && min < 4) {
|
|
||||||
rerr = ErrOldCluster
|
rerr = ErrOldCluster
|
||||||
}
|
}
|
||||||
errc <- rerr
|
errc <- rerr
|
||||||
|
@ -24,13 +24,16 @@ import (
|
|||||||
"testing"
|
"testing"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
"github.com/coreos/go-semver/semver"
|
||||||
"github.com/stretchr/testify/assert"
|
"github.com/stretchr/testify/assert"
|
||||||
|
"github.com/stretchr/testify/require"
|
||||||
|
|
||||||
"go.uber.org/zap"
|
"go.uber.org/zap"
|
||||||
"go.uber.org/zap/zaptest"
|
"go.uber.org/zap/zaptest"
|
||||||
|
|
||||||
"go.etcd.io/etcd/api/v3/etcdserverpb"
|
"go.etcd.io/etcd/api/v3/etcdserverpb"
|
||||||
"go.etcd.io/etcd/api/v3/v3rpc/rpctypes"
|
"go.etcd.io/etcd/api/v3/v3rpc/rpctypes"
|
||||||
|
"go.etcd.io/etcd/api/v3/version"
|
||||||
"go.etcd.io/etcd/client/pkg/v3/testutil"
|
"go.etcd.io/etcd/client/pkg/v3/testutil"
|
||||||
|
|
||||||
"google.golang.org/grpc"
|
"google.golang.org/grpc"
|
||||||
@ -312,6 +315,47 @@ func TestSyncFiltersMembers(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestMinSupportedVersion(t *testing.T) {
|
||||||
|
testutil.BeforeTest(t)
|
||||||
|
var tests = []struct {
|
||||||
|
name string
|
||||||
|
currentVersion semver.Version
|
||||||
|
minSupportedVersion semver.Version
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
name: "v3.6 client should accept v3.5",
|
||||||
|
currentVersion: version.V3_6,
|
||||||
|
minSupportedVersion: version.V3_5,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "v3.7 client should accept v3.6",
|
||||||
|
currentVersion: version.V3_7,
|
||||||
|
minSupportedVersion: version.V3_6,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "first minor version should accept its previous version",
|
||||||
|
currentVersion: version.V4_0,
|
||||||
|
minSupportedVersion: version.V3_7,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "first version in list should not accept previous versions",
|
||||||
|
currentVersion: version.V3_0,
|
||||||
|
minSupportedVersion: version.V3_0,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
versionBackup := version.Version
|
||||||
|
t.Cleanup(func() {
|
||||||
|
version.Version = versionBackup
|
||||||
|
})
|
||||||
|
for _, tt := range tests {
|
||||||
|
t.Run(tt.name, func(t *testing.T) {
|
||||||
|
version.Version = tt.currentVersion.String()
|
||||||
|
require.True(t, minSupportedVersion().Equal(tt.minSupportedVersion))
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func TestClientRejectOldCluster(t *testing.T) {
|
func TestClientRejectOldCluster(t *testing.T) {
|
||||||
testutil.BeforeTest(t)
|
testutil.BeforeTest(t)
|
||||||
var tests = []struct {
|
var tests = []struct {
|
||||||
@ -323,13 +367,13 @@ func TestClientRejectOldCluster(t *testing.T) {
|
|||||||
{
|
{
|
||||||
name: "all new versions with the same value",
|
name: "all new versions with the same value",
|
||||||
endpoints: []string{"192.168.3.41:22379", "192.168.3.41:22479", "192.168.3.41:22579"},
|
endpoints: []string{"192.168.3.41:22379", "192.168.3.41:22479", "192.168.3.41:22579"},
|
||||||
versions: []string{"3.5.4", "3.5.4", "3.5.4"},
|
versions: []string{version.Version, version.Version, version.Version},
|
||||||
expectedError: nil,
|
expectedError: nil,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "all new versions with different values",
|
name: "all new versions with different values",
|
||||||
endpoints: []string{"192.168.3.41:22379", "192.168.3.41:22479", "192.168.3.41:22579"},
|
endpoints: []string{"192.168.3.41:22379", "192.168.3.41:22479", "192.168.3.41:22579"},
|
||||||
versions: []string{"3.5.4", "3.5.4", "3.4.0"},
|
versions: []string{version.Version, minSupportedVersion().String(), minSupportedVersion().String()},
|
||||||
expectedError: nil,
|
expectedError: nil,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
@ -3,6 +3,7 @@ module go.etcd.io/etcd/client/v3
|
|||||||
go 1.19
|
go 1.19
|
||||||
|
|
||||||
require (
|
require (
|
||||||
|
github.com/coreos/go-semver v0.3.1
|
||||||
github.com/dustin/go-humanize v1.0.1
|
github.com/dustin/go-humanize v1.0.1
|
||||||
github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0
|
github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0
|
||||||
github.com/prometheus/client_golang v1.16.0
|
github.com/prometheus/client_golang v1.16.0
|
||||||
@ -18,7 +19,6 @@ require (
|
|||||||
github.com/benbjohnson/clock v1.1.0 // indirect
|
github.com/benbjohnson/clock v1.1.0 // indirect
|
||||||
github.com/beorn7/perks v1.0.1 // indirect
|
github.com/beorn7/perks v1.0.1 // indirect
|
||||||
github.com/cespare/xxhash/v2 v2.2.0 // indirect
|
github.com/cespare/xxhash/v2 v2.2.0 // indirect
|
||||||
github.com/coreos/go-semver v0.3.1 // indirect
|
|
||||||
github.com/coreos/go-systemd/v22 v22.5.0 // indirect
|
github.com/coreos/go-systemd/v22 v22.5.0 // indirect
|
||||||
github.com/davecgh/go-spew v1.1.1 // indirect
|
github.com/davecgh/go-spew v1.1.1 // indirect
|
||||||
github.com/gogo/protobuf v1.3.2 // indirect
|
github.com/gogo/protobuf v1.3.2 // indirect
|
||||||
|
Loading…
x
Reference in New Issue
Block a user