From 115a74369bfdc42cd1ffd2a0f289aedeb66f5119 Mon Sep 17 00:00:00 2001 From: yanhuqing666 Date: Wed, 23 Aug 2017 15:28:04 +0800 Subject: [PATCH] #236 rollback config --- .../java/io/mycat/config/MycatConfig.java | 19 ++++- .../manager/response/RollbackConfig.java | 77 ++++++++++--------- .../parser/druid/impl/DruidSelectParser.java | 5 -- 3 files changed, 57 insertions(+), 44 deletions(-) diff --git a/src/main/java/io/mycat/config/MycatConfig.java b/src/main/java/io/mycat/config/MycatConfig.java index 6103c347f7..8c4b6f9580 100644 --- a/src/main/java/io/mycat/config/MycatConfig.java +++ b/src/main/java/io/mycat/config/MycatConfig.java @@ -217,9 +217,24 @@ public void reload(Map newUsers, Map n this.status = reloadAll ? RELOAD_ALL : RELOAD; } + public boolean canRollbackAll() { + if (status != RELOAD_ALL) { + return false; + } else if (users2 == null || schemas2 == null || firewall2 == null || dataNodes2 == null || dataHosts2 == null) { + return false; + } else { + return true; + } + } + public boolean canRollback() { - return users2 != null && schemas2 != null && dataNodes2 != null && dataHosts2 != null && - firewall2 != null && status != ROLLBACK; + if (status != RELOAD) { + return false; + } else if (users2 == null || schemas2 == null || firewall2 == null) { + return false; + } else { + return true; + } } public void rollback(Map backupUsers, Map backupSchemas, diff --git a/src/main/java/io/mycat/manager/response/RollbackConfig.java b/src/main/java/io/mycat/manager/response/RollbackConfig.java index 2cc914a6d0..fa2882bc1d 100644 --- a/src/main/java/io/mycat/manager/response/RollbackConfig.java +++ b/src/main/java/io/mycat/manager/response/RollbackConfig.java @@ -129,7 +129,7 @@ private static void writeOKResult(ManagerConnection c) { } private static void writeErrorResult(ManagerConnection c, String errorMsg) { - String sb = "Rollback config failure.The reason is " + errorMsg; + String sb = "Rollback config failure.The reason is that " + errorMsg; LOGGER.warn(sb + "." + String.valueOf(c)); c.writeErrMessage(ErrorCode.ER_YES, sb); } @@ -137,48 +137,51 @@ private static void writeErrorResult(ManagerConnection c, String errorMsg) { public static void rollback() throws Exception { MycatConfig conf = MycatServer.getInstance().getConfig(); Map dataHosts = conf.getBackupDataHosts(); - - // 检查可回滚状态 - if (!conf.canRollback()) { - throw new Exception("Conf can not be rollback because of no old version"); - } - - // 如果回滚已经存在的pool - boolean rollbackStatus = true; - String errorMsg = null; - for (PhysicalDBPool dn : dataHosts.values()) { - dn.init(dn.getActiveIndex()); - if (!dn.isInitSuccess()) { - rollbackStatus = false; - errorMsg = "dataHost" + dn.getHostName() + " inited failure"; - break; - } - } - // 如果回滚不成功,则清理已初始化的资源。 - if (!rollbackStatus) { - for (PhysicalDBPool dn : dataHosts.values()) { - dn.clearDataSources("rollbackup config"); - dn.stopHeartbeat(); - } - throw new Exception(errorMsg); - } - // 应用回滚 Map users = conf.getBackupUsers(); Map schemas = conf.getBackupSchemas(); Map dataNodes = conf.getBackupDataNodes(); FirewallConfig firewall = conf.getBackupFirewall(); Map> erRelations = conf.getBackupErRelations(); conf.rollback(users, schemas, dataNodes, dataHosts, erRelations, firewall); - - // 处理旧的资源 - Map cNodes = conf.getDataHosts(); - for (PhysicalDBPool dn : cNodes.values()) { - dn.clearDataSources("clear old config "); - dn.stopHeartbeat(); + // 检查可回滚状态 + if (conf.canRollback()) { + conf.rollback(users, schemas, dataNodes, dataHosts, erRelations, firewall); + //清理缓存 + MycatServer.getInstance().getCacheService().clearCache(); + MycatServer.getInstance().reloadMetaData(); + } else if (conf.canRollbackAll()) { + Map cNodes = conf.getDataHosts(); + // 如果回滚已经存在的pool + boolean rollbackStatus = true; + String errorMsg = null; + for (PhysicalDBPool dn : dataHosts.values()) { + dn.init(dn.getActiveIndex()); + if (!dn.isInitSuccess()) { + rollbackStatus = false; + errorMsg = "dataHost[" + dn.getHostName() + "] inited failure"; + break; + } + } + // 如果回滚不成功,则清理已初始化的资源。 + if (!rollbackStatus && dataHosts != null) { + for (PhysicalDBPool dn : dataHosts.values()) { + dn.clearDataSources("rollbackup config"); + dn.stopHeartbeat(); + } + throw new Exception(errorMsg); + } + // 应用回滚 + conf.rollback(users, schemas, dataNodes, dataHosts, erRelations, firewall); + // 处理旧的资源 + for (PhysicalDBPool dn : cNodes.values()) { + dn.clearDataSources("clear old config "); + dn.stopHeartbeat(); + } + //清理缓存 + MycatServer.getInstance().getCacheService().clearCache(); + MycatServer.getInstance().reloadMetaData(); + } else { + throw new Exception("there is no old version"); } - - //清理缓存 - MycatServer.getInstance().getCacheService().clearCache(); - MycatServer.getInstance().reloadMetaData(); } } diff --git a/src/main/java/io/mycat/route/parser/druid/impl/DruidSelectParser.java b/src/main/java/io/mycat/route/parser/druid/impl/DruidSelectParser.java index 7436d0d828..1136ffe1cc 100644 --- a/src/main/java/io/mycat/route/parser/druid/impl/DruidSelectParser.java +++ b/src/main/java/io/mycat/route/parser/druid/impl/DruidSelectParser.java @@ -298,7 +298,6 @@ private String getFieldName(SQLSelectItem item) { private Map parseAggGroupCommon(SchemaConfig schema, SQLStatement stmt, RouteResultset rrs, MySqlSelectQueryBlock mysqlSelectQuery, TableConfig tc) throws SQLException { Map aliaColumns = new HashMap<>(); - Map aggrColumns = new HashMap<>(); parseAggExprCommon(schema, rrs, mysqlSelectQuery, aliaColumns, tc); if (rrs.isNeedOptimizer()) { @@ -307,10 +306,6 @@ private Map parseAggGroupCommon(SchemaConfig schema, SQLStatemen return aliaColumns; } - if (aggrColumns.size() > 0) { - rrs.setMergeCols(aggrColumns); - } - // 通过优化转换成group by来实现 boolean isNeedChangeSql = (mysqlSelectQuery.getDistionOption() == SQLSetQuantifier.DISTINCT) || (mysqlSelectQuery.getDistionOption() == SQLSetQuantifier.DISTINCTROW); if (isNeedChangeSql) {