diff --git a/cluster/cluster_impl/base_cluster_invoker.go b/cluster/cluster_impl/base_cluster_invoker.go
index d58a2de57ec7541e39e48289a69d6a43a11cabff..0d39bff13ee3a917268dd2ee82e8f6aff7ccecbc 100644
--- a/cluster/cluster_impl/base_cluster_invoker.go
+++ b/cluster/cluster_impl/base_cluster_invoker.go
@@ -143,8 +143,7 @@ func (invoker *baseClusterInvoker) doSelectInvoker(lb cluster.LoadBalance, invoc
 		for i := 0; i < 3; i++ {
 			if len(otherInvokers) == 0 {
 				// no other ivk to reselect, return to fallback
-				logger.Errorf("all %d invokers is unavailable for %s.", len(invokers), selectedInvoker.GetUrl().String())
-				return nil
+				break
 			}
 			reselectedInvoker := lb.Select(otherInvokers, invocation)
 			if isInvoked(reselectedInvoker, invoked) {
@@ -158,11 +157,13 @@ func (invoker *baseClusterInvoker) doSelectInvoker(lb cluster.LoadBalance, invoc
 				otherInvokers = getOtherInvokers(otherInvokers, reselectedInvoker)
 				continue
 			}
-			selectedInvoker = reselectedInvoker
-			break
+			return reselectedInvoker
 		}
+	} else {
+		return selectedInvoker
 	}
-	return selectedInvoker
+	logger.Errorf("all %d invokers is unavailable for %s.", len(invokers), selectedInvoker.GetUrl().String())
+	return nil
 }
 
 func (invoker *baseClusterInvoker) Invoke(ctx context.Context, invocation protocol.Invocation) protocol.Result {
diff --git a/protocol/rpc_status.go b/protocol/rpc_status.go
index ee4d74ffeeb5648f73268acdb4bea24fb5de4308..8fc5ddd76e84a7de87ba8a9f09aa2adfa09e434b 100644
--- a/protocol/rpc_status.go
+++ b/protocol/rpc_status.go
@@ -264,10 +264,8 @@ func TryRefreshBlackList() {
 			go func(ivks []Invoker, i int) {
 				defer wg.Done()
 				for j, _ := range ivks {
-					if j%3-i == 0 {
-						if ivks[j].(Invoker).IsAvailable() {
-							RemoveInvokerUnhealthyStatus(ivks[i])
-						}
+					if j%3-i == 0 && ivks[j].(Invoker).IsAvailable() {
+						RemoveInvokerUnhealthyStatus(ivks[i])
 					}
 				}
 			}(ivks, i)