diff --git a/pkg/cluster/manager/scale_out.go b/pkg/cluster/manager/scale_out.go index 8a7b5ed467..43c6a0ae45 100644 --- a/pkg/cluster/manager/scale_out.go +++ b/pkg/cluster/manager/scale_out.go @@ -175,12 +175,6 @@ func (m *Manager) ScaleOut( } } } - - // newPart needs ComponentVersions but the original ComponentVersions is not passed to newPart. - // Copy the merged ComponentVersions to newPart. - if newSpec, ok := newPart.(*spec.Specification); ok { - newSpec.ComponentVersions = topo.ComponentVersions - } } if err := checkConflict(m, name, mergedTopo); err != nil { diff --git a/pkg/cluster/spec/parse_topology_test.go b/pkg/cluster/spec/parse_topology_test.go index 51d0adfb74..4b544da329 100644 --- a/pkg/cluster/spec/parse_topology_test.go +++ b/pkg/cluster/spec/parse_topology_test.go @@ -540,6 +540,37 @@ tiflash_servers: }) } +func (s *topoSuite) TestMergeComponentVersions(c *check.C) { + // test component version overwrite + with2TempFile(` +component_versions: + tidb: v8.0.0 + tikv: v8.0.0 +tidb_servers: + - host: 172.16.5.139 +`, ` +component_versions: + tikv: v8.1.0 + pd: v8.0.0 +tidb_servers: + - host: 172.16.5.134 +`, func(base, scale string) { + baseTopo := Specification{} + c.Assert(ParseTopologyYaml(base, &baseTopo), check.IsNil) + + scaleTopo := baseTopo.NewPart() + c.Assert(ParseTopologyYaml(scale, scaleTopo), check.IsNil) + + mergedTopo := baseTopo.MergeTopo(scaleTopo) + c.Assert(mergedTopo.Validate(), check.IsNil) + + c.Assert(scaleTopo.(*Specification).ComponentVersions, check.Equals, mergedTopo.(*Specification).ComponentVersions) + c.Assert(scaleTopo.(*Specification).ComponentVersions.TiDB, check.Equals, "v8.0.0") + c.Assert(scaleTopo.(*Specification).ComponentVersions.TiKV, check.Equals, "v8.1.0") + c.Assert(scaleTopo.(*Specification).ComponentVersions.PD, check.Equals, "v8.0.0") + }) +} + func (s *topoSuite) TestFixRelativePath(c *check.C) { // base test topo := Specification{ diff --git a/pkg/cluster/spec/spec.go b/pkg/cluster/spec/spec.go index 99bd0e87dd..f00ae02db3 100644 --- a/pkg/cluster/spec/spec.go +++ b/pkg/cluster/spec/spec.go @@ -270,9 +270,10 @@ type UpgradableMetadata interface { // NewPart implements ScaleOutTopology interface. func (s *Specification) NewPart() Topology { return &Specification{ - GlobalOptions: s.GlobalOptions, - MonitoredOptions: s.MonitoredOptions, - ServerConfigs: s.ServerConfigs, + GlobalOptions: s.GlobalOptions, + MonitoredOptions: s.MonitoredOptions, + ServerConfigs: s.ServerConfigs, + ComponentVersions: s.ComponentVersions, } }