You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@dubbo.apache.org by hu...@apache.org on 2019/04/17 02:55:30 UTC
[incubator-dubbo] branch master updated: [DUBBO-3746] Bugfix:
infinite loop in AbstractRegistry when IOException. fix #3746 (#3748)
This is an automated email from the ASF dual-hosted git repository.
huxing pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-dubbo.git
The following commit(s) were added to refs/heads/master by this push:
new b7e4f38 [DUBBO-3746] Bugfix: infinite loop in AbstractRegistry when IOException. fix #3746 (#3748)
b7e4f38 is described below
commit b7e4f3842f39f978bfa49dcee61d7d590b765760
Author: kezhenxu94 <ke...@163.com>
AuthorDate: Wed Apr 17 10:55:20 2019 +0800
[DUBBO-3746] Bugfix: infinite loop in AbstractRegistry when IOException. fix #3746 (#3748)
---
.../org/apache/dubbo/registry/support/AbstractRegistry.java | 13 ++++++++++++-
1 file changed, 12 insertions(+), 1 deletion(-)
diff --git a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/support/AbstractRegistry.java b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/support/AbstractRegistry.java
index 31cdbf8..cfe3299 100644
--- a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/support/AbstractRegistry.java
+++ b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/support/AbstractRegistry.java
@@ -48,6 +48,7 @@ import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
+import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.atomic.AtomicLong;
import java.util.concurrent.atomic.AtomicReference;
@@ -60,6 +61,8 @@ public abstract class AbstractRegistry implements Registry {
private static final char URL_SEPARATOR = ' ';
// URL address separated regular expression for parsing the service provider URL list in the file cache
private static final String URL_SPLIT = "\\s+";
+ // Max times to retry to save properties to local cache file
+ private static final int MAX_RETRY_TIMES_SAVE_PROPERTIES = 3;
// Log output
protected final Logger logger = LoggerFactory.getLogger(getClass());
// Local disk cache, where the special key value.registries records the list of registry centers, and the others are the list of notified service providers
@@ -69,6 +72,7 @@ public abstract class AbstractRegistry implements Registry {
// Is it synchronized to save the file
private final boolean syncSaveFile;
private final AtomicLong lastCacheChanged = new AtomicLong();
+ private final AtomicInteger savePropertiesRetryTimes = new AtomicInteger();
private final Set<URL> registered = new ConcurrentHashSet<>();
private final ConcurrentMap<URL, Set<NotifyListener>> subscribed = new ConcurrentHashMap<>();
private final ConcurrentMap<URL, Map<String, List<URL>>> notified = new ConcurrentHashMap<>();
@@ -174,12 +178,19 @@ public abstract class AbstractRegistry implements Registry {
}
}
} catch (Throwable e) {
+ savePropertiesRetryTimes.incrementAndGet();
+ if (savePropertiesRetryTimes.get() >= MAX_RETRY_TIMES_SAVE_PROPERTIES) {
+ logger.warn("Failed to save registry cache file after retrying " + MAX_RETRY_TIMES_SAVE_PROPERTIES + " times, cause: " + e.getMessage(), e);
+ savePropertiesRetryTimes.set(0);
+ return;
+ }
if (version < lastCacheChanged.get()) {
+ savePropertiesRetryTimes.set(0);
return;
} else {
registryCacheExecutor.execute(new SaveProperties(lastCacheChanged.incrementAndGet()));
}
- logger.warn("Failed to save registry cache file, cause: " + e.getMessage(), e);
+ logger.warn("Failed to save registry cache file, will retry, cause: " + e.getMessage(), e);
}
}