diff --git a/src/main/java/com/actiontech/dble/cluster/ClusterHelper.java b/src/main/java/com/actiontech/dble/cluster/ClusterHelper.java index be7b3c4215..59c2e666cc 100644 --- a/src/main/java/com/actiontech/dble/cluster/ClusterHelper.java +++ b/src/main/java/com/actiontech/dble/cluster/ClusterHelper.java @@ -11,6 +11,7 @@ import com.actiontech.dble.cluster.path.ChildPathMeta; import com.actiontech.dble.cluster.path.PathMeta; import com.actiontech.dble.cluster.values.*; +import com.actiontech.dble.services.manager.response.ReloadConfig; import org.apache.logging.log4j.util.Strings; import javax.annotation.Nonnull; @@ -114,12 +115,12 @@ public static Map getOnlineMap() { return ClusterGeneralConfig.getInstance().getClusterSender().getOnlineMap(); } - public static void writeConfToCluster() throws Exception { + public static void writeConfToCluster(ReloadConfig.ReloadResult reloadResult) throws Exception { ClusterLogic.forConfig().syncSequenceJsonToCluster(); ClusterLogic.forConfig().syncDbJsonToCluster(); ClusterLogic.forConfig().syncShardingJsonToCluster(); ClusterLogic.forConfig().syncUseJsonToCluster(); - ClusterLogic.forHA().syncDbGroupStatusToCluster(); + ClusterLogic.forHA().syncDbGroupStatusToCluster(reloadResult); } @Nullable diff --git a/src/main/java/com/actiontech/dble/cluster/logic/ConfigClusterLogic.java b/src/main/java/com/actiontech/dble/cluster/logic/ConfigClusterLogic.java index f40e4f216e..12063ecbc9 100644 --- a/src/main/java/com/actiontech/dble/cluster/logic/ConfigClusterLogic.java +++ b/src/main/java/com/actiontech/dble/cluster/logic/ConfigClusterLogic.java @@ -85,8 +85,8 @@ public void reloadConfigEvent(ConfStatus value, String params) throws Exception return; } try { - boolean result = ReloadConfig.reloadByConfig(Integer.parseInt(params), false); - if (!checkLocalResult(result)) { + ReloadConfig.ReloadResult result = ReloadConfig.reloadByConfig(Integer.parseInt(params), false); + if (!checkLocalResult(result.isSuccess())) { return; } } catch (Exception e) { diff --git a/src/main/java/com/actiontech/dble/cluster/logic/HAClusterLogic.java b/src/main/java/com/actiontech/dble/cluster/logic/HAClusterLogic.java index 57c3828691..168e7f022a 100644 --- a/src/main/java/com/actiontech/dble/cluster/logic/HAClusterLogic.java +++ b/src/main/java/com/actiontech/dble/cluster/logic/HAClusterLogic.java @@ -16,6 +16,7 @@ import com.actiontech.dble.cluster.zkprocess.entity.dbGroups.DBGroup; import com.actiontech.dble.cluster.zkprocess.entity.dbGroups.DBInstance; import com.actiontech.dble.config.model.SystemConfig; +import com.actiontech.dble.services.manager.response.ReloadConfig; import com.actiontech.dble.singleton.HaConfigManager; import com.google.gson.Gson; import com.google.gson.JsonElement; @@ -86,6 +87,30 @@ public void syncDbGroupStatusToCluster() throws Exception { LOGGER.info("syncDbGroupStatusToCluster success"); } + public void syncDbGroupStatusToCluster(ReloadConfig.ReloadResult reloadResult) throws Exception { + LOGGER.info("syncDbGroupStatusToCluster start"); + HaConfigManager.getInstance().init(true); + Map dbGroupStatusMap = HaConfigManager.getInstance().getSourceJsonList(); + + Map recycleHostMap = reloadResult.getRecycleHostMap(); + if (recycleHostMap != null) { + for (Map.Entry groupEntry : recycleHostMap.entrySet()) { + String dbGroupName = groupEntry.getKey(); + LOGGER.debug("delete dbGroup_status:{}", dbGroupName); + clusterHelper.cleanKV(ClusterMetaUtil.getHaStatusPath(dbGroupName)); + } + } + Map addOrChangeHostMap = reloadResult.getAddOrChangeHostMap(); + if (addOrChangeHostMap != null) { + for (Map.Entry groupEntry : addOrChangeHostMap.entrySet()) { + RawJson dbGroupStatusJson = dbGroupStatusMap.get(groupEntry.getKey()); + LOGGER.debug("add dbGroup_status:{}---{}", groupEntry.getKey(), dbGroupStatusJson); + clusterHelper.setKV(ClusterMetaUtil.getHaStatusPath(groupEntry.getKey()), dbGroupStatusJson); + } + } + LOGGER.info("syncDbGroupStatusToCluster success"); + } + void syncHaStatusFromCluster(Gson gson, DbGroups dbs, List dbGroupList) { try { List> statusKVList = this.getKVBeanOfChildPath(ClusterChildMetaUtil.getHaStatusPath()); diff --git a/src/main/java/com/actiontech/dble/services/manager/response/ReloadConfig.java b/src/main/java/com/actiontech/dble/services/manager/response/ReloadConfig.java index 47447499e3..e76641ed59 100644 --- a/src/main/java/com/actiontech/dble/services/manager/response/ReloadConfig.java +++ b/src/main/java/com/actiontech/dble/services/manager/response/ReloadConfig.java @@ -140,14 +140,14 @@ private static void reloadWithCluster(ManagerService service, int loadAllMode, C lock.writeLock().lock(); try { //step 2 reload the local config file - boolean reloadResult; + ReloadResult reloadResult; if (confStatus.getStatus().equals(ConfStatus.Status.MANAGER_INSERT) || confStatus.getStatus().equals(ConfStatus.Status.MANAGER_UPDATE) || confStatus.getStatus().equals(ConfStatus.Status.MANAGER_DELETE)) { reloadResult = reloadByConfig(loadAllMode, true); } else { reloadResult = reloadByLocalXml(loadAllMode); } - if (!reloadResult) { + if (!reloadResult.isSuccess()) { packetResult.setSuccess(false); packetResult.setErrorMsg("Reload Failure.The reason is reload interruputed by others,config should be reload"); packetResult.setErrorCode(ErrorCode.ER_RELOAD_INTERRUPUTED); @@ -157,7 +157,7 @@ private static void reloadWithCluster(ManagerService service, int loadAllMode, C ClusterDelayProvider.delayAfterMasterLoad(); //step 3 if the reload with no error ,than write the config file into cluster center remote - ClusterHelper.writeConfToCluster(); + ClusterHelper.writeConfToCluster(reloadResult); ReloadLogHelper.info("reload config: sent config file to cluster center", LOGGER); //step 4 write the reload flag and self reload result into cluster center,notify the other dble to reload @@ -207,17 +207,17 @@ private static void reloadWithoutCluster(ManagerService service, final int loadA packetResult.setErrorCode(ErrorCode.ER_YES); return; } - boolean reloadResult; + ReloadResult reloadResult; if (confStatus.getStatus().equals(ConfStatus.Status.MANAGER_INSERT) || confStatus.getStatus().equals(ConfStatus.Status.MANAGER_UPDATE) || confStatus.getStatus().equals(ConfStatus.Status.MANAGER_DELETE)) { reloadResult = reloadByConfig(loadAllMode, true); } else { reloadResult = reloadByLocalXml(loadAllMode); } - if (reloadResult && returnFlag) { + if (reloadResult.isSuccess() && returnFlag) { // ok package return; - } else if (!reloadResult) { + } else if (!reloadResult.isSuccess()) { packetResult.setSuccess(false); packetResult.setErrorMsg("Reload Failure.The reason is reload interruputed by others,metadata should be reload"); packetResult.setErrorCode(ErrorCode.ER_RELOAD_INTERRUPUTED); @@ -235,11 +235,11 @@ private static void writeErrorResult(ManagerService c, String errorMsg) { c.writeErrMessage(ErrorCode.ER_YES, sb); } - public static boolean reloadByLocalXml(final int loadAllMode) throws Exception { + public static ReloadResult reloadByLocalXml(final int loadAllMode) throws Exception { return reload(loadAllMode, null, null, null, null); } - public static boolean reloadByConfig(final int loadAllMode, boolean isWriteToLocal) throws Exception { + public static ReloadResult reloadByConfig(final int loadAllMode, boolean isWriteToLocal) throws Exception { RawJson userConfig = DbleTempConfig.getInstance().getUserConfig(); userConfig = userConfig == null ? DbleServer.getInstance().getConfig().getUserConfig() : userConfig; RawJson dbConfig = DbleTempConfig.getInstance().getDbConfig(); @@ -248,14 +248,14 @@ public static boolean reloadByConfig(final int loadAllMode, boolean isWriteToLoc shardingConfig = shardingConfig == null ? DbleServer.getInstance().getConfig().getShardingConfig() : shardingConfig; RawJson sequenceConfig = DbleTempConfig.getInstance().getSequenceConfig(); sequenceConfig = sequenceConfig == null ? DbleServer.getInstance().getConfig().getSequenceConfig() : sequenceConfig; - boolean reloadResult = reload(loadAllMode, userConfig, dbConfig, shardingConfig, sequenceConfig); + ReloadResult reloadResult = reload(loadAllMode, userConfig, dbConfig, shardingConfig, sequenceConfig); DbleTempConfig.getInstance().clean(); //sync json to local DbleServer.getInstance().getConfig().syncJsonToLocal(isWriteToLocal); return reloadResult; } - private static boolean reload(final int loadAllMode, RawJson userConfig, RawJson dbConfig, RawJson shardingConfig, RawJson sequenceConfig) throws Exception { + private static ReloadResult reload(final int loadAllMode, RawJson userConfig, RawJson dbConfig, RawJson shardingConfig, RawJson sequenceConfig) throws Exception { TraceManager.TraceObject traceObject = TraceManager.threadTrace("self-reload"); try { // load configuration @@ -323,7 +323,7 @@ private static boolean reload(final int loadAllMode, RawJson userConfig, RawJson if (!loader.isFullyConfigured()) { recycleServerConnections(); } - return result; + return packReloadResult(result, changeItemList, forceAllReload, newDbGroups, oldConfig.getDbGroups()); } catch (Exception e) { initFailed(newDbGroups); throw e; @@ -333,6 +333,36 @@ private static boolean reload(final int loadAllMode, RawJson userConfig, RawJson } } + private static ReloadResult packReloadResult(boolean result, List changeItemList, + boolean forceAllReload, + Map newDbGroups, + Map oldDbGroups) { + if (forceAllReload) { + return new ReloadResult(result, newDbGroups, oldDbGroups); + } else { + Map addOrChangeMap0 = new HashMap<>(); + Map recycleMap0 = new HashMap<>(); + for (ChangeItem changeItem : changeItemList) { + if (changeItem.getItemType() == ChangeItemType.PHYSICAL_DB_GROUP) { + PhysicalDbGroup dbGroup = ((PhysicalDbGroup) changeItem.getItem()); + switch (changeItem.getType()) { + case ADD: + case UPDATE: + addOrChangeMap0.put(dbGroup.getGroupName(), dbGroup); + break; + case DELETE: + recycleMap0.put(dbGroup.getGroupName(), dbGroup); + break; + default: + break; + } + } + } + return new ReloadResult(result, addOrChangeMap0, recycleMap0); + } + } + + /** * check version/packetSize/lowerCase * get system variables @@ -640,4 +670,28 @@ private static void writePacket(boolean isSuccess, ManagerService service, Strin } } + + public static class ReloadResult { // dbGroup + private final boolean success; + private final Map addOrChangeHostMap; + private final Map recycleHostMap; + + public ReloadResult(boolean success, Map addOrChangeHostMap, Map recycleHostMap) { + this.success = success; + this.addOrChangeHostMap = addOrChangeHostMap; + this.recycleHostMap = recycleHostMap; + } + + public boolean isSuccess() { + return success; + } + + public Map getAddOrChangeHostMap() { + return addOrChangeHostMap; + } + + public Map getRecycleHostMap() { + return recycleHostMap; + } + } }