mirror of
https://github.com/etcd-io/etcd.git
synced 2024-09-27 06:25:44 +00:00
Replace all etcd versions with the centralized definitions
We have already defined all the constant etcd versions in the centralized place api/version/version.go. So we should replace all the versions with the centralized definitions.
This commit is contained in:
parent
4f202a6429
commit
5f8cd5bd39
@ -22,6 +22,7 @@ import (
|
||||
"github.com/spf13/cobra"
|
||||
"go.uber.org/zap"
|
||||
|
||||
"go.etcd.io/etcd/api/v3/version"
|
||||
"go.etcd.io/etcd/pkg/v3/cobrautl"
|
||||
"go.etcd.io/etcd/server/v3/storage/backend"
|
||||
"go.etcd.io/etcd/server/v3/storage/datadir"
|
||||
@ -86,7 +87,7 @@ func (o *migrateOptions) Config() (*migrateConfig, error) {
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("failed to parse target version: %v", err)
|
||||
}
|
||||
if c.targetVersion.LessThan(schema.V3_5) {
|
||||
if c.targetVersion.LessThan(version.V3_5) {
|
||||
return nil, fmt.Errorf(`target version %q not supported. Minimal "3.5"`, storageVersionToString(c.targetVersion))
|
||||
}
|
||||
|
||||
@ -143,7 +144,7 @@ func migrateForce(lg *zap.Logger, tx backend.BatchTx, target *semver.Version) {
|
||||
tx.LockOutsideApply()
|
||||
defer tx.Unlock()
|
||||
// Storage version is only supported since v3.6
|
||||
if target.LessThan(schema.V3_6) {
|
||||
if target.LessThan(version.V3_6) {
|
||||
schema.UnsafeClearStorageVersion(tx)
|
||||
lg.Warn("forcefully cleared storage version")
|
||||
} else {
|
||||
|
@ -12,12 +12,6 @@ import (
|
||||
"go.etcd.io/etcd/api/v3/version"
|
||||
)
|
||||
|
||||
var (
|
||||
V3_0 = semver.Version{Major: 3, Minor: 0}
|
||||
V3_5 = semver.Version{Major: 3, Minor: 5}
|
||||
V3_6 = semver.Version{Major: 3, Minor: 6}
|
||||
)
|
||||
|
||||
func TestMemberMinimalVersion(t *testing.T) {
|
||||
tests := []struct {
|
||||
memberVersions map[string]*version.Versions
|
||||
@ -69,25 +63,25 @@ func TestDecideStorageVersion(t *testing.T) {
|
||||
},
|
||||
{
|
||||
name: "Should set storage version if cluster version is set",
|
||||
clusterVersion: &V3_5,
|
||||
expectStorageVersion: &V3_5,
|
||||
clusterVersion: &version.V3_5,
|
||||
expectStorageVersion: &version.V3_5,
|
||||
},
|
||||
{
|
||||
name: "No action if storage version was already set",
|
||||
storageVersion: &V3_5,
|
||||
expectStorageVersion: &V3_5,
|
||||
storageVersion: &version.V3_5,
|
||||
expectStorageVersion: &version.V3_5,
|
||||
},
|
||||
{
|
||||
name: "No action if storage version equals cluster version",
|
||||
clusterVersion: &V3_5,
|
||||
storageVersion: &V3_5,
|
||||
expectStorageVersion: &V3_5,
|
||||
clusterVersion: &version.V3_5,
|
||||
storageVersion: &version.V3_5,
|
||||
expectStorageVersion: &version.V3_5,
|
||||
},
|
||||
{
|
||||
name: "Should set storage version to cluster version",
|
||||
clusterVersion: &V3_6,
|
||||
storageVersion: &V3_5,
|
||||
expectStorageVersion: &V3_6,
|
||||
clusterVersion: &version.V3_6,
|
||||
storageVersion: &version.V3_5,
|
||||
expectStorageVersion: &version.V3_6,
|
||||
},
|
||||
}
|
||||
|
||||
@ -168,7 +162,7 @@ func TestUpdateClusterVersionIfNeeded(t *testing.T) {
|
||||
}{
|
||||
{
|
||||
name: "Default to 3.0 if there are no members",
|
||||
expectClusterVersion: &V3_0,
|
||||
expectClusterVersion: &version.V3_0,
|
||||
},
|
||||
{
|
||||
name: "Should pick lowest server version from members",
|
||||
@ -176,7 +170,7 @@ func TestUpdateClusterVersionIfNeeded(t *testing.T) {
|
||||
"a": {Cluster: "3.7.0", Server: "3.6.0"},
|
||||
"b": {Cluster: "3.4.0", Server: "3.5.0"},
|
||||
},
|
||||
expectClusterVersion: &V3_5,
|
||||
expectClusterVersion: &version.V3_5,
|
||||
},
|
||||
{
|
||||
name: "Sets minimal version when member has broken version",
|
||||
@ -184,7 +178,7 @@ func TestUpdateClusterVersionIfNeeded(t *testing.T) {
|
||||
"a": {Cluster: "3.7.0", Server: "3.6.0"},
|
||||
"b": {Cluster: "xxxx", Server: "yyyy"},
|
||||
},
|
||||
expectClusterVersion: &V3_0,
|
||||
expectClusterVersion: &version.V3_0,
|
||||
},
|
||||
{
|
||||
name: "Should pick lowest server version from members (cv already set)",
|
||||
@ -192,8 +186,8 @@ func TestUpdateClusterVersionIfNeeded(t *testing.T) {
|
||||
"a": {Cluster: "3.7.0", Server: "3.6.0"},
|
||||
"b": {Cluster: "3.4.0", Server: "3.5.0"},
|
||||
},
|
||||
clusterVersion: &V3_5,
|
||||
expectClusterVersion: &V3_5,
|
||||
clusterVersion: &version.V3_5,
|
||||
expectClusterVersion: &version.V3_5,
|
||||
},
|
||||
{
|
||||
name: "Should upgrade cluster version if all members have upgraded (have higher server version)",
|
||||
@ -201,8 +195,8 @@ func TestUpdateClusterVersionIfNeeded(t *testing.T) {
|
||||
"a": {Cluster: "3.5.0", Server: "3.6.0"},
|
||||
"b": {Cluster: "3.5.0", Server: "3.6.0"},
|
||||
},
|
||||
clusterVersion: &V3_5,
|
||||
expectClusterVersion: &V3_6,
|
||||
clusterVersion: &version.V3_5,
|
||||
expectClusterVersion: &version.V3_6,
|
||||
},
|
||||
{
|
||||
name: "Should downgrade cluster version if downgrade is set to allow older members to join",
|
||||
@ -210,9 +204,9 @@ func TestUpdateClusterVersionIfNeeded(t *testing.T) {
|
||||
"a": {Cluster: "3.6.0", Server: "3.6.0"},
|
||||
"b": {Cluster: "3.6.0", Server: "3.6.0"},
|
||||
},
|
||||
clusterVersion: &V3_6,
|
||||
clusterVersion: &version.V3_6,
|
||||
downgrade: &DowngradeInfo{TargetVersion: "3.5.0", Enabled: true},
|
||||
expectClusterVersion: &V3_5,
|
||||
expectClusterVersion: &version.V3_5,
|
||||
},
|
||||
{
|
||||
name: "Should maintain downgrade target version to allow older members to join",
|
||||
@ -220,9 +214,9 @@ func TestUpdateClusterVersionIfNeeded(t *testing.T) {
|
||||
"a": {Cluster: "3.5.0", Server: "3.6.0"},
|
||||
"b": {Cluster: "3.5.0", Server: "3.6.0"},
|
||||
},
|
||||
clusterVersion: &V3_5,
|
||||
clusterVersion: &version.V3_5,
|
||||
downgrade: &DowngradeInfo{TargetVersion: "3.5.0", Enabled: true},
|
||||
expectClusterVersion: &V3_5,
|
||||
expectClusterVersion: &version.V3_5,
|
||||
},
|
||||
{
|
||||
name: "Don't downgrade below supported range",
|
||||
@ -230,9 +224,9 @@ func TestUpdateClusterVersionIfNeeded(t *testing.T) {
|
||||
"a": {Cluster: "3.5.0", Server: "3.6.0"},
|
||||
"b": {Cluster: "3.5.0", Server: "3.6.0"},
|
||||
},
|
||||
clusterVersion: &V3_5,
|
||||
clusterVersion: &version.V3_5,
|
||||
downgrade: &DowngradeInfo{TargetVersion: "3.4.0", Enabled: true},
|
||||
expectClusterVersion: &V3_5,
|
||||
expectClusterVersion: &version.V3_5,
|
||||
},
|
||||
}
|
||||
|
||||
@ -335,25 +329,25 @@ func TestUpdateStorageVersionIfNeeded(t *testing.T) {
|
||||
},
|
||||
{
|
||||
name: "Should set storage version if cluster version is set",
|
||||
clusterVersion: &V3_5,
|
||||
expectStorageVersion: &V3_5,
|
||||
clusterVersion: &version.V3_5,
|
||||
expectStorageVersion: &version.V3_5,
|
||||
},
|
||||
{
|
||||
name: "No action if storage version was already set",
|
||||
storageVersion: &V3_5,
|
||||
expectStorageVersion: &V3_5,
|
||||
storageVersion: &version.V3_5,
|
||||
expectStorageVersion: &version.V3_5,
|
||||
},
|
||||
{
|
||||
name: "No action if storage version equals cluster version",
|
||||
clusterVersion: &V3_5,
|
||||
storageVersion: &V3_5,
|
||||
expectStorageVersion: &V3_5,
|
||||
clusterVersion: &version.V3_5,
|
||||
storageVersion: &version.V3_5,
|
||||
expectStorageVersion: &version.V3_5,
|
||||
},
|
||||
{
|
||||
name: "Should set storage version to cluster version",
|
||||
clusterVersion: &V3_6,
|
||||
storageVersion: &V3_5,
|
||||
expectStorageVersion: &V3_6,
|
||||
clusterVersion: &version.V3_6,
|
||||
storageVersion: &version.V3_5,
|
||||
expectStorageVersion: &version.V3_6,
|
||||
},
|
||||
}
|
||||
|
||||
|
@ -28,87 +28,83 @@ import (
|
||||
"go.etcd.io/etcd/api/v3/version"
|
||||
)
|
||||
|
||||
var (
|
||||
V3_7 = semver.Version{Major: 3, Minor: 7}
|
||||
)
|
||||
|
||||
func TestUpgradeSingleNode(t *testing.T) {
|
||||
lg := zaptest.NewLogger(t)
|
||||
c := newCluster(lg, 1, V3_6)
|
||||
c := newCluster(lg, 1, version.V3_6)
|
||||
c.StepMonitors()
|
||||
assert.Equal(t, newCluster(lg, 1, V3_6), c)
|
||||
assert.Equal(t, newCluster(lg, 1, version.V3_6), c)
|
||||
|
||||
c.ReplaceMemberBinary(0, V3_7)
|
||||
c.ReplaceMemberBinary(0, version.V3_7)
|
||||
c.StepMonitors()
|
||||
c.StepMonitors()
|
||||
|
||||
assert.Equal(t, newCluster(lg, 1, V3_7), c)
|
||||
assert.Equal(t, newCluster(lg, 1, version.V3_7), c)
|
||||
}
|
||||
|
||||
func TestUpgradeThreeNodes(t *testing.T) {
|
||||
lg := zaptest.NewLogger(t)
|
||||
c := newCluster(lg, 3, V3_6)
|
||||
c := newCluster(lg, 3, version.V3_6)
|
||||
c.StepMonitors()
|
||||
assert.Equal(t, newCluster(lg, 3, V3_6), c)
|
||||
assert.Equal(t, newCluster(lg, 3, version.V3_6), c)
|
||||
|
||||
c.ReplaceMemberBinary(0, V3_7)
|
||||
c.ReplaceMemberBinary(0, version.V3_7)
|
||||
c.StepMonitors()
|
||||
c.ReplaceMemberBinary(1, V3_7)
|
||||
c.ReplaceMemberBinary(1, version.V3_7)
|
||||
c.StepMonitors()
|
||||
c.ReplaceMemberBinary(2, V3_7)
|
||||
c.ReplaceMemberBinary(2, version.V3_7)
|
||||
c.StepMonitors()
|
||||
c.StepMonitors()
|
||||
|
||||
assert.Equal(t, newCluster(lg, 3, V3_7), c)
|
||||
assert.Equal(t, newCluster(lg, 3, version.V3_7), c)
|
||||
}
|
||||
|
||||
func TestDowngradeSingleNode(t *testing.T) {
|
||||
lg := zaptest.NewLogger(t)
|
||||
c := newCluster(lg, 1, V3_6)
|
||||
c := newCluster(lg, 1, version.V3_6)
|
||||
c.StepMonitors()
|
||||
assert.Equal(t, newCluster(lg, 1, V3_6), c)
|
||||
assert.Equal(t, newCluster(lg, 1, version.V3_6), c)
|
||||
|
||||
assert.NoError(t, c.Version().DowngradeEnable(context.Background(), &V3_5))
|
||||
assert.NoError(t, c.Version().DowngradeEnable(context.Background(), &version.V3_5))
|
||||
c.StepMonitors()
|
||||
assert.Equal(t, V3_5, c.clusterVersion)
|
||||
assert.Equal(t, version.V3_5, c.clusterVersion)
|
||||
|
||||
c.ReplaceMemberBinary(0, V3_5)
|
||||
c.ReplaceMemberBinary(0, version.V3_5)
|
||||
c.StepMonitors()
|
||||
|
||||
assert.Equal(t, newCluster(lg, 1, V3_5), c)
|
||||
assert.Equal(t, newCluster(lg, 1, version.V3_5), c)
|
||||
}
|
||||
|
||||
func TestDowngradeThreeNode(t *testing.T) {
|
||||
lg := zaptest.NewLogger(t)
|
||||
c := newCluster(lg, 3, V3_6)
|
||||
c := newCluster(lg, 3, version.V3_6)
|
||||
c.StepMonitors()
|
||||
assert.Equal(t, newCluster(lg, 3, V3_6), c)
|
||||
assert.Equal(t, newCluster(lg, 3, version.V3_6), c)
|
||||
|
||||
assert.NoError(t, c.Version().DowngradeEnable(context.Background(), &V3_5))
|
||||
assert.NoError(t, c.Version().DowngradeEnable(context.Background(), &version.V3_5))
|
||||
c.StepMonitors()
|
||||
assert.Equal(t, V3_5, c.clusterVersion)
|
||||
assert.Equal(t, version.V3_5, c.clusterVersion)
|
||||
|
||||
c.ReplaceMemberBinary(0, V3_5)
|
||||
c.ReplaceMemberBinary(0, version.V3_5)
|
||||
c.StepMonitors()
|
||||
c.ReplaceMemberBinary(1, V3_5)
|
||||
c.ReplaceMemberBinary(1, version.V3_5)
|
||||
c.StepMonitors()
|
||||
c.ReplaceMemberBinary(2, V3_5)
|
||||
c.ReplaceMemberBinary(2, version.V3_5)
|
||||
c.StepMonitors()
|
||||
|
||||
assert.Equal(t, newCluster(lg, 3, V3_5), c)
|
||||
assert.Equal(t, newCluster(lg, 3, version.V3_5), c)
|
||||
}
|
||||
|
||||
func TestNewerMemberCanReconnectDuringDowngrade(t *testing.T) {
|
||||
lg := zaptest.NewLogger(t)
|
||||
c := newCluster(lg, 3, V3_6)
|
||||
c := newCluster(lg, 3, version.V3_6)
|
||||
c.StepMonitors()
|
||||
assert.Equal(t, newCluster(lg, 3, V3_6), c)
|
||||
assert.Equal(t, newCluster(lg, 3, version.V3_6), c)
|
||||
|
||||
assert.NoError(t, c.Version().DowngradeEnable(context.Background(), &V3_5))
|
||||
assert.NoError(t, c.Version().DowngradeEnable(context.Background(), &version.V3_5))
|
||||
c.StepMonitors()
|
||||
assert.Equal(t, V3_5, c.clusterVersion)
|
||||
assert.Equal(t, version.V3_5, c.clusterVersion)
|
||||
|
||||
c.ReplaceMemberBinary(0, V3_5)
|
||||
c.ReplaceMemberBinary(0, version.V3_5)
|
||||
c.StepMonitors()
|
||||
|
||||
c.MemberCrashes(2)
|
||||
@ -116,12 +112,12 @@ func TestNewerMemberCanReconnectDuringDowngrade(t *testing.T) {
|
||||
c.MemberReconnects(2)
|
||||
c.StepMonitors()
|
||||
|
||||
c.ReplaceMemberBinary(1, V3_5)
|
||||
c.ReplaceMemberBinary(1, version.V3_5)
|
||||
c.StepMonitors()
|
||||
c.ReplaceMemberBinary(2, V3_5)
|
||||
c.ReplaceMemberBinary(2, version.V3_5)
|
||||
c.StepMonitors()
|
||||
|
||||
assert.Equal(t, newCluster(lg, 3, V3_5), c)
|
||||
assert.Equal(t, newCluster(lg, 3, version.V3_5), c)
|
||||
}
|
||||
|
||||
func newCluster(lg *zap.Logger, memberCount int, ver semver.Version) *clusterMock {
|
||||
|
@ -25,6 +25,7 @@ import (
|
||||
|
||||
"github.com/coreos/go-semver/semver"
|
||||
pb "go.etcd.io/etcd/api/v3/etcdserverpb"
|
||||
"go.etcd.io/etcd/api/v3/version"
|
||||
"go.etcd.io/etcd/server/v3/lease/leasepb"
|
||||
"go.etcd.io/etcd/server/v3/storage/backend"
|
||||
"go.etcd.io/etcd/server/v3/storage/schema"
|
||||
@ -37,8 +38,6 @@ const NoLease = LeaseID(0)
|
||||
// MaxLeaseTTL is the maximum lease TTL value
|
||||
const MaxLeaseTTL = 9000000000
|
||||
|
||||
var v3_6 = semver.Version{Major: 3, Minor: 6}
|
||||
|
||||
var (
|
||||
forever = time.Time{}
|
||||
|
||||
@ -381,11 +380,11 @@ func (le *lessor) Checkpoint(id LeaseID, remainingTTL int64) error {
|
||||
|
||||
func (le *lessor) shouldPersistCheckpoints() bool {
|
||||
cv := le.cluster.Version()
|
||||
return le.checkpointPersist || (cv != nil && greaterOrEqual(*cv, v3_6))
|
||||
return le.checkpointPersist || (cv != nil && greaterOrEqual(*cv, version.V3_6))
|
||||
}
|
||||
|
||||
func greaterOrEqual(first, second semver.Version) bool {
|
||||
return !first.LessThan(second)
|
||||
return !version.LessThan(first, second)
|
||||
}
|
||||
|
||||
// Renew renews an existing lease. If the given lease does not exist or
|
||||
|
@ -18,6 +18,7 @@ import (
|
||||
"fmt"
|
||||
|
||||
"github.com/coreos/go-semver/semver"
|
||||
"go.etcd.io/etcd/api/v3/version"
|
||||
"go.etcd.io/etcd/server/v3/storage/backend"
|
||||
"go.uber.org/zap"
|
||||
)
|
||||
@ -102,7 +103,7 @@ func (s migrationStep) unsafeExecute(lg *zap.Logger, tx backend.BatchTx) error {
|
||||
return err
|
||||
}
|
||||
// Storage version is available since v3.6, downgrading target v3.5 should clean this field.
|
||||
if !s.target.LessThan(V3_6) {
|
||||
if !s.target.LessThan(version.V3_6) {
|
||||
UnsafeSetStorageVersion(tx, &s.target)
|
||||
}
|
||||
return nil
|
||||
|
@ -21,15 +21,12 @@ import (
|
||||
|
||||
"github.com/coreos/go-semver/semver"
|
||||
"github.com/stretchr/testify/assert"
|
||||
"go.etcd.io/etcd/api/v3/version"
|
||||
"go.etcd.io/etcd/server/v3/storage/backend"
|
||||
betesting "go.etcd.io/etcd/server/v3/storage/backend/testing"
|
||||
"go.uber.org/zap/zaptest"
|
||||
)
|
||||
|
||||
var (
|
||||
V4_0 = semver.Version{Major: 4, Minor: 0}
|
||||
)
|
||||
|
||||
func TestNewPlan(t *testing.T) {
|
||||
tcs := []struct {
|
||||
name string
|
||||
@ -42,25 +39,25 @@ func TestNewPlan(t *testing.T) {
|
||||
}{
|
||||
{
|
||||
name: "Update v3.5 to v3.6 should work",
|
||||
current: V3_5,
|
||||
target: V3_6,
|
||||
current: version.V3_5,
|
||||
target: version.V3_6,
|
||||
},
|
||||
{
|
||||
name: "Downgrade v3.6 to v3.5 should fail as downgrades are not yet supported",
|
||||
current: V3_6,
|
||||
target: V3_5,
|
||||
current: version.V3_6,
|
||||
target: version.V3_5,
|
||||
},
|
||||
{
|
||||
name: "Upgrade v3.6 to v3.7 should fail as v3.7 is unknown",
|
||||
current: V3_6,
|
||||
target: V3_7,
|
||||
current: version.V3_6,
|
||||
target: version.V3_7,
|
||||
expectError: true,
|
||||
expectErrorMsg: `version "3.7.0" is not supported`,
|
||||
},
|
||||
{
|
||||
name: "Upgrade v3.6 to v4.0 as major version changes are unsupported",
|
||||
current: V3_6,
|
||||
target: V4_0,
|
||||
current: version.V3_6,
|
||||
target: version.V4_0,
|
||||
expectError: true,
|
||||
expectErrorMsg: "changing major storage version is not supported",
|
||||
},
|
||||
@ -152,7 +149,7 @@ func TestMigrationStepExecute(t *testing.T) {
|
||||
{
|
||||
name: "Downgrade below to below v3.6 doesn't leave storage version as it was not supported then",
|
||||
currentVersion: semver.Version{Major: 3, Minor: 6},
|
||||
changes: schemaChanges[V3_6],
|
||||
changes: schemaChanges[version.V3_6],
|
||||
isUpgrade: false,
|
||||
expectVersion: nil,
|
||||
},
|
||||
|
@ -24,11 +24,6 @@ import (
|
||||
"go.etcd.io/etcd/server/v3/storage/backend"
|
||||
)
|
||||
|
||||
var (
|
||||
V3_5 = semver.Version{Major: 3, Minor: 5}
|
||||
V3_6 = semver.Version{Major: 3, Minor: 6}
|
||||
)
|
||||
|
||||
// Validate checks provided backend to confirm that schema used is supported.
|
||||
func Validate(lg *zap.Logger, tx backend.ReadTx) error {
|
||||
tx.Lock()
|
||||
@ -108,7 +103,7 @@ func UnsafeDetectSchemaVersion(lg *zap.Logger, tx backend.ReadTx) (v semver.Vers
|
||||
if term == 0 {
|
||||
return v, fmt.Errorf("missing term information")
|
||||
}
|
||||
return V3_5, nil
|
||||
return version.V3_5, nil
|
||||
}
|
||||
|
||||
func schemaChangesForVersion(v semver.Version, isUpgrade bool) ([]schemaChange, error) {
|
||||
@ -132,7 +127,7 @@ var (
|
||||
// schemaChanges list changes that were introduced in a particular version.
|
||||
// schema was introduced in v3.6 as so its changes were not tracked before.
|
||||
schemaChanges = map[semver.Version][]schemaChange{
|
||||
V3_6: {
|
||||
version.V3_6: {
|
||||
addNewField(Meta, MetaStorageVersionName, emptyStorageVersion),
|
||||
},
|
||||
}
|
||||
|
@ -22,6 +22,7 @@ import (
|
||||
"github.com/stretchr/testify/assert"
|
||||
"go.etcd.io/etcd/api/v3/etcdserverpb"
|
||||
"go.etcd.io/etcd/api/v3/membershippb"
|
||||
"go.etcd.io/etcd/api/v3/version"
|
||||
"go.etcd.io/etcd/raft/v3/raftpb"
|
||||
"go.etcd.io/etcd/server/v3/storage/backend"
|
||||
betesting "go.etcd.io/etcd/server/v3/storage/backend/testing"
|
||||
@ -30,11 +31,6 @@ import (
|
||||
"go.uber.org/zap"
|
||||
)
|
||||
|
||||
var (
|
||||
V3_4 = semver.Version{Major: 3, Minor: 4}
|
||||
V3_7 = semver.Version{Major: 3, Minor: 7}
|
||||
)
|
||||
|
||||
func TestValidate(t *testing.T) {
|
||||
tcs := []struct {
|
||||
name string
|
||||
@ -48,23 +44,23 @@ func TestValidate(t *testing.T) {
|
||||
// For storage to be considered v3.5 it have both confstate and term key set.
|
||||
{
|
||||
name: `V3.4 schema is correct`,
|
||||
version: V3_4,
|
||||
version: version.V3_4,
|
||||
},
|
||||
{
|
||||
name: `V3.5 schema without confstate and term fields is correct`,
|
||||
version: V3_5,
|
||||
version: version.V3_5,
|
||||
overrideKeys: func(tx backend.BatchTx) {},
|
||||
},
|
||||
{
|
||||
name: `V3.5 schema without term field is correct`,
|
||||
version: V3_5,
|
||||
version: version.V3_5,
|
||||
overrideKeys: func(tx backend.BatchTx) {
|
||||
MustUnsafeSaveConfStateToBackend(zap.NewNop(), tx, &raftpb.ConfState{})
|
||||
},
|
||||
},
|
||||
{
|
||||
name: `V3.5 schema with all fields is correct`,
|
||||
version: V3_5,
|
||||
version: version.V3_5,
|
||||
overrideKeys: func(tx backend.BatchTx) {
|
||||
MustUnsafeSaveConfStateToBackend(zap.NewNop(), tx, &raftpb.ConfState{})
|
||||
UnsafeUpdateConsistentIndex(tx, 1, 1)
|
||||
@ -72,11 +68,11 @@ func TestValidate(t *testing.T) {
|
||||
},
|
||||
{
|
||||
name: `V3.6 schema is correct`,
|
||||
version: V3_6,
|
||||
version: version.V3_6,
|
||||
},
|
||||
{
|
||||
name: `V3.7 schema is unknown and should return error`,
|
||||
version: V3_7,
|
||||
version: version.V3_7,
|
||||
expectError: true,
|
||||
expectErrorMsg: `version "3.7.0" is not supported`,
|
||||
},
|
||||
@ -116,68 +112,68 @@ func TestMigrate(t *testing.T) {
|
||||
// For storage to be considered v3.5 it have both confstate and term key set.
|
||||
{
|
||||
name: `Upgrading v3.5 to v3.6 should be rejected if confstate is not set`,
|
||||
version: V3_5,
|
||||
version: version.V3_5,
|
||||
overrideKeys: func(tx backend.BatchTx) {},
|
||||
targetVersion: V3_6,
|
||||
targetVersion: version.V3_6,
|
||||
expectVersion: nil,
|
||||
expectError: true,
|
||||
expectErrorMsg: `cannot detect storage schema version: missing confstate information`,
|
||||
},
|
||||
{
|
||||
name: `Upgrading v3.5 to v3.6 should be rejected if term is not set`,
|
||||
version: V3_5,
|
||||
version: version.V3_5,
|
||||
overrideKeys: func(tx backend.BatchTx) {
|
||||
MustUnsafeSaveConfStateToBackend(zap.NewNop(), tx, &raftpb.ConfState{})
|
||||
},
|
||||
targetVersion: V3_6,
|
||||
targetVersion: version.V3_6,
|
||||
expectVersion: nil,
|
||||
expectError: true,
|
||||
expectErrorMsg: `cannot detect storage schema version: missing term information`,
|
||||
},
|
||||
{
|
||||
name: `Upgrading v3.5 to v3.6 should succeed; all required fields are set`,
|
||||
version: V3_5,
|
||||
targetVersion: V3_6,
|
||||
expectVersion: &V3_6,
|
||||
version: version.V3_5,
|
||||
targetVersion: version.V3_6,
|
||||
expectVersion: &version.V3_6,
|
||||
},
|
||||
{
|
||||
name: `Migrate on same v3.5 version passes and doesn't set storage version'`,
|
||||
version: V3_5,
|
||||
targetVersion: V3_5,
|
||||
version: version.V3_5,
|
||||
targetVersion: version.V3_5,
|
||||
expectVersion: nil,
|
||||
},
|
||||
{
|
||||
name: `Migrate on same v3.6 version passes`,
|
||||
version: V3_6,
|
||||
targetVersion: V3_6,
|
||||
expectVersion: &V3_6,
|
||||
version: version.V3_6,
|
||||
targetVersion: version.V3_6,
|
||||
expectVersion: &version.V3_6,
|
||||
},
|
||||
{
|
||||
name: `Migrate on same v3.7 version passes`,
|
||||
version: V3_7,
|
||||
targetVersion: V3_7,
|
||||
expectVersion: &V3_7,
|
||||
version: version.V3_7,
|
||||
targetVersion: version.V3_7,
|
||||
expectVersion: &version.V3_7,
|
||||
},
|
||||
{
|
||||
name: "Upgrading 3.6 to v3.7 is not supported",
|
||||
version: V3_6,
|
||||
targetVersion: V3_7,
|
||||
expectVersion: &V3_6,
|
||||
version: version.V3_6,
|
||||
targetVersion: version.V3_7,
|
||||
expectVersion: &version.V3_6,
|
||||
expectError: true,
|
||||
expectErrorMsg: `cannot create migration plan: version "3.7.0" is not supported`,
|
||||
},
|
||||
{
|
||||
name: "Downgrading v3.7 to v3.6 is not supported",
|
||||
version: V3_7,
|
||||
targetVersion: V3_6,
|
||||
expectVersion: &V3_7,
|
||||
version: version.V3_7,
|
||||
targetVersion: version.V3_6,
|
||||
expectVersion: &version.V3_7,
|
||||
expectError: true,
|
||||
expectErrorMsg: `cannot create migration plan: version "3.7.0" is not supported`,
|
||||
},
|
||||
{
|
||||
name: "Downgrading v3.6 to v3.5 works as there are no v3.6 wal entries",
|
||||
version: V3_6,
|
||||
targetVersion: V3_5,
|
||||
version: version.V3_6,
|
||||
targetVersion: version.V3_5,
|
||||
walEntries: []etcdserverpb.InternalRaftRequest{
|
||||
{Range: &etcdserverpb.RangeRequest{Key: []byte("\x00"), RangeEnd: []byte("\xff")}},
|
||||
},
|
||||
@ -185,19 +181,19 @@ func TestMigrate(t *testing.T) {
|
||||
},
|
||||
{
|
||||
name: "Downgrading v3.6 to v3.5 fails if there are newer WAL entries",
|
||||
version: V3_6,
|
||||
targetVersion: V3_5,
|
||||
version: version.V3_6,
|
||||
targetVersion: version.V3_5,
|
||||
walEntries: []etcdserverpb.InternalRaftRequest{
|
||||
{ClusterVersionSet: &membershippb.ClusterVersionSetRequest{Ver: "3.6.0"}},
|
||||
},
|
||||
expectVersion: &V3_6,
|
||||
expectVersion: &version.V3_6,
|
||||
expectError: true,
|
||||
expectErrorMsg: "cannot downgrade storage, WAL contains newer entries",
|
||||
},
|
||||
{
|
||||
name: "Downgrading v3.5 to v3.4 is not supported as schema was introduced in v3.6",
|
||||
version: V3_5,
|
||||
targetVersion: V3_4,
|
||||
version: version.V3_5,
|
||||
targetVersion: version.V3_4,
|
||||
expectVersion: nil,
|
||||
expectError: true,
|
||||
expectErrorMsg: `cannot create migration plan: version "3.5.0" is not supported`,
|
||||
@ -236,7 +232,7 @@ func TestMigrateIsReversible(t *testing.T) {
|
||||
state map[string]string
|
||||
}{
|
||||
{
|
||||
initialVersion: V3_5,
|
||||
initialVersion: version.V3_5,
|
||||
state: map[string]string{
|
||||
"confState": `{"auto_leave":false}`,
|
||||
"consistent_index": "\x00\x00\x00\x00\x00\x00\x00\x01",
|
||||
@ -244,7 +240,7 @@ func TestMigrateIsReversible(t *testing.T) {
|
||||
},
|
||||
},
|
||||
{
|
||||
initialVersion: V3_6,
|
||||
initialVersion: version.V3_6,
|
||||
state: map[string]string{
|
||||
"confState": `{"auto_leave":false}`,
|
||||
"consistent_index": "\x00\x00\x00\x00\x00\x00\x00\x01",
|
||||
@ -297,7 +293,7 @@ func TestMigrateIsReversible(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
func setupBackendData(t *testing.T, version semver.Version, overrideKeys func(tx backend.BatchTx)) string {
|
||||
func setupBackendData(t *testing.T, ver semver.Version, overrideKeys func(tx backend.BatchTx)) string {
|
||||
t.Helper()
|
||||
be, tmpPath := betesting.NewTmpBackend(t, time.Microsecond, 10)
|
||||
tx := be.BatchTx()
|
||||
@ -309,19 +305,19 @@ func setupBackendData(t *testing.T, version semver.Version, overrideKeys func(tx
|
||||
if overrideKeys != nil {
|
||||
overrideKeys(tx)
|
||||
} else {
|
||||
switch version {
|
||||
case V3_4:
|
||||
case V3_5:
|
||||
switch ver {
|
||||
case version.V3_4:
|
||||
case version.V3_5:
|
||||
MustUnsafeSaveConfStateToBackend(zap.NewNop(), tx, &raftpb.ConfState{})
|
||||
UnsafeUpdateConsistentIndex(tx, 1, 1)
|
||||
case V3_6:
|
||||
case version.V3_6:
|
||||
MustUnsafeSaveConfStateToBackend(zap.NewNop(), tx, &raftpb.ConfState{})
|
||||
UnsafeUpdateConsistentIndex(tx, 1, 1)
|
||||
UnsafeSetStorageVersion(tx, &V3_6)
|
||||
case V3_7:
|
||||
UnsafeSetStorageVersion(tx, &version.V3_6)
|
||||
case version.V3_7:
|
||||
MustUnsafeSaveConfStateToBackend(zap.NewNop(), tx, &raftpb.ConfState{})
|
||||
UnsafeUpdateConsistentIndex(tx, 1, 1)
|
||||
UnsafeSetStorageVersion(tx, &V3_7)
|
||||
UnsafeSetStorageVersion(tx, &version.V3_7)
|
||||
tx.UnsafePut(Meta, []byte("future-key"), []byte(""))
|
||||
default:
|
||||
t.Fatalf("Unsupported storage version")
|
||||
|
@ -23,20 +23,12 @@ import (
|
||||
"github.com/stretchr/testify/assert"
|
||||
"go.etcd.io/etcd/api/v3/etcdserverpb"
|
||||
"go.etcd.io/etcd/api/v3/membershippb"
|
||||
"go.etcd.io/etcd/api/v3/version"
|
||||
"go.etcd.io/etcd/pkg/v3/pbutil"
|
||||
"go.etcd.io/etcd/raft/v3/raftpb"
|
||||
"google.golang.org/protobuf/reflect/protoreflect"
|
||||
)
|
||||
|
||||
var (
|
||||
V3_0 = semver.Version{Major: 3, Minor: 0}
|
||||
V3_1 = semver.Version{Major: 3, Minor: 1}
|
||||
V3_3 = semver.Version{Major: 3, Minor: 3}
|
||||
V3_4 = semver.Version{Major: 3, Minor: 4}
|
||||
V3_5 = semver.Version{Major: 3, Minor: 5}
|
||||
V3_6 = semver.Version{Major: 3, Minor: 6}
|
||||
)
|
||||
|
||||
func TestEtcdVersionFromEntry(t *testing.T) {
|
||||
raftReq := etcdserverpb.InternalRaftRequest{Header: &etcdserverpb.RequestHeader{AuthRevision: 1}}
|
||||
normalRequestData := pbutil.MustMarshal(&raftReq)
|
||||
@ -63,7 +55,7 @@ func TestEtcdVersionFromEntry(t *testing.T) {
|
||||
Type: raftpb.EntryNormal,
|
||||
Data: normalRequestData,
|
||||
},
|
||||
expect: &V3_1,
|
||||
expect: &version.V3_1,
|
||||
},
|
||||
{
|
||||
name: "Setting cluster version implies version within",
|
||||
@ -73,7 +65,7 @@ func TestEtcdVersionFromEntry(t *testing.T) {
|
||||
Type: raftpb.EntryNormal,
|
||||
Data: clusterVersionV3_6Data,
|
||||
},
|
||||
expect: &V3_6,
|
||||
expect: &version.V3_6,
|
||||
},
|
||||
{
|
||||
name: "Using ConfigChange implies v3.4",
|
||||
@ -83,7 +75,7 @@ func TestEtcdVersionFromEntry(t *testing.T) {
|
||||
Type: raftpb.EntryConfChange,
|
||||
Data: confChangeData,
|
||||
},
|
||||
expect: &V3_0,
|
||||
expect: &version.V3_0,
|
||||
},
|
||||
{
|
||||
name: "Using ConfigChangeV2 implies v3.4",
|
||||
@ -93,7 +85,7 @@ func TestEtcdVersionFromEntry(t *testing.T) {
|
||||
Type: raftpb.EntryConfChangeV2,
|
||||
Data: confChangeV2Data,
|
||||
},
|
||||
expect: &V3_4,
|
||||
expect: &version.V3_4,
|
||||
},
|
||||
}
|
||||
for _, tc := range tcs {
|
||||
@ -118,52 +110,52 @@ func TestEtcdVersionFromMessage(t *testing.T) {
|
||||
{
|
||||
name: "Empty RequestHeader impies v3.0",
|
||||
input: &etcdserverpb.RequestHeader{},
|
||||
expect: &V3_0,
|
||||
expect: &version.V3_0,
|
||||
},
|
||||
{
|
||||
name: "RequestHeader AuthRevision field set implies v3.5",
|
||||
input: &etcdserverpb.RequestHeader{AuthRevision: 1},
|
||||
expect: &V3_1,
|
||||
expect: &version.V3_1,
|
||||
},
|
||||
{
|
||||
name: "RequestHeader Username set implies v3.0",
|
||||
input: &etcdserverpb.RequestHeader{Username: "Alice"},
|
||||
expect: &V3_0,
|
||||
expect: &version.V3_0,
|
||||
},
|
||||
{
|
||||
name: "When two fields are set take higher version",
|
||||
input: &etcdserverpb.RequestHeader{AuthRevision: 1, Username: "Alice"},
|
||||
expect: &V3_1,
|
||||
expect: &version.V3_1,
|
||||
},
|
||||
{
|
||||
name: "Setting a RequestHeader AuthRevision in subfield implies v3.1",
|
||||
input: &etcdserverpb.InternalRaftRequest{Header: &etcdserverpb.RequestHeader{AuthRevision: 1}},
|
||||
expect: &V3_1,
|
||||
expect: &version.V3_1,
|
||||
},
|
||||
{
|
||||
name: "Setting a DowngradeInfoSetRequest implies v3.5",
|
||||
input: &etcdserverpb.InternalRaftRequest{DowngradeInfoSet: &membershippb.DowngradeInfoSetRequest{}},
|
||||
expect: &V3_5,
|
||||
expect: &version.V3_5,
|
||||
},
|
||||
{
|
||||
name: "Enum CompareResult set to EQUAL implies v3.0",
|
||||
input: &etcdserverpb.Compare{Result: etcdserverpb.Compare_EQUAL},
|
||||
expect: &V3_0,
|
||||
expect: &version.V3_0,
|
||||
},
|
||||
{
|
||||
name: "Enum CompareResult set to NOT_EQUAL implies v3.1",
|
||||
input: &etcdserverpb.Compare{Result: etcdserverpb.Compare_NOT_EQUAL},
|
||||
expect: &V3_1,
|
||||
expect: &version.V3_1,
|
||||
},
|
||||
{
|
||||
name: "Oneof Compare version set implies v3.1",
|
||||
input: &etcdserverpb.Compare{TargetUnion: &etcdserverpb.Compare_Version{}},
|
||||
expect: &V3_0,
|
||||
expect: &version.V3_0,
|
||||
},
|
||||
{
|
||||
name: "Oneof Compare lease set implies v3.3",
|
||||
input: &etcdserverpb.Compare{TargetUnion: &etcdserverpb.Compare_Lease{}},
|
||||
expect: &V3_3,
|
||||
expect: &version.V3_3,
|
||||
},
|
||||
}
|
||||
for _, tc := range tcs {
|
||||
@ -195,55 +187,55 @@ func TestEtcdVersionFromFieldOptionsString(t *testing.T) {
|
||||
},
|
||||
{
|
||||
input: `[versionpb.etcd_version_msg]:"3.5"`,
|
||||
expect: &V3_5,
|
||||
expect: &version.V3_5,
|
||||
},
|
||||
{
|
||||
input: `[versionpb.etcd_version_enum]:"3.5"`,
|
||||
expect: &V3_5,
|
||||
expect: &version.V3_5,
|
||||
},
|
||||
{
|
||||
input: `[versionpb.etcd_version_field]:"3.5"`,
|
||||
expect: &V3_5,
|
||||
expect: &version.V3_5,
|
||||
},
|
||||
{
|
||||
input: `[versionpb.etcd_version_enum_value]:"3.5"`,
|
||||
expect: &V3_5,
|
||||
expect: &version.V3_5,
|
||||
},
|
||||
{
|
||||
input: `65001:0 [versionpb.etcd_version_msg]:"3.5"`,
|
||||
expect: &V3_5,
|
||||
expect: &version.V3_5,
|
||||
},
|
||||
{
|
||||
input: `65004:"NodeID" [versionpb.etcd_version_msg]:"3.5"`,
|
||||
expect: &V3_5,
|
||||
expect: &version.V3_5,
|
||||
},
|
||||
{
|
||||
input: `65004:"NodeID" [versionpb.etcd_version_enum]:"3.5"`,
|
||||
expect: &V3_5,
|
||||
expect: &version.V3_5,
|
||||
},
|
||||
{
|
||||
input: `[versionpb.other_field]:"NodeID" [versionpb.etcd_version_msg]:"3.5"`,
|
||||
expect: &V3_5,
|
||||
expect: &version.V3_5,
|
||||
},
|
||||
{
|
||||
input: `[versionpb.etcd_version_msg]:"3.5" 65001:0`,
|
||||
expect: &V3_5,
|
||||
expect: &version.V3_5,
|
||||
},
|
||||
{
|
||||
input: `[versionpb.etcd_version_msg]:"3.5" 65004:"NodeID"`,
|
||||
expect: &V3_5,
|
||||
expect: &version.V3_5,
|
||||
},
|
||||
{
|
||||
input: `[versionpb.etcd_version_msg]:"3.5" [versionpb.other_field]:"NodeID"`,
|
||||
expect: &V3_5,
|
||||
expect: &version.V3_5,
|
||||
},
|
||||
{
|
||||
input: `[versionpb.other_field]:"NodeID" [versionpb.etcd_version_msg]:"3.5" [versionpb.another_field]:"NodeID"`,
|
||||
expect: &V3_5,
|
||||
expect: &version.V3_5,
|
||||
},
|
||||
{
|
||||
input: `65001:0 [versionpb.etcd_version_msg]:"3.5" 65001:0"`,
|
||||
expect: &V3_5,
|
||||
expect: &version.V3_5,
|
||||
},
|
||||
}
|
||||
for _, tc := range tcs {
|
||||
@ -265,24 +257,24 @@ func TestMaxVersion(t *testing.T) {
|
||||
expect: nil,
|
||||
},
|
||||
{
|
||||
a: &V3_5,
|
||||
a: &version.V3_5,
|
||||
b: nil,
|
||||
expect: &V3_5,
|
||||
expect: &version.V3_5,
|
||||
},
|
||||
{
|
||||
a: nil,
|
||||
b: &V3_5,
|
||||
expect: &V3_5,
|
||||
b: &version.V3_5,
|
||||
expect: &version.V3_5,
|
||||
},
|
||||
{
|
||||
a: &V3_6,
|
||||
b: &V3_5,
|
||||
expect: &V3_6,
|
||||
a: &version.V3_6,
|
||||
b: &version.V3_5,
|
||||
expect: &version.V3_6,
|
||||
},
|
||||
{
|
||||
a: &V3_5,
|
||||
b: &V3_6,
|
||||
expect: &V3_6,
|
||||
a: &version.V3_5,
|
||||
b: &version.V3_6,
|
||||
expect: &version.V3_6,
|
||||
},
|
||||
}
|
||||
for _, tc := range tcs {
|
||||
|
@ -22,6 +22,7 @@ import (
|
||||
|
||||
"github.com/coreos/go-semver/semver"
|
||||
"github.com/stretchr/testify/assert"
|
||||
"go.etcd.io/etcd/api/v3/version"
|
||||
"go.etcd.io/etcd/client/pkg/v3/fileutil"
|
||||
"go.etcd.io/etcd/server/v3/storage/backend"
|
||||
"go.etcd.io/etcd/server/v3/storage/schema"
|
||||
@ -45,25 +46,25 @@ func TestEtctlutlMigrate(t *testing.T) {
|
||||
name: "Invalid target version string",
|
||||
targetVersion: "abc",
|
||||
expectLogsSubString: `Error: wrong target version format, expected "X.Y", got "abc"`,
|
||||
expectStorageVersion: &schema.V3_6,
|
||||
expectStorageVersion: &version.V3_6,
|
||||
},
|
||||
{
|
||||
name: "Invalid target version",
|
||||
targetVersion: "3.a",
|
||||
expectLogsSubString: `Error: failed to parse target version: strconv.ParseInt: parsing "a": invalid syntax`,
|
||||
expectStorageVersion: &schema.V3_6,
|
||||
expectStorageVersion: &version.V3_6,
|
||||
},
|
||||
{
|
||||
name: "Target with only major version is invalid",
|
||||
targetVersion: "3",
|
||||
expectLogsSubString: `Error: wrong target version format, expected "X.Y", got "3"`,
|
||||
expectStorageVersion: &schema.V3_6,
|
||||
expectStorageVersion: &version.V3_6,
|
||||
},
|
||||
{
|
||||
name: "Target with patch version is invalid",
|
||||
targetVersion: "3.6.0",
|
||||
expectLogsSubString: `Error: wrong target version format, expected "X.Y", got "3.6.0"`,
|
||||
expectStorageVersion: &schema.V3_6,
|
||||
expectStorageVersion: &version.V3_6,
|
||||
},
|
||||
{
|
||||
name: "Migrate v3.5 to v3.5 is no-op",
|
||||
@ -75,19 +76,19 @@ func TestEtctlutlMigrate(t *testing.T) {
|
||||
name: "Upgrade v3.5 to v3.6 should work",
|
||||
binary: lastReleaseBinary,
|
||||
targetVersion: "3.6",
|
||||
expectStorageVersion: &schema.V3_6,
|
||||
expectStorageVersion: &version.V3_6,
|
||||
},
|
||||
{
|
||||
name: "Migrate v3.6 to v3.6 is no-op",
|
||||
targetVersion: "3.6",
|
||||
expectLogsSubString: "storage version up-to-date\t" + `{"storage-version": "3.6"}`,
|
||||
expectStorageVersion: &schema.V3_6,
|
||||
expectStorageVersion: &version.V3_6,
|
||||
},
|
||||
{
|
||||
name: "Downgrade v3.6 to v3.5 should fail until it's implemented",
|
||||
targetVersion: "3.5",
|
||||
expectLogsSubString: "cannot downgrade storage, WAL contains newer entries",
|
||||
expectStorageVersion: &schema.V3_6,
|
||||
expectStorageVersion: &version.V3_6,
|
||||
},
|
||||
{
|
||||
name: "Downgrade v3.6 to v3.5 with force should work",
|
||||
|
Loading…
x
Reference in New Issue
Block a user