diff --git a/cluster/cluster_impl/failover_cluster_invoker.go b/cluster/cluster_impl/failover_cluster_invoker.go index 70db6d4c1cdf5150d607d6c5250dfb3da631e95a..3595a04c711eca37b72ceed6f84c55e4dc23bad0 100644 --- a/cluster/cluster_impl/failover_cluster_invoker.go +++ b/cluster/cluster_impl/failover_cluster_invoker.go @@ -72,6 +72,9 @@ func (invoker *failoverClusterInvoker) Invoke(invocation protocol.Invocation) pr invoked := []protocol.Invoker{} providers := []string{} var result protocol.Result + if retries > len(invokers) { + retries = len(invokers) + } for i := 0; i <= retries; i++ { //Reselect before retry to avoid a change of candidate `invokers`. //NOTE: if `invokers` changed, then `invoked` also lose accuracy. @@ -87,6 +90,9 @@ func (invoker *failoverClusterInvoker) Invoke(invocation protocol.Invocation) pr } } ivk := invoker.doSelect(loadbalance, invocation, invokers, invoked) + if ivk == nil { + continue + } invoked = append(invoked, ivk) //DO INVOKE result = ivk.Invoke(invocation)