@@ -138,20 +138,38 @@ void InMemoryRegistry::RunGcTask() {
138138 service_circuit_breaker_config_data_.CheckGc (min_gc_time);
139139}
140140
141- Service* InMemoryRegistry::GetOrCreateServiceInLock (const ServiceKey& service_key) {
141+ Service* InMemoryRegistry::CreateServiceInLock (const ServiceKey& service_key) {
142142 Service* service = NULL ;
143143 pthread_rwlock_wrlock (&rwlock_);
144144 std::map<ServiceKey, Service*>::iterator service_it = service_cache_.find (service_key);
145- if (service_it == service_cache_.end ()) {
146- service = new Service (service_key, ++next_service_id_);
147- service_cache_[service_key] = service;
148- } else {
145+ POLARIS_ASSERT (service_it == service_cache_.end ())
146+ service = new Service (service_key, ++next_service_id_);
147+ service_cache_[service_key] = service;
148+ pthread_rwlock_unlock (&rwlock_);
149+ return service;
150+ }
151+
152+ Service* InMemoryRegistry::GetServiceInLock (const ServiceKey& service_key) {
153+ Service* service = NULL ;
154+ pthread_rwlock_wrlock (&rwlock_);
155+ std::map<ServiceKey, Service*>::iterator service_it = service_cache_.find (service_key);
156+ if (service_it != service_cache_.end ()) {
149157 service = service_it->second ;
150158 }
151159 pthread_rwlock_unlock (&rwlock_);
152160 return service;
153161}
154162
163+ void InMemoryRegistry::DeleteServiceInLock (const ServiceKey& service_key) {
164+ pthread_rwlock_wrlock (&rwlock_);
165+ std::map<ServiceKey, Service*>::iterator service_it = service_cache_.find (service_key);
166+ if (service_it != service_cache_.end ()) {
167+ delete service_it->second ;
168+ service_cache_.erase (service_it);
169+ }
170+ pthread_rwlock_unlock (&rwlock_);
171+ }
172+
155173void InMemoryRegistry::CheckExpireServiceData (uint64_t min_access_time,
156174 RcuMap<ServiceKey, ServiceData>& rcu_cache,
157175 ServiceDataType service_data_type) {
@@ -166,17 +184,16 @@ void InMemoryRegistry::CheckExpireServiceData(uint64_t min_access_time,
166184 if (service_data_notify_map_.erase (service_key_with_type) > 0 ) { // 有通知对象表示注册过handler
167185 context_->GetServerConnector ()->DeregisterEventHandler (expired_services[i],
168186 service_data_type);
169- } else { // 没有通知对象,表示未注册过handler,从磁盘加载后从未访问过的数据,直接删除数据
170- rcu_cache.Delete (expired_services[i]);
171- context_impl->GetServiceRecord ()->ServiceDataDelete (expired_services[i], service_data_type);
172- context_impl->GetCacheManager ()->GetCachePersist ().PersistServiceData (expired_services[i],
173- service_data_type, " " );
174187 }
175- pthread_rwlock_unlock (¬ify_rwlock_);
176188 if (service_data_type == kServiceDataInstances ) { // 清除实例数据时对应的服务级别插件也删除
177189 context_impl->DeleteServiceContext (expired_services[i]);
178190 DeleteServiceInLock (expired_services[i]);
179191 }
192+ rcu_cache.Delete (expired_services[i]);
193+ context_impl->GetServiceRecord ()->ServiceDataDelete (expired_services[i], service_data_type);
194+ context_impl->GetCacheManager ()->GetCachePersist ().PersistServiceData (expired_services[i],
195+ service_data_type, " " );
196+ pthread_rwlock_unlock (¬ify_rwlock_);
180197 }
181198}
182199
@@ -249,6 +266,9 @@ ReturnCode InMemoryRegistry::LoadServiceDataWithNotify(const ServiceKey& service
249266 if (interval_it != service_interval_map_.end ()) {
250267 refresh_interval = interval_it->second ;
251268 }
269+ if (data_type == kServiceDataInstances ) {
270+ CreateServiceInLock (service_key);
271+ }
252272 // 先加载磁盘缓存数据
253273 CachePersist& cache_persist = context_->GetContextImpl ()->GetCacheManager ()->GetCachePersist ();
254274 ServiceData* disk_service_data = cache_persist.LoadServiceData (service_key, data_type);
@@ -269,25 +289,21 @@ ReturnCode InMemoryRegistry::LoadServiceDataWithNotify(const ServiceKey& service
269289 return kReturnOk ;
270290}
271291
272- void InMemoryRegistry::DeleteServiceInLock (const ServiceKey& service_key) {
273- pthread_rwlock_wrlock (&rwlock_);
274- std::map<ServiceKey, Service*>::iterator service_it = service_cache_.find (service_key);
275- if (service_it != service_cache_.end ()) {
276- delete service_it->second ;
277- service_cache_.erase (service_it);
278- }
279- pthread_rwlock_unlock (&rwlock_);
280- }
281-
282292ReturnCode InMemoryRegistry::UpdateServiceData (const ServiceKey& service_key,
283293 ServiceDataType data_type,
284294 ServiceData* service_data) {
285- if (service_data != NULL ) { // 更新服务数据指向服务
286- Service* service = GetOrCreateServiceInLock (service_key);
295+ Service* service = GetServiceInLock (service_key);
296+ if ( service != NULL ) { // 更新服务数据指向服务
287297 service->UpdateData (service_data);
288298 }
289299 ContextImpl* context_impl = context_->GetContextImpl ();
290300 if (data_type == kServiceDataInstances ) {
301+ if (service == NULL ) { // 服务被反注册了
302+ if (service_data != NULL ) {
303+ service_data->DecrementRef ();
304+ }
305+ return kReturnOk ;
306+ }
291307 ServiceData* old_service_data = service_instances_data_.Get (service_key);
292308 if (old_service_data != NULL ) {
293309 PluginManager::Instance ().OnPreUpdateServiceData (old_service_data, service_data);
@@ -308,14 +324,6 @@ ReturnCode InMemoryRegistry::UpdateServiceData(const ServiceKey& service_key,
308324 POLARIS_ASSERT (false );
309325 }
310326 if (service_data == NULL ) { // Server Connector反注册Handler触发更新为NULL
311- if (data_type == kServiceDataInstances ) { // 删除服务实例数据时,同时删除服务
312- context_impl->DeleteServiceContext (service_key);
313- DeleteServiceInLock (service_key);
314- }
315- context_impl->GetServiceRecord ()->ServiceDataDelete (service_key,
316- data_type); // 同步记录Service数据删除
317- context_impl->GetCacheManager ()->GetCachePersist ().PersistServiceData (
318- service_key, data_type, " " ); // 异步删除磁盘服务数据
319327 return kReturnOk ;
320328 }
321329 context_impl->GetServiceRecord ()->ServiceDataUpdate (service_data); // 同步记录Service版本变化
0 commit comments