@@ -402,12 +402,20 @@ ReturnCode InMemoryRegistry::GetCircuitBreakerInstances(const ServiceKey& servic
402402 service_data->DecrementRef ();
403403 return kReturnServiceNotFound ;
404404 }
405- Service* service = service_data->GetService ();
405+ // 由于此处获取service data没有更新访问时间,服务可能淘汰,不能直接使用其关联的服务数据
406+ pthread_rwlock_rdlock (&rwlock_);
407+ std::map<ServiceKey, Service*>::iterator service_it = service_cache_.find (service_key);
408+ if (service_it == service_cache_.end ()) {
409+ pthread_rwlock_unlock (&rwlock_);
410+ return kReturnServiceNotFound ;
411+ }
412+ std::set<std::string> open_instance = service_it->second ->GetCircuitBreakerOpenInstances ();
413+ pthread_rwlock_unlock (&rwlock_);
414+
406415 ServiceInstances service_instances (service_data);
407- std::map<std::string, Instance*>& instance_map = service_instances.GetInstances ();
408- std::set<std::string> circuit_breaker_open_instance = service->GetCircuitBreakerOpenInstances ();
409- for (std::set<std::string>::iterator it = circuit_breaker_open_instance.begin ();
410- it != circuit_breaker_open_instance.end (); ++it) {
416+ std::map<std::string, Instance*>& instance_map = service_instances.GetInstances ();
417+ for (std::set<std::string>::iterator it = open_instance.begin (); it != open_instance.end ();
418+ ++it) {
411419 const std::string& instance_id = *it;
412420 std::map<std::string, Instance*>::iterator iter = instance_map.find (instance_id);
413421 if (iter == instance_map.end ()) {
0 commit comments