// startFakeTabletActionLoop will start the action loop for a fake tablet, // using mysqlDaemon as the backing mysqld. func startFakeTabletActionLoop(t *testing.T, wr *Wrangler, tabletAlias topo.TabletAlias, mysqlDaemon mysqlctl.MysqlDaemon, done chan struct{}) { go func() { f := func(actionPath, data string) error { actionNode, err := actionnode.ActionNodeFromJson(data, actionPath) if err != nil { t.Fatalf("ActionNodeFromJson failed: %v\n%v", err, data) } ta := actor.NewTabletActor(nil, mysqlDaemon, wr.ts, tabletAlias) if err := ta.HandleAction(actionPath, actionNode.Action, actionNode.ActionGuid, false); err != nil { // action may just fail for any good reason t.Logf("HandleAction failed for %v: %v", actionNode.Action, err) } // this part would also be done by the agent tablet, err := wr.ts.GetTablet(tabletAlias) if err != nil { t.Logf("Cannot get tablet: %v", err) } else { updatedTablet := tabletmanager.CheckTabletMysqlPort(wr.ts, mysqlDaemon, tablet) if updatedTablet != nil { t.Logf("Updated tablet record") } } return nil } wr.ts.ActionEventLoop(tabletAlias, f, done) }() }
// StartActionLoop will start the action loop for a fake tablet, // using ft.FakeMysqlDaemon as the backing mysqld. func (ft *FakeTablet) StartActionLoop(t *testing.T, wr *wrangler.Wrangler) { if ft.Done != nil { t.Fatalf("ActionLoop for %v is already running", ft.Tablet.Alias) } ft.Done = make(chan struct{}, 1) go func() { wr.TopoServer().ActionEventLoop(ft.Tablet.Alias, func(actionPath, data string) error { actionNode, err := actionnode.ActionNodeFromJson(data, actionPath) if err != nil { t.Fatalf("ActionNodeFromJson failed: %v\n%v", err, data) } ta := actor.NewTabletActor(nil, ft.FakeMysqlDaemon, wr.TopoServer(), ft.Tablet.Alias) if err := ta.HandleAction(actionPath, actionNode.Action, actionNode.ActionGuid, false); err != nil { // action may just fail for any good reason t.Logf("HandleAction failed for %v: %v", actionNode.Action, err) } // this part would also be done by the agent tablet, err := wr.TopoServer().GetTablet(ft.Tablet.Alias) if err != nil { t.Logf("Cannot get tablet: %v", err) } else { updatedTablet := actor.CheckTabletMysqlPort(wr.TopoServer(), ft.FakeMysqlDaemon, tablet) if updatedTablet != nil { t.Logf("Updated tablet record") } } return nil }, ft.Done) }() }
func main() { dbconfigs.RegisterFlags() mysqlctl.RegisterFlags() flag.Parse() servenv.Init() defer servenv.Close() log.Infof("started vtaction %v", os.Args) servenv.ServeRPC() mycnf, mycnfErr := mysqlctl.NewMycnfFromFlags(0) if mycnfErr != nil { log.Fatalf("mycnf read failed: %v", mycnfErr) } log.V(6).Infof("mycnf: %v", jscfg.ToJson(mycnf)) dbcfgs, cfErr := dbconfigs.Init(mycnf.SocketFile) if cfErr != nil { log.Fatalf("%s", cfErr) } mysqld := mysqlctl.NewMysqld("Dba", mycnf, &dbcfgs.Dba, &dbcfgs.Repl) defer mysqld.Close() topoServer := topo.GetServer() defer topo.CloseServers() actor := actor.NewTabletActor(mysqld, mysqld, topoServer, topo.TabletAlias{}) // we delegate out startup to the micromanagement server so these actions // will occur after we have obtained our socket. bindAddr := fmt.Sprintf(":%v", *servenv.Port) httpServer := &http.Server{Addr: bindAddr} go func() { if err := httpServer.ListenAndServe(); err != nil { log.Errorf("httpServer.ListenAndServe err: %v", err) } }() actionErr := actor.HandleAction(*actionNode, *action, *actionGuid, *force) if actionErr != nil { log.Fatalf("action error: %v", actionErr) } log.Infof("finished vtaction %v", os.Args) }
// startFakeTabletActionLoop will start the action loop for a fake // tablet. func (fix *Fixture) startFakeTabletActionLoop(tablet *tabletPack) { go func() { f := func(actionPath, data string) error { actionNode, err := actionnode.ActionNodeFromJson(data, actionPath) if err != nil { fix.Fatalf("ActionNodeFromJson failed: %v\n%v", err, data) } ta := actor.NewTabletActor(nil, tablet.mysql, fix.Topo, tablet.Alias) if err := ta.HandleAction(actionPath, actionNode.Action, actionNode.ActionGuid, false); err != nil { // action may just fail for any good reason fix.Logf("HandleAction failed for %v: %v", actionNode.Action, err) } return nil } fix.Topo.ActionEventLoop(tablet.Alias, f, fix.done) }() }