Skip to content

Commit 57e845b

Browse files
GMHDBJDsiddontang
andauthored
playground: add dm support for playground (#2465)
* add dm support for playground Signed-off-by: Siddon Tang <siddontang@gmail.com> * support command-line args, scale in, alive check * fix exported * fix cognitive-complexity * fix name * fix command-line args * remove debug comment --------- Signed-off-by: Siddon Tang <siddontang@gmail.com> Co-authored-by: Siddon Tang <siddontang@gmail.com>
1 parent 964b40b commit 57e845b

File tree

5 files changed

+364
-5
lines changed

5 files changed

+364
-5
lines changed

components/playground/command.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,8 @@ func buildCommands(tp CommandType, opt *BootOptions) (cmds []Command) {
6161
{"ticdc", opt.TiCDC},
6262
{"tikv-cdc", opt.TiKVCDC},
6363
{"drainer", opt.Drainer},
64+
{"dm-master", opt.DMMaster},
65+
{"dm-worker", opt.DMWorker},
6466
}
6567

6668
for _, cmd := range commands {
@@ -113,6 +115,8 @@ func newScaleOut() *cobra.Command {
113115
cmd.Flags().StringVarP(&opt.TSO.Host, "tso.host", "", opt.TSO.Host, "Playground TSO host. If not provided, TSO will still use `host` flag as its host")
114116
cmd.Flags().StringVarP(&opt.Scheduling.Host, "scheduling.host", "", opt.Scheduling.Host, "Playground Scheduling host. If not provided, Scheduling will still use `host` flag as its host")
115117
cmd.Flags().StringVarP(&opt.TiProxy.Host, "tiproxy.host", "", opt.PD.Host, "Playground TiProxy host. If not provided, TiProxy will still use `host` flag as its host")
118+
cmd.Flags().IntVarP(&opt.DMMaster.Num, "dm-master", "", opt.DMMaster.Num, "DM-master instance number")
119+
cmd.Flags().IntVarP(&opt.DMWorker.Num, "dm-worker", "", opt.DMWorker.Num, "DM-worker instance number")
116120

117121
cmd.Flags().StringVarP(&opt.TiDB.ConfigPath, "db.config", "", opt.TiDB.ConfigPath, "TiDB instance configuration file")
118122
cmd.Flags().StringVarP(&opt.TiKV.ConfigPath, "kv.config", "", opt.TiKV.ConfigPath, "TiKV instance configuration file")
@@ -123,6 +127,8 @@ func newScaleOut() *cobra.Command {
123127
cmd.Flags().StringVarP(&opt.TiProxy.ConfigPath, "tiproxy.config", "", opt.TiProxy.ConfigPath, "TiProxy instance configuration file")
124128
cmd.Flags().StringVarP(&opt.Pump.ConfigPath, "pump.config", "", opt.Pump.ConfigPath, "Pump instance configuration file")
125129
cmd.Flags().StringVarP(&opt.Drainer.ConfigPath, "drainer.config", "", opt.Drainer.ConfigPath, "Drainer instance configuration file")
130+
cmd.Flags().StringVarP(&opt.DMMaster.ConfigPath, "dm-master.config", "", opt.DMMaster.ConfigPath, "DM-master instance configuration file")
131+
cmd.Flags().StringVarP(&opt.DMWorker.ConfigPath, "dm-worker.config", "", opt.DMWorker.ConfigPath, "DM-worker instance configuration file")
126132

127133
cmd.Flags().StringVarP(&opt.TiDB.BinPath, "db.binpath", "", opt.TiDB.BinPath, "TiDB instance binary path")
128134
cmd.Flags().StringVarP(&opt.TiKV.BinPath, "kv.binpath", "", opt.TiKV.BinPath, "TiKV instance binary path")
@@ -135,6 +141,8 @@ func newScaleOut() *cobra.Command {
135141
cmd.Flags().StringVarP(&opt.TiKVCDC.BinPath, "kvcdc.binpath", "", opt.TiKVCDC.BinPath, "TiKVCDC instance binary path")
136142
cmd.Flags().StringVarP(&opt.Pump.BinPath, "pump.binpath", "", opt.Pump.BinPath, "Pump instance binary path")
137143
cmd.Flags().StringVarP(&opt.Drainer.BinPath, "drainer.binpath", "", opt.Drainer.BinPath, "Drainer instance binary path")
144+
cmd.Flags().StringVarP(&opt.DMMaster.BinPath, "dm-master.binpath", "", opt.DMMaster.BinPath, "DM-master instance binary path")
145+
cmd.Flags().StringVarP(&opt.DMWorker.BinPath, "dm-worker.binpath", "", opt.DMWorker.BinPath, "DM-worker instance binary path")
138146

139147
return cmd
140148
}
Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
package instance
2+
3+
import (
4+
"context"
5+
"fmt"
6+
"path/filepath"
7+
"strings"
8+
9+
"github.com/pingcap/tiup/pkg/utils"
10+
)
11+
12+
// DMMaster represent a DM master instance.
13+
type DMMaster struct {
14+
instance
15+
Process
16+
initEndpoints []*DMMaster
17+
}
18+
19+
var _ Instance = &DMMaster{}
20+
21+
// NewDMMaster create a new DMMaster instance.
22+
func NewDMMaster(binPath string, dir, host, configPath string, portOffset int, id int, port int) *DMMaster {
23+
if port <= 0 {
24+
port = 8261
25+
}
26+
return &DMMaster{
27+
instance: instance{
28+
BinPath: binPath,
29+
ID: id,
30+
Dir: dir,
31+
Host: host,
32+
Port: utils.MustGetFreePort(host, 8291, portOffset),
33+
// Similar like PD's client port, here use StatusPort for Master Port.
34+
StatusPort: utils.MustGetFreePort(host, port, portOffset),
35+
ConfigPath: configPath,
36+
},
37+
}
38+
}
39+
40+
// Name return the name of the instance.
41+
func (m *DMMaster) Name() string {
42+
return fmt.Sprintf("dm-master-%d", m.ID)
43+
}
44+
45+
// Start starts the instance.
46+
func (m *DMMaster) Start(ctx context.Context) error {
47+
args := []string{
48+
fmt.Sprintf("--name=%s", m.Name()),
49+
fmt.Sprintf("--master-addr=http://%s", utils.JoinHostPort(m.Host, m.StatusPort)),
50+
fmt.Sprintf("--advertise-addr=http://%s", utils.JoinHostPort(AdvertiseHost(m.Host), m.StatusPort)),
51+
fmt.Sprintf("--peer-urls=http://%s", utils.JoinHostPort(m.Host, m.Port)),
52+
fmt.Sprintf("--advertise-peer-urls=http://%s", utils.JoinHostPort(AdvertiseHost(m.Host), m.Port)),
53+
fmt.Sprintf("--log-file=%s", m.LogFile()),
54+
}
55+
56+
endpoints := make([]string, 0)
57+
for _, master := range m.initEndpoints {
58+
endpoints = append(endpoints, fmt.Sprintf("%s=http://%s", master.Name(), utils.JoinHostPort(master.Host, master.Port)))
59+
}
60+
args = append(args, fmt.Sprintf("--initial-cluster=%s", strings.Join(endpoints, ",")))
61+
62+
if m.ConfigPath != "" {
63+
args = append(args, fmt.Sprintf("--config=%s", m.ConfigPath))
64+
}
65+
66+
m.Process = &process{cmd: PrepareCommand(ctx, m.BinPath, args, nil, m.Dir)}
67+
68+
logIfErr(m.Process.SetOutputFile(m.LogFile()))
69+
return m.Process.Start()
70+
}
71+
72+
// SetInitEndpoints set the initial endpoints for the DM master.
73+
func (m *DMMaster) SetInitEndpoints(endpoints []*DMMaster) {
74+
m.initEndpoints = endpoints
75+
}
76+
77+
// Component return the component of the instance.
78+
func (m *DMMaster) Component() string {
79+
return "dm-master"
80+
}
81+
82+
// LogFile return the log file path of the instance.
83+
func (m *DMMaster) LogFile() string {
84+
return filepath.Join(m.Dir, "dm-master.log")
85+
}
86+
87+
// Addr return the address of the instance.
88+
func (m *DMMaster) Addr() string {
89+
return utils.JoinHostPort(m.Host, m.StatusPort)
90+
}
Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
package instance
2+
3+
import (
4+
"context"
5+
"fmt"
6+
"path/filepath"
7+
"strings"
8+
9+
"github.com/pingcap/tiup/pkg/utils"
10+
)
11+
12+
// DMWorker represent a DM worker instance.
13+
type DMWorker struct {
14+
instance
15+
Process
16+
17+
masters []*DMMaster
18+
}
19+
20+
var _ Instance = &DMWorker{}
21+
22+
// NewDMWorker create a DMWorker instance.
23+
func NewDMWorker(binPath string, dir, host, configPath string, portOffset int, id int, port int, masters []*DMMaster) *DMWorker {
24+
if port <= 0 {
25+
port = 8262
26+
}
27+
return &DMWorker{
28+
instance: instance{
29+
BinPath: binPath,
30+
ID: id,
31+
Dir: dir,
32+
Host: host,
33+
Port: utils.MustGetFreePort(host, port, portOffset),
34+
ConfigPath: configPath,
35+
},
36+
masters: masters,
37+
}
38+
}
39+
40+
// MasterAddrs return the master addresses.
41+
func (w *DMWorker) MasterAddrs() []string {
42+
var addrs []string
43+
for _, master := range w.masters {
44+
addrs = append(addrs, utils.JoinHostPort(AdvertiseHost(master.Host), master.StatusPort))
45+
}
46+
return addrs
47+
}
48+
49+
// Name return the name of the instance.
50+
func (w *DMWorker) Name() string {
51+
return fmt.Sprintf("dm-worker-%d", w.ID)
52+
}
53+
54+
// Start starts the instance.
55+
func (w *DMWorker) Start(ctx context.Context) error {
56+
args := []string{
57+
fmt.Sprintf("--name=%s", w.Name()),
58+
fmt.Sprintf("--worker-addr=%s", utils.JoinHostPort(w.Host, w.Port)),
59+
fmt.Sprintf("--advertise-addr=%s", utils.JoinHostPort(AdvertiseHost(w.Host), w.Port)),
60+
fmt.Sprintf("--join=%s", strings.Join(w.MasterAddrs(), ",")),
61+
fmt.Sprintf("--log-file=%s", w.LogFile()),
62+
}
63+
64+
if w.ConfigPath != "" {
65+
args = append(args, fmt.Sprintf("--config=%s", w.ConfigPath))
66+
}
67+
68+
w.Process = &process{cmd: PrepareCommand(ctx, w.BinPath, args, nil, w.Dir)}
69+
70+
logIfErr(w.Process.SetOutputFile(w.LogFile()))
71+
72+
return w.Process.Start()
73+
}
74+
75+
// Component return the component of the instance.
76+
func (w *DMWorker) Component() string {
77+
return "dm-worker"
78+
}
79+
80+
// LogFile return the log file of the instance.
81+
func (w *DMWorker) LogFile() string {
82+
return filepath.Join(w.Dir, "dm-worker.log")
83+
}

components/playground/main.go

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,8 @@ type BootOptions struct {
7676
CSEOpts instance.CSEOptions `yaml:"cse"` // Only available when mode == tidb-cse
7777
GrafanaPort int `yaml:"grafana_port"`
7878
PortOffset int `yaml:"port_offset"`
79+
DMMaster instance.Config `yaml:"dm_master"`
80+
DMWorker instance.Config `yaml:"dm_worker"`
7981
}
8082

8183
var (
@@ -298,6 +300,8 @@ Note: Version constraint [bold]%s[reset] is resolved to [green][bold]%s[reset].
298300
rootCmd.Flags().IntVar(&options.TiKVCDC.Num, "kvcdc", 0, "TiKV-CDC instance number")
299301
rootCmd.Flags().IntVar(&options.Pump.Num, "pump", 0, "Pump instance number")
300302
rootCmd.Flags().IntVar(&options.Drainer.Num, "drainer", 0, "Drainer instance number")
303+
rootCmd.Flags().IntVar(&options.DMMaster.Num, "dm-master", 0, "DM-master instance number")
304+
rootCmd.Flags().IntVar(&options.DMWorker.Num, "dm-worker", 0, "DM-worker instance number")
301305

302306
rootCmd.Flags().IntVar(&options.TiDB.UpTimeout, "db.timeout", 60, "TiDB max wait time in seconds for starting, 0 means no limit")
303307
rootCmd.Flags().IntVar(&options.TiFlash.UpTimeout, "tiflash.timeout", 120, "TiFlash max wait time in seconds for starting, 0 means no limit")
@@ -314,6 +318,10 @@ Note: Version constraint [bold]%s[reset] is resolved to [green][bold]%s[reset].
314318
rootCmd.Flags().IntVar(&options.TiCDC.Port, "ticdc.port", 0, "Playground TiCDC port. If not provided, TiCDC will use 8300 as its port")
315319
rootCmd.Flags().StringVar(&options.TiProxy.Host, "tiproxy.host", "", "Playground TiProxy host. If not provided, TiProxy will still use `host` flag as its host")
316320
rootCmd.Flags().IntVar(&options.TiProxy.Port, "tiproxy.port", 0, "Playground TiProxy port. If not provided, TiProxy will use 6000 as its port")
321+
rootCmd.Flags().StringVar(&options.DMMaster.Host, "dm-master.host", "", "DM-master instance host")
322+
rootCmd.Flags().IntVar(&options.DMMaster.Port, "dm-master.port", 8261, "DM-master instance port")
323+
rootCmd.Flags().StringVar(&options.DMWorker.Host, "dm-worker.host", "", "DM-worker instance host")
324+
rootCmd.Flags().IntVar(&options.DMWorker.Port, "dm-worker.port", 8262, "DM-worker instance port")
317325

318326
rootCmd.Flags().StringVar(&options.TiDB.ConfigPath, "db.config", "", "TiDB instance configuration file")
319327
rootCmd.Flags().StringVar(&options.TiKV.ConfigPath, "kv.config", "", "TiKV instance configuration file")
@@ -328,6 +336,8 @@ Note: Version constraint [bold]%s[reset] is resolved to [green][bold]%s[reset].
328336
rootCmd.Flags().StringVar(&options.Drainer.ConfigPath, "drainer.config", "", "Drainer instance configuration file")
329337
rootCmd.Flags().StringVar(&options.TiCDC.ConfigPath, "ticdc.config", "", "TiCDC instance configuration file")
330338
rootCmd.Flags().StringVar(&options.TiKVCDC.ConfigPath, "kvcdc.config", "", "TiKV-CDC instance configuration file")
339+
rootCmd.Flags().StringVar(&options.DMMaster.ConfigPath, "dm-master.config", "", "DM-master instance configuration file")
340+
rootCmd.Flags().StringVar(&options.DMWorker.ConfigPath, "dm-worker.config", "", "DM-worker instance configuration file")
331341

332342
rootCmd.Flags().StringVar(&options.TiDB.BinPath, "db.binpath", "", "TiDB instance binary path")
333343
rootCmd.Flags().StringVar(&options.TiKV.BinPath, "kv.binpath", "", "TiKV instance binary path")
@@ -343,6 +353,8 @@ Note: Version constraint [bold]%s[reset] is resolved to [green][bold]%s[reset].
343353
rootCmd.Flags().StringVar(&options.TiKVCDC.BinPath, "kvcdc.binpath", "", "TiKV-CDC instance binary path")
344354
rootCmd.Flags().StringVar(&options.Pump.BinPath, "pump.binpath", "", "Pump instance binary path")
345355
rootCmd.Flags().StringVar(&options.Drainer.BinPath, "drainer.binpath", "", "Drainer instance binary path")
356+
rootCmd.Flags().StringVar(&options.DMMaster.BinPath, "dm-master.binpath", "", "DM-master instance binary path")
357+
rootCmd.Flags().StringVar(&options.DMWorker.BinPath, "dm-worker.binpath", "", "DM-worker instance binary path")
346358

347359
rootCmd.Flags().StringVar(&options.TiKVCDC.Version, "kvcdc.version", "", "TiKV-CDC instance version")
348360

@@ -466,6 +478,24 @@ func checkStoreStatus(pdClient *api.PDClient, storeAddr string, timeout int) boo
466478
}
467479
}
468480

481+
func checkDMMasterStatus(dmMasterClient *api.DMMasterClient, dmMasterAddr string, timeout int) bool {
482+
if timeout > 0 {
483+
for i := 0; i < timeout; i++ {
484+
if _, isActive, _, err := dmMasterClient.GetMaster(dmMasterAddr); err == nil && isActive {
485+
return true
486+
}
487+
time.Sleep(time.Second)
488+
}
489+
return false
490+
}
491+
for {
492+
if _, isActive, _, err := dmMasterClient.GetMaster(dmMasterAddr); err == nil && isActive {
493+
return true
494+
}
495+
time.Sleep(time.Second)
496+
}
497+
}
498+
469499
func hasDashboard(pdAddr string) bool {
470500
resp, err := http.Get(fmt.Sprintf("http://%s/dashboard", pdAddr))
471501
if err != nil {

0 commit comments

Comments
 (0)