Closed zrlw closed 3 years ago
派生类和AbstractDirectory一起对AbstractDirectory的成员invokers,validInvokers进行操作违反了开闭原则,代码散落在各个类里面也不利于维护。
再说一下this.connectivityCheckFuture被创建的新任务重新赋值的问题: checkConnectivity异步创建的任务在结束前判断是否有新task,如果有就再次调用checkConnectivity:
2021-11-07T11:46:56.1815610Z [ERROR] Tests run: 3, Failures: 1, Errors: 0, Skipped: 0, Time elapsed: 0.19 s <<< FAILURE! - in org.apache.dubbo.rpc.cluster.support.ConnectivityValidationTest
2021-11-07T11:46:56.1818867Z [ERROR] org.apache.dubbo.rpc.cluster.support.ConnectivityValidationTest.testRetry Time elapsed: 0.007 s <<< FAILURE!
2021-11-07T11:46:56.1820680Z org.opentest4j.AssertionFailedError: expected: <2> but was: <1>
2021-11-07T11:46:56.1822662Z at org.apache.dubbo.rpc.cluster.support.ConnectivityValidationTest.testRetry(ConnectivityValidationTest.java:190)
更新: 还不能简单地在checkConnectivity创建的task里面等待新任务结束,那样就违背了checkConnectivity的设计初衷,为了避免长时间占用connectivityExecutor,checkConnectivity采用的是分批处理的策略,所以PR #9211 最终没有修改checkConnectivity方法,而是修改了ConnectivityValidationTest的waitRefresh方法,将等待条件改为invokersToReconnect列表里没有需要进行recover的invoker。
Environment
此外,上面异常日志信息暴露出MultiInstanceTest存在的问题: provider启动完成并不意味着reference端收到了注册中心的服务实例通知,此时客户端直接调用会因找不到服务注册信息而失败。