func newRealtimeStats(ts topo.Server) (*realtimeStats, error) { hc := discovery.NewHealthCheck(*vtctl.HealthCheckTimeout, *vtctl.HealthcheckRetryDelay, *vtctl.HealthCheckTimeout) tabletStatsCache := &tabletStatsCache{ statuses: make(map[string]map[string]*discovery.TabletStats), } hc.SetListener(tabletStatsCache) r := &realtimeStats{ healthCheck: hc, tabletStats: tabletStatsCache, } // Get the list of all tablets from all cells and monitor the topology for added or removed tablets with a CellTabletsWatcher. cells, err := ts.GetKnownCells(context.Background()) if err != nil { return r, fmt.Errorf("error when getting cells: %v", err) } var watchers []*discovery.TopologyWatcher for _, cell := range cells { watcher := discovery.NewCellTabletsWatcher(ts, hc, cell, *vtctl.HealthCheckTopologyRefresh, discovery.DefaultTopoReadConcurrency) watchers = append(watchers, watcher) } r.cellWatchers = watchers return r, nil }
func createDiscoveryGateway(hc discovery.HealthCheck, topoServer topo.Server, serv topo.SrvTopoServer, cell string, retryCount int, tabletTypesToWait []topodatapb.TabletType) Gateway { dg := &discoveryGateway{ hc: hc, topoServer: topoServer, srvTopoServer: serv, localCell: cell, retryCount: retryCount, tabletTypesToWait: tabletTypesToWait, tabletsWatchers: make([]*discovery.TopologyWatcher, 0, 1), statusAggregators: make(map[string]*TabletStatusAggregator), } log.Infof("loading tablets for cells: %v", *cellsToWatch) for _, c := range strings.Split(*cellsToWatch, ",") { if c == "" { continue } ctw := discovery.NewCellTabletsWatcher(dg.topoServer, dg.hc, c, *refreshInterval, *topoReadConcurrency) dg.tabletsWatchers = append(dg.tabletsWatchers, ctw) } err := dg.waitForTablets() if err != nil { log.Errorf("createDiscoveryGateway: %v", err) } return dg }
func createDiscoveryGateway(hc discovery.HealthCheck, topoServer topo.Server, serv topo.SrvTopoServer, cell string, retryCount int) Gateway { dg := &discoveryGateway{ hc: hc, tsc: discovery.NewTabletStatsCache(hc, cell), topoServer: topoServer, srvTopoServer: serv, localCell: cell, retryCount: retryCount, tabletsWatchers: make([]*discovery.TopologyWatcher, 0, 1), statusAggregators: make(map[string]*TabletStatusAggregator), } log.Infof("loading tablets for cells: %v", *cellsToWatch) for _, c := range strings.Split(*cellsToWatch, ",") { if c == "" { continue } var tr discovery.TabletRecorder = dg.hc if len(tabletFilters) > 0 { fbs, err := discovery.NewFilterByShard(dg.hc, tabletFilters) if err != nil { log.Fatalf("Cannot parse tablet_filters parameter: %v", err) } tr = fbs } ctw := discovery.NewCellTabletsWatcher(dg.topoServer, tr, c, *refreshInterval, *topoReadConcurrency) dg.tabletsWatchers = append(dg.tabletsWatchers, ctw) } return dg }
// InitializeConnections creates connections to VTTablets. func (dg *discoveryGateway) InitializeConnections(ctx context.Context) error { dg.hc.SetListener(dg) for _, cell := range strings.Split(*cellsToWatch, ",") { ctw := discovery.NewCellTabletsWatcher(dg.topoServer, dg.hc, cell, *refreshInterval, *topoReadConcurrency) dg.tabletsWatchers = append(dg.tabletsWatchers, ctw) } return nil }