Skip to content

Commit bbfe9a6

Browse files
committed
access service in lock when outlier detector get open instance
1 parent e43da1b commit bbfe9a6

File tree

1 file changed

+13
-5
lines changed

1 file changed

+13
-5
lines changed

polaris/plugin/local_registry/local_registry.cpp

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)