func getActions(zconn zk.Conn, actionPath string) ([]*tm.ActionNode, error) { actions, _, err := zconn.Children(actionPath) if err != nil { return nil, fmt.Errorf("getActions failed: %v %v", actionPath, err) } sort.Strings(actions) wg := sync.WaitGroup{} mu := sync.Mutex{} nodes := make([]*tm.ActionNode, 0, len(actions)) for _, action := range actions { wg.Add(1) go func(action string) { defer wg.Done() actionNodePath := path.Join(actionPath, action) data, _, err := zconn.Get(actionNodePath) if err != nil && !zookeeper.IsError(err, zookeeper.ZNONODE) { log.Warningf("getActions: %v %v", actionNodePath, err) return } actionNode, err := tm.ActionNodeFromJson(data, actionNodePath) if err != nil { log.Warningf("getActions: %v %v", actionNodePath, err) return } mu.Lock() nodes = append(nodes, actionNode) mu.Unlock() }(action) } wg.Wait() return nodes, nil }
// 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 staleActions(zkts *zktopo.Server, zkActionPath string, maxStaleness time.Duration) ([]*tm.ActionNode, error) { // get the stale strings actionNodes, err := zkts.StaleActions(zkActionPath, maxStaleness, tm.ActionNodeIsStale) if err != nil { return nil, err } // convert to ActionNode staleActions := make([]*tm.ActionNode, len(actionNodes)) for i, actionNodeStr := range actionNodes { actionNode, err := tm.ActionNodeFromJson(actionNodeStr, "") if err != nil { return nil, err } staleActions[i] = actionNode } return staleActions, nil }