From 7d091951d6a6b03fb6877241524a0058c74446a7 Mon Sep 17 00:00:00 2001 From: jianbin Date: Wed, 22 Jan 2025 14:17:03 +0800 Subject: [PATCH] bugfix: the issue of possible infinite loop when cleaning up expired metadata info --- .../registry/client/AbstractServiceDiscovery.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/AbstractServiceDiscovery.java b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/AbstractServiceDiscovery.java index 1189096a7c7..9be98d7667c 100644 --- a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/AbstractServiceDiscovery.java +++ b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/AbstractServiceDiscovery.java @@ -114,27 +114,27 @@ private AbstractServiceDiscovery(ApplicationModel applicationModel, String servi } private void removeExpiredMetadataInfo(int metadataInfoCacheSize, int metadataInfoCacheExpireTime) { - Long time = null; + Long nextTime = null; if (metadataInfos.size() > metadataInfoCacheSize) { List values = new ArrayList<>(metadataInfos.values()); values.sort(Comparator.comparingLong(MetadataInfoStat::getUpdateTime)); for (MetadataInfoStat v : values) { - time = System.currentTimeMillis() - v.getUpdateTime(); + long time = System.currentTimeMillis() - v.getUpdateTime(); if (time > metadataInfoCacheExpireTime) { metadataInfos.remove(v.metadataInfo.getRevision(), v); - time = null; } else { + nextTime = metadataInfoCacheExpireTime - time; break; } } } startRefreshCache( - time == null ? metadataInfoCacheExpireTime / 2 : time, + nextTime == null ? metadataInfoCacheExpireTime / 2 : nextTime, metadataInfoCacheSize, metadataInfoCacheExpireTime); } - private void startRefreshCache(long time, int metadataInfoCacheSize, int metadataInfoCacheExpireTime) { + private void startRefreshCache(long nextTime, int metadataInfoCacheSize, int metadataInfoCacheExpireTime) { this.refreshCacheFuture = applicationModel .getFrameworkModel() .getBeanFactory() @@ -142,7 +142,7 @@ private void startRefreshCache(long time, int metadataInfoCacheSize, int metadat .getSharedScheduledExecutor() .schedule( () -> removeExpiredMetadataInfo(metadataInfoCacheSize, metadataInfoCacheExpireTime), - time, + nextTime, TimeUnit.MILLISECONDS); }