// FindWorkerTablet will: // - find a rdonly instance in the keyspace / shard // - mark it as worker // - tag it with our worker process func FindWorkerTablet(ctx context.Context, wr *wrangler.Wrangler, cleaner *wrangler.Cleaner, cell, keyspace, shard string) (*topodatapb.TabletAlias, error) { tabletAlias, err := FindHealthyRdonlyEndPoint(ctx, wr, cell, keyspace, shard) if err != nil { return nil, err } // We add the tag before calling ChangeSlaveType, so the destination // vttablet reloads the worker URL when it reloads the tablet. ourURL := servenv.ListeningURL.String() wr.Logger().Infof("Adding tag[worker]=%v to tablet %v", ourURL, topoproto.TabletAliasString(tabletAlias)) shortCtx, cancel := context.WithTimeout(ctx, *remoteActionsTimeout) _, err = wr.TopoServer().UpdateTabletFields(shortCtx, tabletAlias, func(tablet *topodatapb.Tablet) error { if tablet.Tags == nil { tablet.Tags = make(map[string]string) } tablet.Tags["worker"] = ourURL return nil }) cancel() if err != nil { return nil, err } // Using "defer" here because we remove the tag *before* calling // ChangeSlaveType back, so we need to record this tag change after the change // slave type change in the cleaner. defer wrangler.RecordTabletTagAction(cleaner, tabletAlias, "worker", "") wr.Logger().Infof("Changing tablet %v to '%v'", topoproto.TabletAliasString(tabletAlias), topodatapb.TabletType_WORKER) shortCtx, cancel = context.WithTimeout(ctx, *remoteActionsTimeout) err = wr.ChangeSlaveType(shortCtx, tabletAlias, topodatapb.TabletType_WORKER) cancel() if err != nil { return nil, err } // Record a clean-up action to take the tablet back to rdonly. // We will alter this one later on and let the tablet go back to // 'spare' if we have stopped replication for too long on it. wrangler.RecordChangeSlaveTypeAction(cleaner, tabletAlias, topodatapb.TabletType_RDONLY) return tabletAlias, nil }
// FindWorkerTablet will: // - find a rdonly instance in the keyspace / shard // - mark it as worker // - tag it with our worker process func FindWorkerTablet(ctx context.Context, wr *wrangler.Wrangler, cleaner *wrangler.Cleaner, tsc *discovery.TabletStatsCache, cell, keyspace, shard string, minHealthyRdonlyTablets int) (*topodatapb.TabletAlias, error) { tabletAlias, err := FindHealthyRdonlyTablet(ctx, wr, tsc, cell, keyspace, shard, minHealthyRdonlyTablets) if err != nil { return nil, err } // We add the tag before calling ChangeSlaveType, so the destination // vttablet reloads the worker URL when it reloads the tablet. ourURL := servenv.ListeningURL.String() wr.Logger().Infof("Adding tag[worker]=%v to tablet %v", ourURL, topoproto.TabletAliasString(tabletAlias)) shortCtx, cancel := context.WithTimeout(ctx, *remoteActionsTimeout) _, err = wr.TopoServer().UpdateTabletFields(shortCtx, tabletAlias, func(tablet *topodatapb.Tablet) error { if tablet.Tags == nil { tablet.Tags = make(map[string]string) } tablet.Tags["worker"] = ourURL tablet.Tags["drain_reason"] = "Used by vtworker" return nil }) cancel() if err != nil { return nil, err } // Using "defer" here because we remove the tag *before* calling // ChangeSlaveType back, so we need to record this tag change after the change // slave type change in the cleaner. defer wrangler.RecordTabletTagAction(cleaner, tabletAlias, "worker", "") defer wrangler.RecordTabletTagAction(cleaner, tabletAlias, "drain_reason", "") wr.Logger().Infof("Changing tablet %v to '%v'", topoproto.TabletAliasString(tabletAlias), topodatapb.TabletType_DRAINED) shortCtx, cancel = context.WithTimeout(ctx, *remoteActionsTimeout) err = wr.ChangeSlaveType(shortCtx, tabletAlias, topodatapb.TabletType_DRAINED) cancel() if err != nil { return nil, err } // Record a clean-up action to take the tablet back to rdonly. wrangler.RecordChangeSlaveTypeAction(cleaner, tabletAlias, topodatapb.TabletType_DRAINED, topodatapb.TabletType_RDONLY) return tabletAlias, nil }