@@ -138,38 +138,32 @@ ReturnCode HealthCheckerChainImpl::DetectInstance(CircuitBreakerChain& circuit_b
138138 }
139139
140140 ServiceData* service_data = NULL ;
141- local_registry_->GetServiceDataWithRef (service_key_, kServiceDataInstances , service_data);
142- if (service_data == NULL ) {
141+ std::vector<Instance*> health_check_instances;
142+ if (local_registry_->GetCircuitBreakerInstances (service_key_, service_data,
143+ health_check_instances) != kReturnOk ) {
143144 return kReturnOk ;
144145 }
145- Service* service = service_data-> GetService ();
146+
146147 ServiceInstances service_instances (service_data);
147148 std::map<std::string, Instance*>& instance_map = service_instances.GetInstances ();
148- std::set<std::string> target_health_check_instances;
149149
150150 if (when_ == HealthCheckerConfig::kChainWhenAlways ) {
151+ health_check_instances.clear ();
151152 // 健康检查设置为always, 则探测所有非隔离实例
152153 for (std::map<std::string, Instance*>::iterator instance_iter = instance_map.begin ();
153154 instance_iter != instance_map.end (); ++instance_iter) {
154155 if (!instance_iter->second ->isIsolate ()) {
155- target_health_check_instances. insert (instance_iter->first );
156+ health_check_instances. push_back (instance_iter->second );
156157 }
157158 }
158- } else if (when_ = = HealthCheckerConfig::kChainWhenOnRecover ) {
159- // 健康检查设置为on_recover , 则探测半开实例
160- target_health_check_instances = service-> GetCircuitBreakerOpenInstances ();
159+ } else if (when_ ! = HealthCheckerConfig::kChainWhenOnRecover ) {
160+ // 健康检查设置不为on_recover , 则探测半开实例
161+ health_check_instances. clear ();
161162 }
162- for (std::set<std::string>::iterator it = target_health_check_instances.begin ();
163- it != target_health_check_instances.end (); ++it) {
164- const std::string& instance_id = *it;
165- std::map<std::string, Instance*>::iterator iter = instance_map.find (instance_id);
166- if (iter == instance_map.end ()) {
167- POLARIS_LOG (LOG_INFO, " The health checker of service[%s/%s] getting instance[%s] failed" ,
168- service_key_.namespace_ .c_str (), service_key_.name_ .c_str (), instance_id.c_str ());
169- continue ;
170- }
163+
164+ for (std::size_t i = 0 ; i < health_check_instances.size (); ++i) {
171165 bool is_detect_success = false ;
172- Instance* instance = iter-> second ;
166+ Instance* instance = health_check_instances[i] ;
173167 for (std::size_t i = 0 ; i < health_checker_list_.size (); ++i) {
174168 HealthChecker*& detector = health_checker_list_[i];
175169 DetectResult detector_result;
@@ -195,15 +189,16 @@ ReturnCode HealthCheckerChainImpl::DetectInstance(CircuitBreakerChain& circuit_b
195189 // 探活插件成功,则将熔断实例置为半开状态,其他实例状态不变
196190 // 探活插件失败,则将健康实例置为熔断状态,其他实例状态不变
197191 if (is_detect_success) {
198- circuit_breaker_chain.TranslateStatus (instance_id , kCircuitBreakerOpen ,
192+ circuit_breaker_chain.TranslateStatus (instance-> GetId () , kCircuitBreakerOpen ,
199193 kCircuitBreakerHalfOpen );
200194 POLARIS_LOG (LOG_INFO,
201195 " service[%s/%s] getting instance[%s-%s:%d] detectoring success, change to "
202196 " half-open status" ,
203197 service_key_.namespace_ .c_str (), service_key_.name_ .c_str (),
204198 instance->GetId ().c_str (), instance->GetHost ().c_str (), instance->GetPort ());
205199 } else {
206- circuit_breaker_chain.TranslateStatus (instance_id, kCircuitBreakerClose , kCircuitBreakerOpen );
200+ circuit_breaker_chain.TranslateStatus (instance->GetId (), kCircuitBreakerClose ,
201+ kCircuitBreakerOpen );
207202 POLARIS_LOG (LOG_INFO,
208203 " service[%s/%s] getting instance[%s-%s:%d] detectoring failed, change to "
209204 " open status" ,
0 commit comments