Skip to content

Commit 1153173

Browse files
committed
Fix(migrate): fix migrate
Signed-off-by: caoxianfei1 <[email protected]>
1 parent 9d83a9c commit 1153173

14 files changed

+751
-47
lines changed

cli/command/deploy.go

+1-3
Original file line numberDiff line numberDiff line change
@@ -231,7 +231,6 @@ func genDeployPlaybook(curveadm *cli.CurveAdm,
231231
Name: options.poolset,
232232
Type: options.poolsetDiskType,
233233
}
234-
diskType := options.poolsetDiskType
235234

236235
pb := playbook.NewPlaybook(curveadm)
237236
for _, step := range steps {
@@ -255,8 +254,7 @@ func genDeployPlaybook(curveadm *cli.CurveAdm,
255254
options[comm.KEY_NUMBER_OF_CHUNKSERVER] = calcNumOfChunkserver(curveadm, dcs)
256255
} else if step == CREATE_LOGICAL_POOL {
257256
options[comm.KEY_CREATE_POOL_TYPE] = comm.POOL_TYPE_LOGICAL
258-
options[comm.POOLSET] = poolset
259-
options[comm.POOLSET_DISK_TYPE] = diskType
257+
options[comm.KEY_POOLSET] = poolset
260258
options[comm.KEY_NUMBER_OF_CHUNKSERVER] = calcNumOfChunkserver(curveadm, dcs)
261259
}
262260

cli/command/migrate.go

+87-21
Original file line numberDiff line numberDiff line change
@@ -23,14 +23,19 @@
2323
package command
2424

2525
import (
26+
"fmt"
27+
2628
"github.com/fatih/color"
2729
"github.com/opencurve/curveadm/cli/cli"
2830
comm "github.com/opencurve/curveadm/internal/common"
2931
"github.com/opencurve/curveadm/internal/configure"
3032
"github.com/opencurve/curveadm/internal/configure/topology"
3133
"github.com/opencurve/curveadm/internal/errno"
3234
"github.com/opencurve/curveadm/internal/playbook"
33-
tui "github.com/opencurve/curveadm/internal/tui/common"
35+
"github.com/opencurve/curveadm/internal/task/task/common"
36+
tui "github.com/opencurve/curveadm/internal/tui"
37+
tuicomm "github.com/opencurve/curveadm/internal/tui/common"
38+
3439
cliutil "github.com/opencurve/curveadm/internal/utils"
3540
"github.com/spf13/cobra"
3641
)
@@ -71,14 +76,12 @@ var (
7176
// chunkserevr (curvebs)
7277
MIGRATE_CHUNKSERVER_STEPS = []int{
7378
playbook.BACKUP_ETCD_DATA,
74-
playbook.STOP_SERVICE,
75-
playbook.CLEAN_SERVICE, // only container
79+
playbook.CREATE_PHYSICAL_POOL, // add machine that migrate to
7680
playbook.PULL_IMAGE,
7781
playbook.CREATE_CONTAINER,
7882
playbook.SYNC_CONFIG,
79-
playbook.CREATE_PHYSICAL_POOL,
8083
playbook.START_CHUNKSERVER,
81-
playbook.CREATE_LOGICAL_POOL,
84+
playbook.MARK_CHUNKSERVER_PENGDDING,
8285
}
8386

8487
// metaserver (curvefs)
@@ -100,12 +103,23 @@ var (
100103
topology.ROLE_SNAPSHOTCLONE: MIGRATE_SNAPSHOTCLONE_STEPS,
101104
topology.ROLE_METASERVER: MIGRATE_METASERVER_STEPS,
102105
}
106+
GET_MIGRATE_STATUS = []int{
107+
playbook.GET_MIGRATE_STATUS,
108+
}
109+
MIGRATE_POST_CLEAN_STEPS = []int{
110+
playbook.STOP_SERVICE,
111+
playbook.CLEAN_SERVICE, // only container
112+
playbook.CREATE_PHYSICAL_POOL, // remove machine that migrate from
113+
playbook.UPDATE_TOPOLOGY,
114+
}
103115
)
104116

105117
type migrateOptions struct {
106118
filename string
107119
poolset string
108120
poolsetDiskType string
121+
showStatus bool
122+
clean bool
109123
}
110124

111125
func NewMigrateCommand(curveadm *cli.CurveAdm) *cobra.Command {
@@ -125,7 +139,8 @@ func NewMigrateCommand(curveadm *cli.CurveAdm) *cobra.Command {
125139
flags := cmd.Flags()
126140
flags.StringVar(&options.poolset, "poolset", "default", "Specify the poolset")
127141
flags.StringVar(&options.poolsetDiskType, "poolset-disktype", "ssd", "Specify the disk type of physical pool")
128-
142+
flags.BoolVar(&options.showStatus, "status", false, "show copyset transferring status")
143+
flags.BoolVar(&options.clean, "clean", false, "show copyset transferring status")
129144
return cmd
130145
}
131146

@@ -189,10 +204,21 @@ func genMigratePlaybook(curveadm *cli.CurveAdm,
189204
dcs2add := diffs[topology.DIFF_ADD]
190205
dcs2del := diffs[topology.DIFF_DELETE]
191206
migrates := getMigrates(curveadm, data)
207+
if len(migrates) <= 0 {
208+
return nil, fmt.Errorf("no service will be migrated")
209+
}
192210
role := migrates[0].From.GetRole()
193211
steps := MIGRATE_ROLE_STEPS[role]
194-
poolset := options.poolset
195-
poolsetDiskType := options.poolsetDiskType
212+
if options.showStatus {
213+
steps = GET_MIGRATE_STATUS
214+
}
215+
if options.clean {
216+
steps = MIGRATE_POST_CLEAN_STEPS
217+
}
218+
poolset := configure.Poolset{
219+
Name: options.poolset,
220+
Type: options.poolsetDiskType,
221+
}
196222

197223
pb := playbook.NewPlaybook(curveadm)
198224
for _, step := range steps {
@@ -204,8 +230,11 @@ func genMigratePlaybook(curveadm *cli.CurveAdm,
204230
config = dcs2del
205231
case playbook.BACKUP_ETCD_DATA:
206232
config = curveadm.FilterDeployConfigByRole(dcs, topology.ROLE_ETCD)
207-
case CREATE_PHYSICAL_POOL,
208-
CREATE_LOGICAL_POOL:
233+
case
234+
playbook.CREATE_PHYSICAL_POOL,
235+
playbook.CREATE_LOGICAL_POOL,
236+
playbook.MARK_CHUNKSERVER_PENGDDING,
237+
playbook.GET_MIGRATE_STATUS:
209238
config = curveadm.FilterDeployConfigByRole(dcs, topology.ROLE_MDS)[:1]
210239
}
211240

@@ -215,19 +244,20 @@ func genMigratePlaybook(curveadm *cli.CurveAdm,
215244
case playbook.CLEAN_SERVICE:
216245
options[comm.KEY_CLEAN_ITEMS] = []string{comm.CLEAN_ITEM_CONTAINER}
217246
options[comm.KEY_CLEAN_BY_RECYCLE] = true
247+
options[comm.KEY_REMOVE_MIGRATED_SERVER] = true
218248
case playbook.CREATE_PHYSICAL_POOL:
219249
options[comm.KEY_CREATE_POOL_TYPE] = comm.POOL_TYPE_PHYSICAL
220250
options[comm.KEY_MIGRATE_SERVERS] = migrates
221-
options[comm.POOLSET] = poolset
222-
options[comm.POOLSET_DISK_TYPE] = poolsetDiskType
251+
options[comm.KEY_POOLSET] = poolset
223252
case playbook.CREATE_LOGICAL_POOL:
224253
options[comm.KEY_CREATE_POOL_TYPE] = comm.POOL_TYPE_LOGICAL
225254
options[comm.KEY_MIGRATE_SERVERS] = migrates
226255
options[comm.KEY_NEW_TOPOLOGY_DATA] = data
227-
options[comm.POOLSET] = poolset
228-
options[comm.POOLSET_DISK_TYPE] = poolsetDiskType
256+
options[comm.KEY_POOLSET] = poolset
229257
case playbook.UPDATE_TOPOLOGY:
230258
options[comm.KEY_NEW_TOPOLOGY_DATA] = data
259+
case playbook.GET_MIGRATE_STATUS:
260+
options[comm.KEY_MIGRATE_SERVERS] = migrates
231261
}
232262

233263
pb.AddStep(&playbook.PlaybookStep{
@@ -252,6 +282,36 @@ func displayMigrateTitle(curveadm *cli.CurveAdm, data string) {
252282
curveadm.WriteOutln(color.YellowString(" - Migrate host: from %s to %s", from.GetHost(), to.GetHost()))
253283
}
254284

285+
func displayMigrateStatus(curveadm *cli.CurveAdm, role string) {
286+
var output string
287+
if role == topology.ROLE_CHUNKSERVER {
288+
statuses := []common.MigrateStatus{}
289+
v := curveadm.MemStorage().Get(comm.KEY_MIGRATE_STATUS)
290+
if v != nil {
291+
m := v.(map[string]common.MigrateStatus)
292+
for _, status := range m {
293+
statuses = append(statuses, status)
294+
}
295+
}
296+
297+
output = tui.FormatMigrateStatus(statuses)
298+
} else {
299+
statuses := []common.MigrateCommonStatus{}
300+
v := curveadm.MemStorage().Get(comm.KEY_MIGRATE_COMMON_STATUS)
301+
if v != nil {
302+
m := v.(map[string]common.MigrateCommonStatus)
303+
for _, status := range m {
304+
statuses = append(statuses, status)
305+
}
306+
}
307+
308+
output = tui.FormatMigrateCommonStatus(statuses)
309+
}
310+
311+
curveadm.WriteOutln("")
312+
curveadm.WriteOut("%s", output)
313+
}
314+
255315
func runMigrate(curveadm *cli.CurveAdm, options migrateOptions) error {
256316
// TODO(P0): added prechek for target host
257317
// 1) parse cluster topology
@@ -261,7 +321,7 @@ func runMigrate(curveadm *cli.CurveAdm, options migrateOptions) error {
261321
}
262322

263323
// 2) read topology from file
264-
data, err := readTopology(curveadm, options.filename)
324+
data, err := readTopology(curveadm, options.filename, options.showStatus)
265325
if err != nil {
266326
return err
267327
}
@@ -272,13 +332,15 @@ func runMigrate(curveadm *cli.CurveAdm, options migrateOptions) error {
272332
return err
273333
}
274334

275-
// 4) display title
276-
displayMigrateTitle(curveadm, data)
335+
if !options.showStatus {
336+
// 4) display title
337+
displayMigrateTitle(curveadm, data)
277338

278-
// 5) confirm by user
279-
if pass := tui.ConfirmYes(tui.DEFAULT_CONFIRM_PROMPT); !pass {
280-
curveadm.WriteOutln(tui.PromptCancelOpetation("migrate service"))
281-
return errno.ERR_CANCEL_OPERATION
339+
// 5) confirm by user
340+
if pass := tuicomm.ConfirmYes(tuicomm.DEFAULT_CONFIRM_PROMPT); !pass {
341+
curveadm.WriteOutln(tuicomm.PromptCancelOpetation("migrate service"))
342+
return errno.ERR_CANCEL_OPERATION
343+
}
282344
}
283345

284346
// 6) generate migrate playbook
@@ -294,6 +356,10 @@ func runMigrate(curveadm *cli.CurveAdm, options migrateOptions) error {
294356
}
295357

296358
// 9) print success prompt
359+
if options.showStatus {
360+
displayMigrateStatus(curveadm, getMigrates(curveadm, data)[0].From.GetRole())
361+
return nil
362+
}
297363
curveadm.WriteOutln("")
298364
curveadm.WriteOutln(color.GreenString("Services successfully migrateed ^_^."))
299365
// TODO(P1): warning iff there is changed configs

cli/command/scale_out.go

+5-3
Original file line numberDiff line numberDiff line change
@@ -144,7 +144,7 @@ func NewScaleOutCommand(curveadm *cli.CurveAdm) *cobra.Command {
144144
return cmd
145145
}
146146

147-
func readTopology(curveadm *cli.CurveAdm, filename string) (string, error) {
147+
func readTopology(curveadm *cli.CurveAdm, filename string, showStatus bool) (string, error) {
148148
if !utils.PathExist(filename) {
149149
return "", errno.ERR_TOPOLOGY_FILE_NOT_FOUND.
150150
F("%s: no such file", utils.AbsPath(filename))
@@ -156,7 +156,9 @@ func readTopology(curveadm *cli.CurveAdm, filename string) (string, error) {
156156
}
157157

158158
oldData := curveadm.ClusterTopologyData()
159-
curveadm.WriteOut("%s", utils.Diff(oldData, data))
159+
if !showStatus {
160+
curveadm.WriteOut("%s", utils.Diff(oldData, data))
161+
}
160162
return data, nil
161163
}
162164

@@ -384,7 +386,7 @@ func runScaleOut(curveadm *cli.CurveAdm, options scaleOutOptions) error {
384386
}
385387

386388
// 2) read topology from file
387-
data, err := readTopology(curveadm, options.filename)
389+
data, err := readTopology(curveadm, options.filename, false)
388390
if err != nil {
389391
return err
390392
}

internal/common/common.go

+11-6
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,10 @@ const (
5353
// format
5454
KEY_ALL_FORMAT_STATUS = "ALL_FORMAT_STATUS"
5555

56+
// migrate
57+
KEY_MIGRATE_STATUS = "MIGRATE_STATUS"
58+
KEY_MIGRATE_COMMON_STATUS = "MIGRATE_COMMON_STATUS"
59+
5660
// check
5761
KEY_CHECK_WITH_WEAK = "CHECK_WITH_WEAK"
5862
KEY_CHECK_KERNEL_MODULE_NAME = "CHECK_KERNEL_MODULE_NAME"
@@ -71,12 +75,13 @@ const (
7175
SERVICE_STATUS_UNKNOWN = "Unknown"
7276

7377
// clean
74-
KEY_CLEAN_ITEMS = "CLEAN_ITEMS"
75-
KEY_CLEAN_BY_RECYCLE = "CLEAN_BY_RECYCLE"
76-
CLEAN_ITEM_LOG = "log"
77-
CLEAN_ITEM_DATA = "data"
78-
CLEAN_ITEM_CONTAINER = "container"
79-
CLEANED_CONTAINER_ID = "-"
78+
KEY_CLEAN_ITEMS = "CLEAN_ITEMS"
79+
KEY_CLEAN_BY_RECYCLE = "CLEAN_BY_RECYCLE"
80+
CLEAN_ITEM_LOG = "log"
81+
CLEAN_ITEM_DATA = "data"
82+
CLEAN_ITEM_CONTAINER = "container"
83+
CLEANED_CONTAINER_ID = "-"
84+
KEY_REMOVE_MIGRATED_SERVER = "REMOVE_MIGRATED_SERVER"
8085

8186
// client
8287
KEY_CLIENT_HOST = "CLIENT_HOST"

internal/configure/pool.go

+37-12
Original file line numberDiff line numberDiff line change
@@ -263,26 +263,51 @@ func ScaleOutClusterPool(old *CurveClusterTopo, dcs []*topology.DeployConfig, po
263263
old.NPools = old.NPools + 1
264264
}
265265

266-
func MigrateClusterServer(old *CurveClusterTopo, migrates []*MigrateServer) {
266+
func MigrateClusterServer(old *CurveClusterTopo, migrates []*MigrateServer, removeMigratedServer bool) {
267267
m := map[string]*topology.DeployConfig{} // key: from.Name, value: to.DeployConfig
268+
// 此时m里面保存的就是所有的要迁移的server,比如migrate.From是curve16, migrate.To是curve21
268269
for _, migrate := range migrates {
269270
m[formatName(migrate.From)] = migrate.To
270271
}
271272

272-
for i, server := range old.Servers {
273-
dc, ok := m[server.Name]
274-
if !ok {
275-
continue
273+
// server.InternalIp = dc.GetListenIp()
274+
// server.ExternalIp = dc.GetListenExternalIp()
275+
// server.Name = formatName(dc)
276+
// if server.InternalPort != 0 && server.ExternalPort != 0 {
277+
// server.InternalPort = dc.GetListenPort()
278+
// server.ExternalPort = dc.GetListenExternalPort()
279+
// }
280+
// old.Servers[i] = server
281+
// }
282+
283+
// add server that will migrate to
284+
if !removeMigratedServer {
285+
for fromName, toDc := range m {
286+
server := Server{}
287+
server.InternalIp = toDc.GetListenIp()
288+
server.ExternalIp = toDc.GetListenExternalIp()
289+
server.InternalPort = toDc.GetListenPort()
290+
server.ExternalPort = toDc.GetListenExternalPort()
291+
server.Name = formatName(toDc)
292+
293+
for _, oldServer := range old.Servers {
294+
if oldServer.Name == fromName {
295+
server.PhysicalPool = oldServer.PhysicalPool
296+
server.Poolset = oldServer.Poolset
297+
server.Zone = oldServer.Zone
298+
}
299+
}
300+
old.Servers = append(old.Servers, server)
276301
}
302+
return
303+
}
277304

278-
server.InternalIp = dc.GetListenIp()
279-
server.ExternalIp = dc.GetListenExternalIp()
280-
server.Name = formatName(dc)
281-
if server.InternalPort != 0 && server.ExternalPort != 0 {
282-
server.InternalPort = dc.GetListenPort()
283-
server.ExternalPort = dc.GetListenExternalPort()
305+
// remove server that has migrated
306+
for i := 0; i < len(old.Servers); i++ {
307+
_, ok := m[old.Servers[i].Name]
308+
if ok {
309+
old.Servers = append(old.Servers[:i], old.Servers[i+1:]...)
284310
}
285-
old.Servers[i] = server
286311
}
287312
}
288313

internal/errno/errno.go

+5-1
Original file line numberDiff line numberDiff line change
@@ -398,7 +398,11 @@ var (
398398
ERR_ENCRYPT_FILE_FAILED = EC(410021, "encrypt file failed")
399399
ERR_CLIENT_ID_NOT_FOUND = EC(410022, "client id not found")
400400
ERR_ENABLE_ETCD_AUTH_FAILED = EC(410023, "enable etcd auth failed")
401-
401+
ERR_MARK_CHUNKSERVER_PENDDING = EC(410024, "mark chunkserver pendding status failed when migrate")
402+
RRR_GET_CLUSTER_MDSADDR = EC(410025, "failed to get cluster mds addr")
403+
ERR_GET_CHUNKSERVER_COPYSET = EC(410026, "failed to get chunkserver copyset")
404+
ERR_GET_MIGRATE_COPYSET = EC(410027, "migrate chunkserver copyset info must be 2")
405+
ERR_CONTAINER_NOT_REMOVED = EC(410027, "container not removed")
402406
// 420: common (curvebs client)
403407
ERR_VOLUME_ALREADY_MAPPED = EC(420000, "volume already mapped")
404408
ERR_VOLUME_CONTAINER_LOSED = EC(420001, "volume container is losed")

0 commit comments

Comments
 (0)