This is an automated email from the ASF dual-hosted git repository. liubao pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/incubator-servicecomb-java-chassis.git
commit 6c942b2aa3815bb45c0134d2f7e9c3242d377053 Author: heyile <heyi...@huawei.com> AuthorDate: Thu Aug 2 10:51:13 2018 +0800 consider multipul verticle is deployed, pull and push config at the same time --- .../config/client/ParseConfigUtils.java | 59 ++++++++++++++-------- 1 file changed, 39 insertions(+), 20 deletions(-) diff --git a/dynamic-config/config-cc/src/main/java/org/apache/servicecomb/config/client/ParseConfigUtils.java b/dynamic-config/config-cc/src/main/java/org/apache/servicecomb/config/client/ParseConfigUtils.java index 0ced4fd..b9e517e 100644 --- a/dynamic-config/config-cc/src/main/java/org/apache/servicecomb/config/client/ParseConfigUtils.java +++ b/dynamic-config/config-cc/src/main/java/org/apache/servicecomb/config/client/ParseConfigUtils.java @@ -21,6 +21,8 @@ import java.io.IOException; import java.util.HashMap; import java.util.LinkedHashMap; import java.util.Map; +import java.util.concurrent.locks.Lock; +import java.util.concurrent.locks.ReentrantLock; import org.apache.servicecomb.config.archaius.sources.ConfigCenterConfigurationSourceImpl.UpdateHandler; import org.apache.servicecomb.foundation.common.utils.JsonUtils; @@ -44,35 +46,52 @@ public class ParseConfigUtils { private UpdateHandler updateHandler; + private Lock configLock = new ReentrantLock(); + public ParseConfigUtils(UpdateHandler updateHandler) { this.updateHandler = updateHandler; } + /* + as the data is returned, we can block the thread at a short time. consider that if the multiple verticle is deployed + and if we use pull mode and push mode at the same time , we must share a common lock with all methods which would + change the config setting + */ public void refreshConfigItems(Map<String, Map<String, Object>> remoteItems) { - CURRENT_VERSION_INFO = - remoteItems.getOrDefault("revision", new HashMap<>()).getOrDefault("version", "default").toString(); - //make sure the CURRENT_VERSION_INFO != "" - CURRENT_VERSION_INFO = CURRENT_VERSION_INFO.equals("") ? "default" : CURRENT_VERSION_INFO; - remoteItems.remove("revision");//the key revision is not the config setting - multiDimensionItems.clear(); - multiDimensionItems.putAll(remoteItems); - doRefreshItems(); - LOGGER.debug("refresh config success"); + try { + configLock.lock(); + CURRENT_VERSION_INFO = + remoteItems.getOrDefault("revision", new HashMap<>()).getOrDefault("version", "default").toString(); + //make sure the CURRENT_VERSION_INFO != "" + CURRENT_VERSION_INFO = CURRENT_VERSION_INFO.equals("") ? "default" : CURRENT_VERSION_INFO; + remoteItems.remove("revision");//the key revision is not the config setting + multiDimensionItems.clear(); + multiDimensionItems.putAll(remoteItems); + doRefreshItems(); + LOGGER.debug("refresh config success"); + } finally { + configLock.unlock(); + } } public void refreshConfigItemsIncremental(Map<String, Object> action) { - if ("UPDATE".equals(action.get("action"))) { - try { - multiDimensionItems.put((String) action.get("key"), JsonUtils.OBJ_MAPPER - .readValue(action.get("value").toString(), new TypeReference<Map<String, Object>>() { - })); - } catch (IOException e) { - LOGGER.error("parse config change action fail"); + try { + configLock.lock(); + if ("UPDATE".equals(action.get("action"))) { + try { + multiDimensionItems.put((String) action.get("key"), JsonUtils.OBJ_MAPPER + .readValue(action.get("value").toString(), new TypeReference<Map<String, Object>>() { + })); + } catch (IOException e) { + LOGGER.error("parse config change action fail"); + } + doRefreshItems(); + } else if ("DELETE".equals(action.get("action"))) { + multiDimensionItems.remove(action.get("key")); + doRefreshItems(); } - doRefreshItems(); - } else if ("DELETE".equals(action.get("action"))) { - multiDimensionItems.remove(action.get("key")); - doRefreshItems(); + } finally { + configLock.unlock(); } }