vitessio / vitess

Vitess is a database clustering system for horizontal scaling of MySQL.
http://vitess.io
Apache License 2.0
18.36k stars 2.08k forks source link

Bug Report: NPE in GrpcClientFactory$VitessLoadBalancer.newLoadBalancer #9770

Open smourachov opened 2 years ago

smourachov commented 2 years ago

Overview of the Issue

NPE in GrpcClientFactory when LoadBalancerFactory is set

Uncaught exception in the SynchronizationContext. Panic!
java.lang.NullPointerException: Cannot invoke "io.grpc.LoadBalancer$Factory.newLoadBalancer(io.grpc.LoadBalancer$Helper)" because "this.base" is null
    at io.vitess.client.grpc.GrpcClientFactory$VitessLoadBalancer.newLoadBalancer(GrpcClientFactory.java:436)
    at io.grpc.internal.AutoConfiguredLoadBalancerFactory$AutoConfiguredLoadBalancer.<init>(AutoConfiguredLoadBalancerFactory.java:96)
    at io.grpc.internal.AutoConfiguredLoadBalancerFactory.newLoadBalancer(AutoConfiguredLoadBalancerFactory.java:63)
    at io.grpc.internal.ManagedChannelImpl.exitIdleMode(ManagedChannelImpl.java:409)
    at io.grpc.internal.ManagedChannelImpl$RealChannel$2.run(ManagedChannelImpl.java:984)
    at io.grpc.SynchronizationContext.drain(SynchronizationContext.java:95)
    at io.grpc.SynchronizationContext.execute(SynchronizationContext.java:127)
    at io.grpc.internal.ManagedChannelImpl$RealChannel.newCall(ManagedChannelImpl.java:981)
    at io.vitess.client.grpc.RetryingInterceptor$RetryingCall.start(RetryingInterceptor.java:111)
    at io.grpc.stub.ClientCalls.startCall(ClientCalls.java:332)
    at io.grpc.stub.ClientCalls.asyncUnaryRequestCall(ClientCalls.java:306)
    at io.grpc.stub.ClientCalls.futureUnaryCall(ClientCalls.java:218)
    at io.vitess.proto.grpc.VitessGrpc$VitessFutureStub.execute(VitessGrpc.java:670)
    at io.vitess.client.grpc.GrpcClient.execute(GrpcClient.java:114)
    at io.vitess.client.VTGateConnection.execute(VTGateConnection.java:102)

Reproduction Steps

Create grpcClientFactory and client as following

var grpcClientFactory = new GrpcClientFactory().setLoadBalancerFactory(LoadBalancerRegistry.getDefaultRegistry().getProvider("round_robin"));

client = grpcClientFactory.create(ctx, vtgateTarget);

If you try to use the client then the NPE will be thrown.

It looks like the bug is in this code https://github.com/vitessio/vitess/blob/main/java/grpc-client/src/main/java/io/vitess/client/grpc/GrpcClientFactory.java#L431 

Where the base field is not actually set.

Binary Version

any

Operating System and Environment details

any

Log Fragments

No response

frouioui commented 2 years ago

@vitessio/java