// TestGRPCDiscovery tests the discovery gateway with a gRPC // connection from the gateway to the fake tablet. func TestGRPCDiscovery(t *testing.T) { flag.Set("tablet_protocol", "grpc") flag.Set("gateway_implementation", "discoverygateway") // Fake services for the tablet, topo server. service, ts, cell := CreateFakeServers(t) // Tablet: listen on a random port. listener, err := net.Listen("tcp", ":0") if err != nil { t.Fatalf("Cannot listen: %v", err) } host := listener.Addr().(*net.TCPAddr).IP.String() port := listener.Addr().(*net.TCPAddr).Port defer listener.Close() // Tablet: create a gRPC server and listen on the port. server := grpc.NewServer() grpcqueryservice.Register(server, service) go server.Serve(listener) defer server.Stop() // VTGate: create the discovery healthcheck, and the gateway. // Wait for the right tablets to be present. hc := discovery.NewHealthCheck(30*time.Second, 10*time.Second, 2*time.Minute) dg := gateway.GetCreator()(hc, ts, ts, cell, 2) hc.AddTablet(&topodatapb.Tablet{ Alias: &topodatapb.TabletAlias{ Cell: cell, Uid: 43, }, Keyspace: tabletconntest.TestTarget.Keyspace, Shard: tabletconntest.TestTarget.Shard, Type: tabletconntest.TestTarget.TabletType, Hostname: host, PortMap: map[string]int32{ "grpc": int32(port), }, }, "test_tablet") err = gateway.WaitForTablets(dg, []topodatapb.TabletType{tabletconntest.TestTarget.TabletType}) if err != nil { t.Fatalf("WaitForTablets failed: %v", err) } defer dg.Close(context.Background()) // run the test suite. TestSuite(t, "discovery-grpc", dg, service) // run it again with vtgate combining Begin and Execute flag.Set("tablet_grpc_combine_begin_execute", "true") TestSuite(t, "discovery-grpc-combo", dg, service) }
// NewScatterConn creates a new ScatterConn. All input parameters are passed through // for creating the appropriate connections. func NewScatterConn(hc discovery.HealthCheck, topoServer topo.Server, serv topo.SrvTopoServer, statsName, cell string, retryCount int, tabletTypesToWait []topodatapb.TabletType) *ScatterConn { tabletCallErrorCountStatsName := "" if statsName != "" { tabletCallErrorCountStatsName = statsName + "ErrorCount" } gw := gateway.GetCreator()(hc, topoServer, serv, cell, retryCount) gateway.WaitForTablets(gw, tabletTypesToWait) return &ScatterConn{ timings: stats.NewMultiTimings(statsName, []string{"Operation", "Keyspace", "ShardName", "DbType"}), tabletCallErrorCount: stats.NewMultiCounters(tabletCallErrorCountStatsName, []string{"Operation", "Keyspace", "ShardName", "DbType"}), gateway: gw, } }
// Init creates the single L2VTGate with the provided parameters. func Init(hc discovery.HealthCheck, topoServer topo.Server, serv topo.SrvTopoServer, cell string, retryCount int, tabletTypesToWait []topodatapb.TabletType) *L2VTGate { if l2VTGate != nil { log.Fatalf("L2VTGate already initialized") } gw := gateway.GetCreator()(hc, topoServer, serv, cell, retryCount) gateway.WaitForTablets(gw, tabletTypesToWait) l2VTGate = &L2VTGate{ gateway: gw, } servenv.OnRun(func() { for _, f := range RegisterL2VTGates { f(l2VTGate) } }) return l2VTGate }
// Init creates the single L2VTGate with the provided parameters. func Init(hc discovery.HealthCheck, topoServer topo.Server, serv topo.SrvTopoServer, statsName, cell string, retryCount int, tabletTypesToWait []topodatapb.TabletType) *L2VTGate { if l2VTGate != nil { log.Fatalf("L2VTGate already initialized") } tabletCallErrorCountStatsName := "" if statsName != "" { tabletCallErrorCountStatsName = statsName + "ErrorCount" } gw := gateway.GetCreator()(hc, topoServer, serv, cell, retryCount) gateway.WaitForTablets(gw, tabletTypesToWait) l2VTGate = &L2VTGate{ timings: stats.NewMultiTimings(statsName, []string{"Operation", "Keyspace", "ShardName", "DbType"}), tabletCallErrorCount: stats.NewMultiCounters(tabletCallErrorCountStatsName, []string{"Operation", "Keyspace", "ShardName", "DbType"}), gateway: gw, } servenv.OnRun(func() { for _, f := range RegisterL2VTGates { f(l2VTGate) } }) return l2VTGate }