You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@shardingsphere.apache.org by ji...@apache.org on 2023/06/28 06:11:36 UTC

[shardingsphere] branch master updated: Refactor DistSQL export/import metadata support broadcast & single (#26640)

This is an automated email from the ASF dual-hosted git repository.

jianglongtao pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/shardingsphere.git


The following commit(s) were added to refs/heads/master by this push:
     new 7b07f47d44f Refactor DistSQL export/import metadata support broadcast & single (#26640)
7b07f47d44f is described below

commit 7b07f47d44f4fbe865e3215dcead04e96be67771
Author: ChenJiaHao <Pa...@163.com>
AuthorDate: Wed Jun 28 14:11:30 2023 +0800

    Refactor DistSQL export/import metadata support broadcast & single (#26640)
    
    * Refactor DistSQL export/import metadata support broadcast & single
    
    * Fix UT
---
 .../ral/queryable/ExportMetaDataExecutor.java      |  6 ++--
 .../ral/updatable/ImportMetaDataUpdater.java       |  2 +-
 .../YamlDatabaseConfigurationImportExecutor.java   | 32 ++++++++++++++++++++++
 .../ral/updatable/ImportMetaDataUpdaterTest.java   |  2 +-
 .../test/resources/conf/import/empty-metadata.data |  1 -
 .../test/resources/conf/import/empty-metadata.json |  1 +
 6 files changed, 38 insertions(+), 6 deletions(-)

diff --git a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/queryable/ExportMetaDataExecutor.java b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/queryable/ExportMetaDataExecutor.java
index 885dede4023..d1ebbc235a8 100644
--- a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/queryable/ExportMetaDataExecutor.java
+++ b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/queryable/ExportMetaDataExecutor.java
@@ -65,8 +65,8 @@ public final class ExportMetaDataExecutor implements MetaDataRequiredQueryableRA
             return Collections.singleton(new LocalDataQueryResultRow(ProxyContext.getInstance().getContextManager().getInstanceContext().getInstance().getCurrentInstanceId(), LocalDateTime.now(),
                     String.format("Successfully exported to:'%s'", filePath)));
         }
-        return Collections.singleton(
-                new LocalDataQueryResultRow(ProxyContext.getInstance().getContextManager().getInstanceContext().getInstance().getCurrentInstanceId(), LocalDateTime.now(), exportedData));
+        return Collections.singleton(new LocalDataQueryResultRow(
+                ProxyContext.getInstance().getContextManager().getInstanceContext().getInstance().getCurrentInstanceId(), LocalDateTime.now(), Base64.encodeBase64String(exportedData.getBytes())));
     }
     
     private String generateExportData(final ShardingSphereMetaData metaData) {
@@ -78,7 +78,7 @@ public final class ExportMetaDataExecutor implements MetaDataRequiredQueryableRA
         ExportedClusterInfo exportedClusterInfo = new ExportedClusterInfo();
         exportedClusterInfo.setMetaData(exportedMetaData);
         generateSnapshotInfo(metaData, exportedClusterInfo);
-        return Base64.encodeBase64String(JsonUtils.toJsonString(exportedClusterInfo).getBytes());
+        return JsonUtils.toJsonString(exportedClusterInfo);
     }
     
     private Map<String, String> getDatabases(final ProxyContext proxyContext) {
diff --git a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/ImportMetaDataUpdater.java b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/ImportMetaDataUpdater.java
index 8ccc7731baf..d0666dfd1a2 100644
--- a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/ImportMetaDataUpdater.java
+++ b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/ImportMetaDataUpdater.java
@@ -54,7 +54,7 @@ public final class ImportMetaDataUpdater implements RALUpdater<ImportMetaDataSta
         if (sqlStatement.getFilePath().isPresent()) {
             File file = new File(sqlStatement.getFilePath().get());
             try {
-                jsonMetaDataConfig = new String(Base64.decodeBase64(FileUtils.readFileToString(file, Charset.defaultCharset())));
+                jsonMetaDataConfig = FileUtils.readFileToString(file, Charset.defaultCharset());
             } catch (final IOException ex) {
                 throw new FileIOException(ex);
             }
diff --git a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/util/YamlDatabaseConfigurationImportExecutor.java b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/util/YamlDatabaseConfigurationImportExecutor.java
index e6e81da86c4..63b48149062 100644
--- a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/util/YamlDatabaseConfigurationImportExecutor.java
+++ b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/util/YamlDatabaseConfigurationImportExecutor.java
@@ -18,6 +18,10 @@
 package org.apache.shardingsphere.proxy.backend.util;
 
 import com.zaxxer.hikari.HikariDataSource;
+import org.apache.shardingsphere.broadcast.api.config.BroadcastRuleConfiguration;
+import org.apache.shardingsphere.broadcast.rule.BroadcastRule;
+import org.apache.shardingsphere.broadcast.yaml.config.YamlBroadcastRuleConfiguration;
+import org.apache.shardingsphere.broadcast.yaml.swapper.YamlBroadcastRuleConfigurationSwapper;
 import org.apache.shardingsphere.distsql.handler.exception.DistSQLException;
 import org.apache.shardingsphere.distsql.handler.exception.datasource.MissingRequiredDataSourcesException;
 import org.apache.shardingsphere.distsql.handler.exception.storageunit.InvalidStorageUnitsException;
@@ -68,6 +72,10 @@ import org.apache.shardingsphere.sharding.api.config.ShardingRuleConfiguration;
 import org.apache.shardingsphere.sharding.rule.ShardingRule;
 import org.apache.shardingsphere.sharding.yaml.config.YamlShardingRuleConfiguration;
 import org.apache.shardingsphere.sharding.yaml.swapper.YamlShardingRuleConfigurationSwapper;
+import org.apache.shardingsphere.single.api.config.SingleRuleConfiguration;
+import org.apache.shardingsphere.single.rule.SingleRule;
+import org.apache.shardingsphere.single.yaml.config.pojo.YamlSingleRuleConfiguration;
+import org.apache.shardingsphere.single.yaml.config.swapper.YamlSingleRuleConfigurationSwapper;
 
 import javax.sql.DataSource;
 import java.sql.SQLException;
@@ -192,6 +200,16 @@ public final class YamlDatabaseConfigurationImportExecutor {
                 MaskRuleConfiguration maskRuleConfig = swapper.swapToObject((YamlMaskRuleConfiguration) each);
                 ruleConfigsMap.computeIfAbsent(swapper.getOrder(), key -> new LinkedList<>());
                 ruleConfigsMap.get(swapper.getOrder()).add(maskRuleConfig);
+            } else if (each instanceof YamlBroadcastRuleConfiguration) {
+                YamlBroadcastRuleConfigurationSwapper swapper = new YamlBroadcastRuleConfigurationSwapper();
+                BroadcastRuleConfiguration maskRuleConfig = swapper.swapToObject((YamlBroadcastRuleConfiguration) each);
+                ruleConfigsMap.computeIfAbsent(swapper.getOrder(), key -> new LinkedList<>());
+                ruleConfigsMap.get(swapper.getOrder()).add(maskRuleConfig);
+            } else if (each instanceof YamlSingleRuleConfiguration) {
+                YamlSingleRuleConfigurationSwapper swapper = new YamlSingleRuleConfigurationSwapper();
+                SingleRuleConfiguration maskRuleConfig = swapper.swapToObject((YamlSingleRuleConfiguration) each);
+                ruleConfigsMap.computeIfAbsent(swapper.getOrder(), key -> new LinkedList<>());
+                ruleConfigsMap.get(swapper.getOrder()).add(maskRuleConfig);
             }
         }
         ruleConfigsMap.keySet().stream().sorted(Comparator.reverseOrder()).collect(Collectors.toList())
@@ -216,6 +234,10 @@ public final class YamlDatabaseConfigurationImportExecutor {
             ruleConfigs.forEach(each -> addShadowRuleConfiguration((ShadowRuleConfiguration) each, allRuleConfigs, database));
         } else if (ruleConfig instanceof MaskRuleConfiguration) {
             ruleConfigs.forEach(each -> addMaskRuleConfiguration((MaskRuleConfiguration) each, allRuleConfigs, database));
+        } else if (ruleConfig instanceof BroadcastRuleConfiguration) {
+            ruleConfigs.forEach(each -> addBroadcastRuleConfiguration((BroadcastRuleConfiguration) each, allRuleConfigs, database));
+        } else if (ruleConfig instanceof SingleRuleConfiguration) {
+            ruleConfigs.forEach(each -> addSingleRuleConfiguration((SingleRuleConfiguration) each, allRuleConfigs, database));
         }
     }
     
@@ -253,6 +275,16 @@ public final class YamlDatabaseConfigurationImportExecutor {
         database.getRuleMetaData().getRules().add(new MaskRule(maskRuleConfig));
     }
     
+    private void addBroadcastRuleConfiguration(final BroadcastRuleConfiguration broadcastRuleConfig, final Collection<RuleConfiguration> allRuleConfigs, final ShardingSphereDatabase database) {
+        allRuleConfigs.add(broadcastRuleConfig);
+        database.getRuleMetaData().getRules().add(new BroadcastRule(broadcastRuleConfig, database.getName(), database.getResourceMetaData().getDataSources()));
+    }
+    
+    private void addSingleRuleConfiguration(final SingleRuleConfiguration broadcastRuleConfig, final Collection<RuleConfiguration> allRuleConfigs, final ShardingSphereDatabase database) {
+        allRuleConfigs.add(broadcastRuleConfig);
+        database.getRuleMetaData().getRules().add(new SingleRule(broadcastRuleConfig, database.getName(), database.getResourceMetaData().getDataSources(), database.getRuleMetaData().getRules()));
+    }
+    
     private void dropDatabase(final String databaseName) {
         ProxyContext.getInstance().getContextManager().getInstanceContext().getModeContextManager().dropDatabase(databaseName);
     }
diff --git a/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/ImportMetaDataUpdaterTest.java b/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/ImportMetaDataUpdaterTest.java
index 0a6e1de7487..fa2059f2161 100644
--- a/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/ImportMetaDataUpdaterTest.java
+++ b/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/ImportMetaDataUpdaterTest.java
@@ -71,7 +71,7 @@ class ImportMetaDataUpdaterTest {
     
     @BeforeEach
     void setup() {
-        featureMap.put(EMPTY, "/conf/import/empty-metadata.data");
+        featureMap.put(EMPTY, "/conf/import/empty-metadata.json");
     }
     
     @Test
diff --git a/proxy/backend/core/src/test/resources/conf/import/empty-metadata.data b/proxy/backend/core/src/test/resources/conf/import/empty-metadata.data
deleted file mode 100644
index e4184a20f34..00000000000
--- a/proxy/backend/core/src/test/resources/conf/import/empty-metadata.data
+++ /dev/null
@@ -1 +0,0 @@
-eyJtZXRhX2RhdGEiOnsiZGF0YWJhc2VzIjp7ImVtcHR5X21ldGFkYXRhIjoiZGF0YWJhc2VOYW1lOiBlbXB0eV9tZXRhZGF0YVxuIn0sInByb3BzIjoiIiwicnVsZXMiOiIifX0=
diff --git a/proxy/backend/core/src/test/resources/conf/import/empty-metadata.json b/proxy/backend/core/src/test/resources/conf/import/empty-metadata.json
new file mode 100644
index 00000000000..ede5beb0d9a
--- /dev/null
+++ b/proxy/backend/core/src/test/resources/conf/import/empty-metadata.json
@@ -0,0 +1 @@
+{"meta_data":{"databases":{"empty_metadata":"databaseName: empty_metadata\n"},"props":"","rules":""}}