sofastack / sofa-rpc

SOFARPC is a high-performance, high-extensibility, production-level Java RPC framework.
https://www.sofastack.tech/sofa-rpc/docs/Home
Apache License 2.0
3.81k stars 1.17k forks source link

客户端首次泛化调用RPC接口,抛异常SofaRouteExceptionRPC-02312 #980

Closed it-linnan closed 3 years ago

it-linnan commented 3 years ago

Describe the bug

注册中心使用SOFARegistry 启动RPC服务端后,客户端使用泛化调用,首次调用SOFARPC接口,抛异常,第二次调用无异常。

异常如下:

com.alipay.sofa.rpc.core.exception.SofaRouteException: RPC-02312: The 
service addresses [10.244.186.239:12200?rpcVer=50502&serialization=hessian2&weight=100&timeout=3000&appName=m-dp-accountmanage&p=1&v=4.0&_SERIALIZETYPE=hessian2&_WEIGHT=100&_TIMEOUT=3000&app_name=m-dp-accountmanage&startTime=1600655715103,] of service [com.wish.biz.dp.accountmanage.tran.c00000.TranL1200018:1.0] is not available,or specify url not exist in providers  
    at com.alipay.sofa.rpc.client.AbstractCluster.unavailableProviderException(AbstractCluster.java:436) ~[sofa-rpc-all-5.5.5.jar!/:5.5.5]
    at com.alipay.sofa.rpc.client.AbstractCluster.select(AbstractCluster.java:397) ~[sofa-rpc-all-5.5.5.jar!/:5.5.5]
    at com.alipay.sofa.rpc.client.FailoverCluster.doInvoke(FailoverCluster.java:64) ~[sofa-rpc-all-5.5.5.jar!/:5.5.5]
    at com.alipay.sofa.rpc.client.AbstractCluster.invoke(AbstractCluster.java:288) ~[sofa-rpc-all-5.5.5.jar!/:5.5.5]
    at com.alipay.sofa.rpc.client.ClientProxyInvoker.invoke(ClientProxyInvoker.java:83) ~[sofa-rpc-all-5.5.5.jar!/:5.5.5]
    at com.alipay.sofa.rpc.api.GenericService_proxy_10.$genericInvoke(GenericService_proxy_10.java) ~[?:5.5.5]
    at com.wish.plat.trans.api.provider.support.TransactionApiHelper.genericCall(TransactionApiHelper.java:189) ~[plat-trans-api-0.1.2-SNAPSHOT.jar!/:?]
    at com.wish.plat.trans.api.TransactionApi.call(TransactionApi.java:88) ~[plat-trans-api-0.1.2-SNAPSHOT.jar!/:?]
    ... 70 more

Expected behavior

客户端首次调用SOFARPC接口,拉取到地址后,能够调用到服务端接口。

Actual behavior

客户端首次调用SOFARPC接口时,从注册中心拉取到地址后,未等到将ClientTransport放入aliveConnections中,就抛出了异常。第二次调用时,aliveConnections已经存在可用链接。

AllConnectConnectionHolder.java addNode方法中latch.await失效,未等到超时或ClientTransport放入aliveConnections中就抛出了异常。

Steps to reproduce

不是必现的问题,需要反复尝试才会出现。

Minimal yet complete reproducer code (or GitHub URL to code)

ConsumerConfig<GenericService> consumerConfig = new 
ConsumerConfig<GenericService>() 
        .setConnectTimeout(properties.getConnectTimeout())
        .setDisconnectTimeout(properties.getDisconnectTimeout())
        .setInterfaceId(interfaceId)
        .setProtocol(BOLT_BINDING_TYPE.getType())
        .setGeneric(true)
        .setRegistry(registryConfigContainer.getRegistryConfig());
GenericService service = consumerConfig.refer();
service.$genericInvoke(definition.getMethod(), TRAN_ARG_TYPES, new 
Object[]{pool}, Map.class) ;

Environment

hackerfj commented 3 years ago

我也遇到了相同的问题,我是使用的blot协议,当链路某个节点重启之后,在nacos中已经注册上来,但请求还是返回:当前服务[com.xx.xx.xx.xx:1.0]的地址[bolt://192.168.10.47:28802?accepts=100000&appName=xxx&weight=100&language=java&pid=32896&interface=com.xx.xx.xx.xx&timeout=3000&serialization=hessian2&protocol=bolt&delay=-1&dynamic=true&startTime=1600939020922&id=rpc-cfg-0&uniqueId=&rpcVer=50504,]不可用,或指定的地址不在可用的地址列表中

OrezzerO commented 3 years ago

image 第一行执行完成了,第二行还没执行完成,会导致这个问题。 调用和注册中心通知是异步的,和CountDownLatch没什么关系。 后续打算调整执行顺序,先更新 connectionHolder,再更新 addressHolder。

jiaouyuanfeng commented 3 years ago

is this issue coding?