// 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 := tabletmanager.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) }() }
func main() { dbConfigsFile, dbCredentialsFile := dbconfigs.RegisterCommonFlags() flag.Parse() relog.Info("started vtaction %v", os.Args) rpc.HandleHTTP() jsonrpc.ServeHTTP() jsonrpc.ServeRPC() bsonrpc.ServeHTTP() bsonrpc.ServeRPC() logFile, err := os.OpenFile(*logFilename, os.O_APPEND|os.O_WRONLY|os.O_CREATE, 0666) if err != nil { relog.Fatal("Can't open log file: %v", err) } relog.SetOutput(logFile) relog.SetPrefix(fmt.Sprintf("vtaction [%v] ", os.Getpid())) if err := relog.SetLevelByName(*logLevel); err != nil { relog.Fatal("%v", err) } relog.HijackLog(nil) relog.HijackStdio(logFile, logFile) mycnf, mycnfErr := mysqlctl.ReadMycnf(*mycnfFile) if mycnfErr != nil { relog.Fatal("mycnf read failed: %v", mycnfErr) } relog.Debug("mycnf: %v", jscfg.ToJson(mycnf)) dbcfgs, cfErr := dbconfigs.Init(mycnf.SocketFile, *dbConfigsFile, *dbCredentialsFile) if err != nil { relog.Fatal("%s", cfErr) } mysqld := mysqlctl.NewMysqld(mycnf, dbcfgs.Dba, dbcfgs.Repl) topoServer := topo.GetServer() defer topo.CloseServers() actor := tabletmanager.NewTabletActor(mysqld, topoServer) // we delegate out startup to the micromanagement server so these actions // will occur after we have obtained our socket. bindAddr := fmt.Sprintf(":%v", *port) httpServer := &http.Server{Addr: bindAddr} go func() { if err := httpServer.ListenAndServe(); err != nil { relog.Error("httpServer.ListenAndServe err: %v", err) } }() actionErr := actor.HandleAction(*actionNode, *action, *actionGuid, *force) if actionErr != nil { relog.Fatal("action error: %v", actionErr) } relog.Info("finished vtaction %v", os.Args) }
// 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 := tm.ActionNodeFromJson(data, actionPath) if err != nil { t.Fatalf("ActionNodeFromJson failed: %v\n%v", err, data) } ta := tm.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) } return nil } wr.ts.ActionEventLoop(tabletAlias, f, done) }() }
func main() { dbconfigs.RegisterCommonFlags() flag.Parse() servenv.Init() defer servenv.Close() log.Infof("started vtaction %v", os.Args) servenv.ServeRPC() mycnf, mycnfErr := mysqlctl.ReadMycnf(*mycnfFile) 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(mycnf, &dbcfgs.Dba, &dbcfgs.Repl) topoServer := topo.GetServer() defer topo.CloseServers() actor := tabletmanager.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", *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 := tabletmanager.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) }() }