// 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" } gateway := gateway.GetCreator()(hc, topoServer, serv, cell, retryCount, tabletTypesToWait) return &ScatterConn{ timings: stats.NewMultiTimings(statsName, []string{"Operation", "Keyspace", "ShardName", "DbType"}), tabletCallErrorCount: stats.NewMultiCounters(tabletCallErrorCountStatsName, []string{"Operation", "Keyspace", "ShardName", "DbType"}), gateway: gateway, } }
// 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") } gateway := gateway.GetCreator()(hc, topoServer, serv, cell, retryCount, tabletTypesToWait) l2VTGate = &L2VTGate{ gateway: gateway, } servenv.OnRun(func() { for _, f := range RegisterL2VTGates { f(l2VTGate) } }) return l2VTGate }
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) // 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 // Create a gRPC server and listen on the port. server := grpc.NewServer() grpcqueryservice.RegisterForTest(server, service) go server.Serve(listener) // 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) hc.AddTablet(cell, "test_tablet", &topodatapb.Tablet{ Alias: &topodatapb.TabletAlias{ Cell: cell, }, Keyspace: tabletconntest.TestTarget.Keyspace, Shard: tabletconntest.TestTarget.Shard, Type: tabletconntest.TestTarget.TabletType, Hostname: host, PortMap: map[string]int32{ "grpc": int32(port), }, }) dg := gateway.GetCreator()(hc, ts, ts, cell, 2, []topodatapb.TabletType{tabletconntest.TestTarget.TabletType}) // and run the test suite. TestSuite(t, "discovery-grpc", dg, service) }
// 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 }
// TestL2VTGateDiscovery tests the l2vtgate gateway with a gRPC // connection from the gateway to a l2vtgate in-process object. func TestL2VTGateDiscovery(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() // L2VTGate: 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) l2vtgate := l2vtgate.Init(hc, ts, ts, "", cell, 2, nil) hc.AddTablet(&topodatapb.Tablet{ Alias: &topodatapb.TabletAlias{ Cell: cell, Uid: 44, }, Keyspace: tabletconntest.TestTarget.Keyspace, Shard: tabletconntest.TestTarget.Shard, Type: tabletconntest.TestTarget.TabletType, Hostname: host, PortMap: map[string]int32{ "grpc": int32(port), }, }, "test_tablet") ctx := context.Background() err = l2vtgate.Gateway().WaitForTablets(ctx, []topodatapb.TabletType{tabletconntest.TestTarget.TabletType}) if err != nil { t.Fatalf("WaitForAllServingTablets failed: %v", err) } // L2VTGate: listen on a random port. listener, err = net.Listen("tcp", ":0") if err != nil { t.Fatalf("Cannot listen: %v", err) } defer listener.Close() // L2VTGate: create a gRPC server and listen on the port. server = grpc.NewServer() grpcqueryservice.Register(server, l2vtgate) go server.Serve(listener) defer server.Stop() // VTGate: create the l2vtgate gateway flag.Set("gateway_implementation", "l2vtgategateway") flag.Set("l2vtgategateway_addrs", fmt.Sprintf("%v|%v|%v", listener.Addr().String(), tabletconntest.TestTarget.Keyspace, tabletconntest.TestTarget.Shard)) lg := gateway.GetCreator()(nil, ts, nil, "", 2) defer lg.Close(ctx) // and run the test suite. TestSuite(t, "l2vtgate-grpc", lg, service) }