99package v1
1010
1111import (
12+ "fmt"
1213 "net/http"
1314 "regexp"
1415 "strconv"
1516 "strings"
1617
18+ "plugins/shiftmanager"
1719 "proxy"
1820
1921 "github.com/ant0ine/go-json-rest/rest"
20- "github.com/radondb/shift/shift"
2122 shiftlog "github.com/radondb/shift/xlog"
2223 "github.com/xelabs/go-mysqlstack/xlog"
2324)
@@ -360,8 +361,6 @@ func globalsHandler(log *xlog.Log, proxy *proxy.Proxy, w rest.ResponseWriter, r
360361}
361362
362363type migrateParams struct {
363- ToFlavor string `json:"to-flavor"`
364-
365364 From string `json:"from"`
366365 FromUser string `json:"from-user"`
367366 FromPassword string `json:"from-password"`
@@ -388,7 +387,8 @@ type migrateParams struct {
388387// Returns:
389388// 1. Status:200
390389// 2. Status:204
391- // 3. Status:500
390+ // 3. Status:403
391+ // 4. Status:500
392392func ShardMigrateHandler (log * xlog.Log , proxy * proxy.Proxy ) rest.HandlerFunc {
393393 f := func (w rest.ResponseWriter , r * rest.Request ) {
394394 shardMigrateHandler (proxy , w , r )
@@ -397,9 +397,9 @@ func ShardMigrateHandler(log *xlog.Log, proxy *proxy.Proxy) rest.HandlerFunc {
397397}
398398
399399func shardMigrateHandler (proxy * proxy.Proxy , w rest.ResponseWriter , r * rest.Request ) {
400+ scatter := proxy .Scatter ()
400401 log := shiftlog .NewStdLog (shiftlog .Level (shiftlog .INFO ))
401402 p := & migrateParams {
402- ToFlavor : shift .ToMySQLFlavor ,
403403 RadonURL : "http://" + proxy .Config ().Proxy .PeerAddress ,
404404 Rebalance : false ,
405405 Cleanup : false ,
@@ -423,18 +423,30 @@ func shardMigrateHandler(proxy *proxy.Proxy, w rest.ResponseWriter, r *rest.Requ
423423 }
424424
425425 // check args.
426- if len (p .From ) == 0 || len ( p . FromUser ) == 0 || len (p .FromDatabase ) == 0 || len (p .FromTable ) == 0 ||
427- len (p .To ) == 0 || len ( p . ToUser ) == 0 || len (p .ToDatabase ) == 0 || len (p .ToTable ) == 0 {
426+ if len (p .FromUser ) == 0 || len (p .FromDatabase ) == 0 || len (p .FromTable ) == 0 ||
427+ len (p .ToUser ) == 0 || len (p .ToDatabase ) == 0 || len (p .ToTable ) == 0 {
428428 log .Error ("api.v1.shard.migrate[%+v].error:some param is empty" , p )
429429 rest .Error (w , "some args are empty" , http .StatusNoContent )
430430 return
431431 }
432- log .Warning (`
433- IMPORTANT: Please check that the shift run completes successfully.
434- At the end of a successful shift run prints "shift.completed.OK!".` )
435432
436- cfg := & shift.Config {
437- ToFlavor : p .ToFlavor ,
433+ // Check the backend name.
434+ var fromBackend , toBackend string
435+ backends := scatter .BackendConfigsClone ()
436+ for _ , backend := range backends {
437+ if backend .Address == p .From {
438+ fromBackend = backend .Name
439+ } else if backend .Address == p .To {
440+ toBackend = backend .Name
441+ }
442+ }
443+ if fromBackend == "" || toBackend == "" {
444+ log .Error ("api.v1.shard.migrate.fromBackend[%s].or.toBackend[%s].is.NULL" , fromBackend , toBackend )
445+ rest .Error (w , "api.v1.shard.migrate.backend.NULL" , http .StatusInternalServerError )
446+ return
447+ }
448+
449+ cfg := & shiftmanager.ShiftInfo {
438450 From : p .From ,
439451 FromUser : p .FromUser ,
440452 FromPassword : p .FromPassword ,
@@ -447,23 +459,26 @@ func shardMigrateHandler(proxy *proxy.Proxy, w rest.ResponseWriter, r *rest.Requ
447459 ToTable : p .ToTable ,
448460 Rebalance : p .Rebalance ,
449461 Cleanup : p .Cleanup ,
450- MySQLDump : p .MySQLDump ,
462+ MysqlDump : p .MySQLDump ,
451463 Threads : p .Threads ,
452- Behinds : p .Behinds ,
464+ PosBehinds : p .Behinds ,
453465 RadonURL : p .RadonURL ,
454466 Checksum : p .Checksum ,
455467 WaitTimeBeforeChecksum : p .WaitTimeBeforeChecksum ,
456468 }
457- log .Info ("shift.cfg:%+v" , cfg )
458469
459- shift := shift .NewShift (log , cfg )
460- if err := shift .Start (); err != nil {
470+ shiftMgr := proxy .Plugins ().PlugShiftMgr ()
471+ shift , _ := shiftMgr .NewShiftInstance (cfg , shiftmanager .ShiftTypeRebalance )
472+
473+ key := fmt .Sprintf ("`%s`.`%s`_%s" , p .ToDatabase , p .ToTable , toBackend )
474+ err = shiftMgr .StartShiftInstance (key , shift , shiftmanager .ShiftTypeRebalance )
475+ if err != nil {
461476 log .Error ("shift.start.error:%+v" , err )
462477 rest .Error (w , err .Error (), http .StatusInternalServerError )
463478 return
464479 }
465480
466- err = shift . WaitFinish ( )
481+ err = shiftMgr . WaitInstanceFinish ( key )
467482 if err != nil {
468483 log .Error ("shift.wait.finish.error:%+v" , err )
469484 rest .Error (w , err .Error (), http .StatusInternalServerError )
0 commit comments