This is an automated email from the ASF dual-hosted git repository.
tuichenchuxin 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 1167fc4d151 Add NewYamlConfigurationSwapper for new metadata structure
(#25886)
1167fc4d151 is described below
commit 1167fc4d151e3292ce8a6d6f6cb5c15feb2be013
Author: zhaojinchao <[email protected]>
AuthorDate: Mon May 29 18:31:44 2023 +0800
Add NewYamlConfigurationSwapper for new metadata structure (#25886)
* Add NewYamlConfigurationSwapper for new metadata structure
* Add
* Update
* Update metadata feature
* Fix checkstyle
* Fix ci
* Fix it
* Fix unit test
* Fix it
---
.../api/ReadwriteSplittingRuleConfiguration.java | 12 ++-
...ReadwriteSplittingRuleConfigurationSwapper.java | 76 +++++++++++++++++
...writeSplittingRuleConfigurationSwapperTest.java | 58 +++++++++++++
.../rule/NewYamlRuleConfigurationSwapper.java | 30 ++++---
.../NewYamlRuleConfigurationSwapperEngine.java | 69 ++++++++++++++++
.../infra/util/yaml/datanode/YamlDataNode.java | 20 ++---
.../yaml/swapper/NewYamlConfigurationSwapper.java | 31 ++++---
.../persist/MetaDataBasedPersistService.java | 3 +-
.../metadata/persist/MetaDataPersistService.java | 2 +-
.../persist/NewMetaDataPersistService.java | 2 +-
.../persist/node/NewDatabaseMetaDataNode.java | 10 +--
.../ReadwriteSplittingNodeConverter.java | 52 ++++++++++++
.../DataSourcePathProcessor.java} | 6 +-
.../database/DatabaseRulePersistService.java | 21 +----
...ce.java => NewDatabaseBasedPersistService.java} | 24 +++---
...ava => NewDatabaseRuleBasedPersistService.java} | 3 +-
.../database/NewDatabaseRulePersistService.java | 94 ++++++++++++++++++++++
.../manager/cluster/ClusterModeContextManager.java | 4 +-
.../YamlDatabaseConfigurationImportExecutor.java | 4 +-
19 files changed, 423 insertions(+), 98 deletions(-)
diff --git
a/features/readwrite-splitting/api/src/main/java/org/apache/shardingsphere/readwritesplitting/api/ReadwriteSplittingRuleConfiguration.java
b/features/readwrite-splitting/api/src/main/java/org/apache/shardingsphere/readwritesplitting/api/ReadwriteSplittingRuleConfiguration.java
index b921b4d8fac..ccd0c10f417 100644
---
a/features/readwrite-splitting/api/src/main/java/org/apache/shardingsphere/readwritesplitting/api/ReadwriteSplittingRuleConfiguration.java
+++
b/features/readwrite-splitting/api/src/main/java/org/apache/shardingsphere/readwritesplitting/api/ReadwriteSplittingRuleConfiguration.java
@@ -17,8 +17,10 @@
package org.apache.shardingsphere.readwritesplitting.api;
+import lombok.AllArgsConstructor;
+import lombok.NoArgsConstructor;
import lombok.Getter;
-import lombok.RequiredArgsConstructor;
+import lombok.Setter;
import org.apache.shardingsphere.infra.config.algorithm.AlgorithmConfiguration;
import
org.apache.shardingsphere.infra.config.rule.function.DistributedRuleConfiguration;
import
org.apache.shardingsphere.infra.config.rule.scope.DatabaseRuleConfiguration;
@@ -30,11 +32,13 @@ import java.util.Map;
/**
* Readwrite-splitting rule configuration.
*/
-@RequiredArgsConstructor
+@AllArgsConstructor
+@NoArgsConstructor
@Getter
+@Setter
public final class ReadwriteSplittingRuleConfiguration implements
DatabaseRuleConfiguration, DistributedRuleConfiguration {
- private final Collection<ReadwriteSplittingDataSourceRuleConfiguration>
dataSources;
+ private Collection<ReadwriteSplittingDataSourceRuleConfiguration>
dataSources;
- private final Map<String, AlgorithmConfiguration> loadBalancers;
+ private Map<String, AlgorithmConfiguration> loadBalancers;
}
diff --git
a/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/yaml/swapper/NewYamlReadwriteSplittingRuleConfigurationSwapper.java
b/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/yaml/swapper/NewYamlReadwriteSplittingRuleConfigurationSwapper.java
new file mode 100644
index 00000000000..3509b61a35e
--- /dev/null
+++
b/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/yaml/swapper/NewYamlReadwriteSplittingRuleConfigurationSwapper.java
@@ -0,0 +1,76 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.shardingsphere.readwritesplitting.yaml.swapper;
+
+import org.apache.shardingsphere.infra.config.algorithm.AlgorithmConfiguration;
+import org.apache.shardingsphere.infra.util.yaml.YamlEngine;
+import org.apache.shardingsphere.infra.util.yaml.datanode.YamlDataNode;
+import
org.apache.shardingsphere.infra.yaml.config.swapper.rule.NewYamlRuleConfigurationSwapper;
+import
org.apache.shardingsphere.metadata.persist.node.metadata.config.readwritesplitting.ReadwriteSplittingNodeConverter;
+import
org.apache.shardingsphere.readwritesplitting.api.ReadwriteSplittingRuleConfiguration;
+import
org.apache.shardingsphere.readwritesplitting.api.rule.ReadwriteSplittingDataSourceRuleConfiguration;
+import
org.apache.shardingsphere.readwritesplitting.constant.ReadwriteSplittingOrder;
+
+import java.util.Collections;
+import java.util.Collection;
+import java.util.LinkedHashSet;
+import java.util.Map.Entry;
+
+// TODO Rename YamlReadwriteSplittingRuleConfigurationSwapper when metadata
structure adjustment completed. #25485
+/**
+ * YAML readwrite-splitting rule configuration swapper.
+ */
+public final class NewYamlReadwriteSplittingRuleConfigurationSwapper
+ implements
+
NewYamlRuleConfigurationSwapper<ReadwriteSplittingRuleConfiguration> {
+
+ private final ReadwriteSplittingNodeConverter converter = new
ReadwriteSplittingNodeConverter();
+
+ @Override
+ public Collection<YamlDataNode> swapToDataNodes(final
ReadwriteSplittingRuleConfiguration data) {
+ Collection<YamlDataNode> result = new LinkedHashSet<>();
+ for (ReadwriteSplittingDataSourceRuleConfiguration each :
data.getDataSources()) {
+ result.add(new
YamlDataNode(converter.getGroupNamePath(each.getName()),
YamlEngine.marshal(each)));
+ }
+ for (Entry<String, AlgorithmConfiguration> entry :
data.getLoadBalancers().entrySet()) {
+ result.add(new
YamlDataNode(converter.getLoadBalancerPath(entry.getKey()),
YamlEngine.marshal(entry.getValue())));
+ }
+ return result;
+ }
+
+ @Override
+ public ReadwriteSplittingRuleConfiguration swapToObject(final
Collection<YamlDataNode> dataNodes) {
+ // TODO
+ return new
ReadwriteSplittingRuleConfiguration(Collections.emptyList(),
Collections.emptyMap());
+ }
+
+ @Override
+ public Class<ReadwriteSplittingRuleConfiguration> getTypeClass() {
+ return ReadwriteSplittingRuleConfiguration.class;
+ }
+
+ @Override
+ public String getRuleTagName() {
+ return "READWRITE_SPLITTING";
+ }
+
+ @Override
+ public int getOrder() {
+ return ReadwriteSplittingOrder.ORDER;
+ }
+}
diff --git
a/features/readwrite-splitting/core/src/test/java/org/apache/shardingsphere/readwritesplitting/yaml/swapper/NewYamlReadwriteSplittingRuleConfigurationSwapperTest.java
b/features/readwrite-splitting/core/src/test/java/org/apache/shardingsphere/readwritesplitting/yaml/swapper/NewYamlReadwriteSplittingRuleConfigurationSwapperTest.java
new file mode 100644
index 00000000000..c8156c806db
--- /dev/null
+++
b/features/readwrite-splitting/core/src/test/java/org/apache/shardingsphere/readwritesplitting/yaml/swapper/NewYamlReadwriteSplittingRuleConfigurationSwapperTest.java
@@ -0,0 +1,58 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.shardingsphere.readwritesplitting.yaml.swapper;
+
+import org.apache.shardingsphere.infra.config.algorithm.AlgorithmConfiguration;
+import org.apache.shardingsphere.infra.util.yaml.datanode.YamlDataNode;
+import
org.apache.shardingsphere.readwritesplitting.api.ReadwriteSplittingRuleConfiguration;
+import
org.apache.shardingsphere.readwritesplitting.api.rule.ReadwriteSplittingDataSourceRuleConfiguration;
+import org.junit.jupiter.api.Test;
+
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Arrays;
+import java.util.Iterator;
+import java.util.Properties;
+
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.CoreMatchers.is;
+
+class NewYamlReadwriteSplittingRuleConfigurationSwapperTest {
+
+ private final NewYamlReadwriteSplittingRuleConfigurationSwapper swapper =
new NewYamlReadwriteSplittingRuleConfigurationSwapper();
+
+ @Test
+ void assertSwapToDataNodesLoadBalancersEmpty() {
+ ReadwriteSplittingRuleConfiguration config = new
ReadwriteSplittingRuleConfiguration(Collections.singleton(new
ReadwriteSplittingDataSourceRuleConfiguration("group_0",
+ "write_ds", Arrays.asList("read_ds_0", "read_ds_1"), null)),
Collections.emptyMap());
+ Collection<YamlDataNode> result = swapper.swapToDataNodes(config);
+ assertThat(result.size(), is(1));
+ assertThat(result.iterator().next().getKey(), is("/group_0"));
+ }
+
+ @Test
+ void assertSwapToDataNodesLoadBalancers() {
+ ReadwriteSplittingRuleConfiguration config = new
ReadwriteSplittingRuleConfiguration(Collections.singleton(new
ReadwriteSplittingDataSourceRuleConfiguration("group_0",
+ "write_ds", Arrays.asList("read_ds_0", "read_ds_1"), null)),
Collections.singletonMap("random", new AlgorithmConfiguration("random", new
Properties())));
+ Collection<YamlDataNode> result = swapper.swapToDataNodes(config);
+ assertThat(result.size(), is(2));
+ Iterator<YamlDataNode> iterator = result.iterator();
+ assertThat(iterator.next().getKey(), is("/group_0"));
+ assertThat(iterator.next().getKey(), is("/load_balancers/random"));
+ }
+}
diff --git
a/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/config/database/DatabaseRuleBasedPersistService.java
b/infra/common/src/main/java/org/apache/shardingsphere/infra/yaml/config/swapper/rule/NewYamlRuleConfigurationSwapper.java
similarity index 51%
copy from
kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/config/database/DatabaseRuleBasedPersistService.java
copy to
infra/common/src/main/java/org/apache/shardingsphere/infra/yaml/config/swapper/rule/NewYamlRuleConfigurationSwapper.java
index ee2c7257b1d..4bb47425804 100644
---
a/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/config/database/DatabaseRuleBasedPersistService.java
+++
b/infra/common/src/main/java/org/apache/shardingsphere/infra/yaml/config/swapper/rule/NewYamlRuleConfigurationSwapper.java
@@ -15,28 +15,26 @@
* limitations under the License.
*/
-package org.apache.shardingsphere.metadata.persist.service.config.database;
+package org.apache.shardingsphere.infra.yaml.config.swapper.rule;
-import org.apache.shardingsphere.infra.rule.ShardingSphereRule;
-
-import javax.sql.DataSource;
-import java.util.Collection;
-import java.util.Map;
+import org.apache.shardingsphere.infra.config.rule.RuleConfiguration;
+import org.apache.shardingsphere.infra.util.spi.annotation.SingletonSPI;
+import org.apache.shardingsphere.infra.util.spi.type.ordered.OrderedSPI;
+import
org.apache.shardingsphere.infra.util.yaml.swapper.NewYamlConfigurationSwapper;
/**
- * Database rule based persist service.
+ * TODO Rename YamlRuleConfigurationSwapper when metadata structure adjustment
completed. #25485
+ * YAML rule configuration swapper.
*
- * @param <T> type of configuration
+ * @param <T> type of rule configuration
*/
-public interface DatabaseRuleBasedPersistService<T> extends
DatabaseBasedPersistService<T> {
+@SingletonSPI
+public interface NewYamlRuleConfigurationSwapper<T extends RuleConfiguration>
extends NewYamlConfigurationSwapper<T>, OrderedSPI<T> {
/**
- * Persist configurations.
- *
- * @param databaseName database name
- * @param dataSources data sources
- * @param rules rules
- * @param configs configurations
+ * Get YAML rule tag name.
+ *
+ * @return YAML rule tag name
*/
- void persist(String databaseName, Map<String, DataSource> dataSources,
Collection<ShardingSphereRule> rules, T configs);
+ String getRuleTagName();
}
diff --git
a/infra/common/src/main/java/org/apache/shardingsphere/infra/yaml/config/swapper/rule/NewYamlRuleConfigurationSwapperEngine.java
b/infra/common/src/main/java/org/apache/shardingsphere/infra/yaml/config/swapper/rule/NewYamlRuleConfigurationSwapperEngine.java
new file mode 100644
index 00000000000..ce3cfbe45ed
--- /dev/null
+++
b/infra/common/src/main/java/org/apache/shardingsphere/infra/yaml/config/swapper/rule/NewYamlRuleConfigurationSwapperEngine.java
@@ -0,0 +1,69 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.shardingsphere.infra.yaml.config.swapper.rule;
+
+import org.apache.shardingsphere.infra.config.rule.RuleConfiguration;
+import org.apache.shardingsphere.infra.util.spi.type.ordered.OrderedSPILoader;
+import
org.apache.shardingsphere.infra.yaml.config.pojo.rule.YamlRuleConfiguration;
+
+import java.util.Collection;
+import java.util.LinkedList;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.stream.Collectors;
+
+/**
+ * TODO Rename YamlRuleConfigurationSwapper when metadata structure adjustment
completed. #25485
+ * YAML rule configuration swapper engine.
+ */
+public final class NewYamlRuleConfigurationSwapperEngine {
+
+ /**
+ * Swap to YAML rule configurations.
+ *
+ * @param ruleConfigs rule configurations
+ * @return YAML rule configurations
+ */
+ @SuppressWarnings("rawtypes")
+ public Map<RuleConfiguration, NewYamlRuleConfigurationSwapper>
swapToYamlRuleConfigurations(final Collection<RuleConfiguration> ruleConfigs) {
+ return
OrderedSPILoader.getServices(NewYamlRuleConfigurationSwapper.class,
ruleConfigs);
+ }
+
+ /**
+ * Swap from YAML rule configurations to rule configurations.
+ *
+ * @param yamlRuleConfigs YAML rule configurations
+ * @return rule configurations
+ */
+ @SuppressWarnings("rawtypes")
+ public Collection<RuleConfiguration> swapToRuleConfigurations(final
Collection<YamlRuleConfiguration> yamlRuleConfigs) {
+ Collection<RuleConfiguration> result = new LinkedList<>();
+ Collection<Class<?>> ruleConfigTypes =
yamlRuleConfigs.stream().map(YamlRuleConfiguration::getRuleConfigurationType).collect(Collectors.toList());
+ for (Entry<Class<?>, YamlRuleConfigurationSwapper> entry :
OrderedSPILoader.getServicesByClass(YamlRuleConfigurationSwapper.class,
ruleConfigTypes).entrySet()) {
+ result.addAll(swapToRuleConfigurations(yamlRuleConfigs,
entry.getKey(), entry.getValue()));
+ }
+ return result;
+ }
+
+ @SuppressWarnings({"unchecked", "rawtypes"})
+ private Collection<RuleConfiguration> swapToRuleConfigurations(final
Collection<YamlRuleConfiguration> yamlRuleConfigs,
+ final
Class<?> ruleConfigType, final YamlRuleConfigurationSwapper swapper) {
+ return yamlRuleConfigs.stream()
+ .filter(each ->
each.getRuleConfigurationType().equals(ruleConfigType)).map(each ->
(RuleConfiguration) swapper.swapToObject(each)).collect(Collectors.toList());
+ }
+}
diff --git
a/features/readwrite-splitting/api/src/main/java/org/apache/shardingsphere/readwritesplitting/api/ReadwriteSplittingRuleConfiguration.java
b/infra/util/src/main/java/org/apache/shardingsphere/infra/util/yaml/datanode/YamlDataNode.java
similarity index 53%
copy from
features/readwrite-splitting/api/src/main/java/org/apache/shardingsphere/readwritesplitting/api/ReadwriteSplittingRuleConfiguration.java
copy to
infra/util/src/main/java/org/apache/shardingsphere/infra/util/yaml/datanode/YamlDataNode.java
index b921b4d8fac..a8e90577f20 100644
---
a/features/readwrite-splitting/api/src/main/java/org/apache/shardingsphere/readwritesplitting/api/ReadwriteSplittingRuleConfiguration.java
+++
b/infra/util/src/main/java/org/apache/shardingsphere/infra/util/yaml/datanode/YamlDataNode.java
@@ -15,26 +15,16 @@
* limitations under the License.
*/
-package org.apache.shardingsphere.readwritesplitting.api;
+package org.apache.shardingsphere.infra.util.yaml.datanode;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
-import org.apache.shardingsphere.infra.config.algorithm.AlgorithmConfiguration;
-import
org.apache.shardingsphere.infra.config.rule.function.DistributedRuleConfiguration;
-import
org.apache.shardingsphere.infra.config.rule.scope.DatabaseRuleConfiguration;
-import
org.apache.shardingsphere.readwritesplitting.api.rule.ReadwriteSplittingDataSourceRuleConfiguration;
-import java.util.Collection;
-import java.util.Map;
-
-/**
- * Readwrite-splitting rule configuration.
- */
-@RequiredArgsConstructor
@Getter
-public final class ReadwriteSplittingRuleConfiguration implements
DatabaseRuleConfiguration, DistributedRuleConfiguration {
+@RequiredArgsConstructor
+public final class YamlDataNode {
- private final Collection<ReadwriteSplittingDataSourceRuleConfiguration>
dataSources;
+ private final String key;
- private final Map<String, AlgorithmConfiguration> loadBalancers;
+ private final String value;
}
diff --git
a/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/config/database/DatabaseRuleBasedPersistService.java
b/infra/util/src/main/java/org/apache/shardingsphere/infra/util/yaml/swapper/NewYamlConfigurationSwapper.java
similarity index 56%
copy from
kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/config/database/DatabaseRuleBasedPersistService.java
copy to
infra/util/src/main/java/org/apache/shardingsphere/infra/util/yaml/swapper/NewYamlConfigurationSwapper.java
index ee2c7257b1d..abc29a5f9ea 100644
---
a/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/config/database/DatabaseRuleBasedPersistService.java
+++
b/infra/util/src/main/java/org/apache/shardingsphere/infra/util/yaml/swapper/NewYamlConfigurationSwapper.java
@@ -15,28 +15,33 @@
* limitations under the License.
*/
-package org.apache.shardingsphere.metadata.persist.service.config.database;
+package org.apache.shardingsphere.infra.util.yaml.swapper;
-import org.apache.shardingsphere.infra.rule.ShardingSphereRule;
+import org.apache.shardingsphere.infra.util.yaml.datanode.YamlDataNode;
-import javax.sql.DataSource;
import java.util.Collection;
-import java.util.Map;
+// TODO Rename YamlConfigurationSwapper when metadata structure adjustment
completed. #25485
/**
- * Database rule based persist service.
+ * YAML configuration swapper.
*
- * @param <T> type of configuration
+ * @param <T> type of swapped object
*/
-public interface DatabaseRuleBasedPersistService<T> extends
DatabaseBasedPersistService<T> {
+public interface NewYamlConfigurationSwapper<T> {
/**
- * Persist configurations.
+ * Swap to YAML data node.
+ *
+ * @param data data to be swapped
+ * @return YAML data nodes
+ */
+ Collection<YamlDataNode> swapToDataNodes(T data);
+
+ /**
+ * Swap from data node to object.
*
- * @param databaseName database name
- * @param dataSources data sources
- * @param rules rules
- * @param configs configurations
+ * @param dataNodes data nodes
+ * @return swapped object
*/
- void persist(String databaseName, Map<String, DataSource> dataSources,
Collection<ShardingSphereRule> rules, T configs);
+ T swapToObject(Collection<YamlDataNode> dataNodes);
}
diff --git
a/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/MetaDataBasedPersistService.java
b/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/MetaDataBasedPersistService.java
index 388b2a29f55..38e449ca16f 100644
---
a/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/MetaDataBasedPersistService.java
+++
b/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/MetaDataBasedPersistService.java
@@ -23,7 +23,6 @@ import
org.apache.shardingsphere.infra.datasource.props.DataSourceProperties;
import org.apache.shardingsphere.infra.rule.ShardingSphereRule;
import
org.apache.shardingsphere.metadata.persist.data.ShardingSphereDataBasedPersistService;
import
org.apache.shardingsphere.metadata.persist.service.config.database.DatabaseBasedPersistService;
-import
org.apache.shardingsphere.metadata.persist.service.config.database.DatabaseRuleBasedPersistService;
import
org.apache.shardingsphere.metadata.persist.service.config.global.GlobalPersistService;
import
org.apache.shardingsphere.metadata.persist.service.database.DatabaseMetaDataBasedPersistService;
import
org.apache.shardingsphere.metadata.persist.service.version.MetaDataVersionBasedPersistService;
@@ -66,7 +65,7 @@ public interface MetaDataBasedPersistService {
*
* @return persist service
*/
- DatabaseRuleBasedPersistService<Collection<RuleConfiguration>>
getDatabaseRulePersistService();
+ DatabaseBasedPersistService<Collection<RuleConfiguration>>
getDatabaseRulePersistService();
/**
* Get global rule service.
diff --git
a/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/MetaDataPersistService.java
b/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/MetaDataPersistService.java
index 73256ad23be..4bc180856fa 100644
---
a/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/MetaDataPersistService.java
+++
b/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/MetaDataPersistService.java
@@ -102,7 +102,7 @@ public final class MetaDataPersistService implements
MetaDataBasedPersistService
databaseMetaDataService.addDatabase(databaseName);
} else {
dataSourceService.persist(databaseName,
getDataSourcePropertiesMap(databaseConfigs.getDataSources()));
- databaseRulePersistService.persist(databaseName, dataSources,
rules, databaseConfigs.getRuleConfigurations());
+ databaseRulePersistService.persist(databaseName,
databaseConfigs.getRuleConfigurations());
}
}
diff --git
a/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/NewMetaDataPersistService.java
b/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/NewMetaDataPersistService.java
index b731e2e5a27..373b3722943 100644
---
a/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/NewMetaDataPersistService.java
+++
b/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/NewMetaDataPersistService.java
@@ -104,7 +104,7 @@ public final class NewMetaDataPersistService implements
MetaDataBasedPersistServ
databaseMetaDataService.addDatabase(databaseName);
} else {
dataSourceService.persist(databaseName,
getDataSourcePropertiesMap(databaseConfigs.getDataSources()));
- databaseRulePersistService.persist(databaseName, dataSources,
rules, databaseConfigs.getRuleConfigurations());
+ databaseRulePersistService.persist(databaseName,
databaseConfigs.getRuleConfigurations());
}
}
diff --git
a/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/node/NewDatabaseMetaDataNode.java
b/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/node/NewDatabaseMetaDataNode.java
index d2154f3562f..32d2b9ae2f7 100644
---
a/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/node/NewDatabaseMetaDataNode.java
+++
b/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/node/NewDatabaseMetaDataNode.java
@@ -19,10 +19,10 @@ package org.apache.shardingsphere.metadata.persist.node;
import lombok.AccessLevel;
import lombok.NoArgsConstructor;
-import org.apache.shardingsphere.metadata.persist.node.metadata.DataSourceNode;
+import
org.apache.shardingsphere.metadata.persist.node.metadata.datasource.DataSourcePathProcessor;
+// TODO Rename DatabaseMetaDataNode when metadata structure adjustment
completed. #25485
/**
- * TODO Rename DatabaseMetaDataNode when metadata structure adjustment
completed. #25485
* New database meta data node.
*/
@NoArgsConstructor(access = AccessLevel.PRIVATE)
@@ -37,7 +37,7 @@ public final class NewDatabaseMetaDataNode {
* @return data sources path
*/
public static String getDataSourcesPath(final String databaseName) {
- return String.join("/", getMetaDataNodePath(),
DataSourceNode.getDataSourcesPath(databaseName));
+ return String.join("/", getMetaDataNodePath(),
DataSourcePathProcessor.getDataSourcesPath(databaseName));
}
/**
@@ -49,7 +49,7 @@ public final class NewDatabaseMetaDataNode {
* @return data source path
*/
public static String getDataSourcePath(final String databaseName, final
String dataSourceName, final String version) {
- return String.join("/", getMetaDataNodePath(),
DataSourceNode.getDataSourcePath(databaseName, dataSourceName, version));
+ return String.join("/", getMetaDataNodePath(),
DataSourcePathProcessor.getDataSourcePath(databaseName, dataSourceName,
version));
}
/**
@@ -60,7 +60,7 @@ public final class NewDatabaseMetaDataNode {
* @return data source active version path
*/
public static String getDataSourceActiveVersionPath(final String
databaseName, final String dataSourceName) {
- return String.join("/", getMetaDataNodePath(),
DataSourceNode.getActiveVersionPath(databaseName, dataSourceName));
+ return String.join("/", getMetaDataNodePath(),
DataSourcePathProcessor.getActiveVersionPath(databaseName, dataSourceName));
}
/**
diff --git
a/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/node/metadata/config/readwritesplitting/ReadwriteSplittingNodeConverter.java
b/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/node/metadata/config/readwritesplitting/ReadwriteSplittingNodeConverter.java
new file mode 100644
index 00000000000..90b01188618
--- /dev/null
+++
b/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/node/metadata/config/readwritesplitting/ReadwriteSplittingNodeConverter.java
@@ -0,0 +1,52 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package
org.apache.shardingsphere.metadata.persist.node.metadata.config.readwritesplitting;
+
+/**
+ * Readwrite-splitting node converter.
+ */
+public final class ReadwriteSplittingNodeConverter {
+
+ private static final String ROOT_NODE = "readwrite_splitting";
+
+ private static final String ACTIVE_VERSION_NODE = "/active_version";
+
+ private static final String VERSIONS_NODE = "/versions";
+
+ private static final String LOAD_BALANCER_NODE = "load_balancers";
+
+ /**
+ * Get group name path.
+ *
+ * @param groupName group name
+ * @return group name path
+ */
+ public String getGroupNamePath(final String groupName) {
+ return String.join("/", "", groupName);
+ }
+
+ /**
+ * Get load balancer name.
+ *
+ * @param loadBalancerName load balancer name
+ * @return load balancer path
+ */
+ public String getLoadBalancerPath(final String loadBalancerName) {
+ return String.join("/", "", LOAD_BALANCER_NODE, loadBalancerName);
+ }
+}
diff --git
a/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/node/metadata/DataSourceNode.java
b/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/node/metadata/datasource/DataSourcePathProcessor.java
similarity index 96%
rename from
kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/node/metadata/DataSourceNode.java
rename to
kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/node/metadata/datasource/DataSourcePathProcessor.java
index 660f932f894..5195f62eadb 100644
---
a/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/node/metadata/DataSourceNode.java
+++
b/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/node/metadata/datasource/DataSourcePathProcessor.java
@@ -15,16 +15,16 @@
* limitations under the License.
*/
-package org.apache.shardingsphere.metadata.persist.node.metadata;
+package org.apache.shardingsphere.metadata.persist.node.metadata.datasource;
import lombok.AccessLevel;
import lombok.NoArgsConstructor;
/**
- * Database source node.
+ * Data source path processor.
*/
@NoArgsConstructor(access = AccessLevel.PRIVATE)
-public final class DataSourceNode {
+public final class DataSourcePathProcessor {
private static final String ROOT_NODE = "data_sources";
diff --git
a/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/config/database/DatabaseRulePersistService.java
b/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/config/database/DatabaseRulePersistService.java
index 8502e2df664..de93cf33088 100644
---
a/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/config/database/DatabaseRulePersistService.java
+++
b/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/config/database/DatabaseRulePersistService.java
@@ -20,38 +20,25 @@ package
org.apache.shardingsphere.metadata.persist.service.config.database;
import com.google.common.base.Strings;
import lombok.RequiredArgsConstructor;
import org.apache.shardingsphere.infra.config.rule.RuleConfiguration;
-import org.apache.shardingsphere.infra.rule.ShardingSphereRule;
import org.apache.shardingsphere.infra.util.yaml.YamlEngine;
import
org.apache.shardingsphere.infra.yaml.config.pojo.rule.YamlRuleConfiguration;
import
org.apache.shardingsphere.infra.yaml.config.swapper.rule.YamlRuleConfigurationSwapperEngine;
import org.apache.shardingsphere.metadata.persist.node.DatabaseMetaDataNode;
import org.apache.shardingsphere.mode.spi.PersistRepository;
-import javax.sql.DataSource;
import java.util.Collection;
import java.util.LinkedList;
-import java.util.Map;
/**
* Database rule persist service.
*/
@RequiredArgsConstructor
-public final class DatabaseRulePersistService implements
DatabaseRuleBasedPersistService<Collection<RuleConfiguration>> {
+public final class DatabaseRulePersistService implements
DatabaseBasedPersistService<Collection<RuleConfiguration>> {
private static final String DEFAULT_VERSION = "0";
private final PersistRepository repository;
- @Override
- public void persist(final String databaseName, final Map<String,
DataSource> dataSources,
- final Collection<ShardingSphereRule> rules, final
Collection<RuleConfiguration> configs) {
- if (Strings.isNullOrEmpty(getDatabaseActiveVersion(databaseName))) {
-
repository.persist(DatabaseMetaDataNode.getActiveVersionPath(databaseName),
DEFAULT_VERSION);
- }
- repository.persist(DatabaseMetaDataNode.getRulePath(databaseName,
getDatabaseActiveVersion(databaseName)),
- YamlEngine.marshal(createYamlRuleConfigurations(dataSources,
rules, configs)));
- }
-
@Override
public void persist(final String databaseName, final
Collection<RuleConfiguration> configs) {
if (Strings.isNullOrEmpty(getDatabaseActiveVersion(databaseName))) {
@@ -65,12 +52,6 @@ public final class DatabaseRulePersistService implements
DatabaseRuleBasedPersis
return new
YamlRuleConfigurationSwapperEngine().swapToYamlRuleConfigurations(ruleConfigs);
}
- // TODO Load single table refer to #22887
- private Collection<YamlRuleConfiguration>
createYamlRuleConfigurations(final Map<String, DataSource> dataSources, final
Collection<ShardingSphereRule> rules,
-
final Collection<RuleConfiguration> ruleConfigs) {
- return new
YamlRuleConfigurationSwapperEngine().swapToYamlRuleConfigurations(ruleConfigs);
- }
-
@SuppressWarnings("unchecked")
@Override
public Collection<RuleConfiguration> load(final String databaseName) {
diff --git
a/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/config/database/DatabaseRuleBasedPersistService.java
b/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/config/database/NewDatabaseBasedPersistService.java
similarity index 69%
copy from
kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/config/database/DatabaseRuleBasedPersistService.java
copy to
kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/config/database/NewDatabaseBasedPersistService.java
index ee2c7257b1d..868c34f9690 100644
---
a/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/config/database/DatabaseRuleBasedPersistService.java
+++
b/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/config/database/NewDatabaseBasedPersistService.java
@@ -17,26 +17,28 @@
package org.apache.shardingsphere.metadata.persist.service.config.database;
-import org.apache.shardingsphere.infra.rule.ShardingSphereRule;
-
-import javax.sql.DataSource;
-import java.util.Collection;
-import java.util.Map;
-
/**
- * Database rule based persist service.
+ * TODO Rename DatabaseBasedPersistService when metadata structure adjustment
completed. #25485
+ * Database based persist service.
*
* @param <T> type of configuration
*/
-public interface DatabaseRuleBasedPersistService<T> extends
DatabaseBasedPersistService<T> {
+public interface NewDatabaseBasedPersistService<T> {
/**
* Persist configurations.
*
* @param databaseName database name
- * @param dataSources data sources
- * @param rules rules
* @param configs configurations
*/
- void persist(String databaseName, Map<String, DataSource> dataSources,
Collection<ShardingSphereRule> rules, T configs);
+ void persist(String databaseName, T configs);
+
+ /**
+ * Load configurations.
+ *
+ * @param databaseName database name
+ * @param ruleName rule name
+ * @return configurations
+ */
+ T load(String databaseName, String ruleName);
}
diff --git
a/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/config/database/DatabaseRuleBasedPersistService.java
b/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/config/database/NewDatabaseRuleBasedPersistService.java
similarity index 87%
rename from
kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/config/database/DatabaseRuleBasedPersistService.java
rename to
kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/config/database/NewDatabaseRuleBasedPersistService.java
index ee2c7257b1d..086ec06f705 100644
---
a/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/config/database/DatabaseRuleBasedPersistService.java
+++
b/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/config/database/NewDatabaseRuleBasedPersistService.java
@@ -24,11 +24,12 @@ import java.util.Collection;
import java.util.Map;
/**
+ * TODO Rename DatabaseRuleBasedPersistService when metadata structure
adjustment completed. #25485
* Database rule based persist service.
*
* @param <T> type of configuration
*/
-public interface DatabaseRuleBasedPersistService<T> extends
DatabaseBasedPersistService<T> {
+public interface NewDatabaseRuleBasedPersistService<T> extends
NewDatabaseBasedPersistService<T> {
/**
* Persist configurations.
diff --git
a/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/config/database/NewDatabaseRulePersistService.java
b/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/config/database/NewDatabaseRulePersistService.java
new file mode 100644
index 00000000000..8877227a25c
--- /dev/null
+++
b/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/config/database/NewDatabaseRulePersistService.java
@@ -0,0 +1,94 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.shardingsphere.metadata.persist.service.config.database;
+
+import com.google.common.base.Strings;
+import lombok.RequiredArgsConstructor;
+import org.apache.shardingsphere.infra.config.rule.RuleConfiguration;
+import org.apache.shardingsphere.infra.rule.ShardingSphereRule;
+import org.apache.shardingsphere.infra.util.yaml.datanode.YamlDataNode;
+import
org.apache.shardingsphere.infra.yaml.config.swapper.rule.NewYamlRuleConfigurationSwapper;
+import
org.apache.shardingsphere.infra.yaml.config.swapper.rule.NewYamlRuleConfigurationSwapperEngine;
+import org.apache.shardingsphere.mode.spi.PersistRepository;
+
+import javax.sql.DataSource;
+import java.util.Collections;
+import java.util.List;
+import java.util.Collection;
+import java.util.Map;
+
+/**
+ * TODO Rename DatabaseRulePersistService when metadata structure adjustment
completed. #25485
+ * Database rule persist service.
+ */
+@RequiredArgsConstructor
+public final class NewDatabaseRulePersistService implements
NewDatabaseRuleBasedPersistService<Collection<RuleConfiguration>> {
+
+ private static final String DEFAULT_VERSION = "0";
+
+ private static final String ACTIVE_VERSION = "active_version";
+
+ private static final String VERSIONS = "versions";
+
+ private final PersistRepository repository;
+
+ @Override
+ public void persist(final String databaseName, final Map<String,
DataSource> dataSources,
+ final Collection<ShardingSphereRule> rules, final
Collection<RuleConfiguration> configs) {
+ // TODO Load single table refer to #22887
+ }
+
+ @SuppressWarnings({"unchecked", "rawtypes"})
+ @Override
+ public void persist(final String databaseName, final
Collection<RuleConfiguration> configs) {
+ Map<RuleConfiguration, NewYamlRuleConfigurationSwapper> yamlConfigs =
new
NewYamlRuleConfigurationSwapperEngine().swapToYamlRuleConfigurations(configs);
+ for (Map.Entry<RuleConfiguration, NewYamlRuleConfigurationSwapper>
entry : yamlConfigs.entrySet()) {
+ Collection<YamlDataNode> dataNodes =
entry.getValue().swapToDataNodes(entry.getKey());
+ if (dataNodes.isEmpty()) {
+ continue;
+ }
+ persistDataNodes(entry.getValue().getRuleTagName().toLowerCase(),
dataNodes);
+ }
+ }
+
+ private void persistDataNodes(final String ruleName, final
Collection<YamlDataNode> dataNodes) {
+ for (YamlDataNode each : dataNodes) {
+ if (Strings.isNullOrEmpty(repository.getDirectly(each.getKey()))) {
+ repository.persist(appendActiveVersion(ruleName,
each.getKey()), DEFAULT_VERSION);
+ }
+ List<String> versions =
repository.getChildrenKeys(String.join("/", "", ruleName, each.getKey(),
VERSIONS));
+ repository.persist(appendVersion(ruleName, each.getKey(),
versions.isEmpty()
+ ? DEFAULT_VERSION
+ : String.valueOf(Integer.parseInt(versions.get(0)) + 1)),
each.getValue());
+ }
+ }
+
+ private String appendActiveVersion(final String ruleName, final String
key) {
+ return String.join("/", "", ruleName, key, ACTIVE_VERSION);
+ }
+
+ private String appendVersion(final String ruleName, final String key,
final String nextVersion) {
+ return String.join("/", "", ruleName, key, VERSIONS, nextVersion);
+ }
+
+ @Override
+ public Collection<RuleConfiguration> load(final String databaseName, final
String ruleName) {
+ // TODO
+ return Collections.emptyList();
+ }
+}
diff --git
a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/ClusterModeContextManager.java
b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/ClusterModeContextManager.java
index 44dc6bb02b4..e0d8e5a8cd7 100644
---
a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/ClusterModeContextManager.java
+++
b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/ClusterModeContextManager.java
@@ -108,9 +108,7 @@ public final class ClusterModeContextManager implements
ModeContextManager, Cont
@Override
public void alterRuleConfiguration(final String databaseName, final
Collection<RuleConfiguration> ruleConfigs) {
-
contextManager.getMetaDataContexts().getPersistService().getDatabaseRulePersistService().persist(databaseName,
-
contextManager.getMetaDataContexts().getMetaData().getDatabase(databaseName).getResourceMetaData().getDataSources(),
-
contextManager.getMetaDataContexts().getMetaData().getDatabase(databaseName).getRuleMetaData().getRules(),
ruleConfigs);
+
contextManager.getMetaDataContexts().getPersistService().getDatabaseRulePersistService().persist(databaseName,
ruleConfigs);
}
@Override
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 a975025b013..e6e81da86c4 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
@@ -196,9 +196,7 @@ public final class YamlDatabaseConfigurationImportExecutor {
}
ruleConfigsMap.keySet().stream().sorted(Comparator.reverseOrder()).collect(Collectors.toList())
.forEach(each -> addRules(allRuleConfigs,
ruleConfigsMap.get(each), database));
-
metaDataContexts.getPersistService().getDatabaseRulePersistService().persist(metaDataContexts.getMetaData().getDatabase(databaseName).getName(),
-
metaDataContexts.getMetaData().getDatabase(databaseName).getResourceMetaData().getDataSources(),
-
metaDataContexts.getMetaData().getDatabase(databaseName).getRuleMetaData().getRules(),
allRuleConfigs);
+
metaDataContexts.getPersistService().getDatabaseRulePersistService().persist(metaDataContexts.getMetaData().getDatabase(databaseName).getName(),
allRuleConfigs);
}
private void addRules(final Collection<RuleConfiguration> allRuleConfigs,
final Collection<RuleConfiguration> ruleConfigs, final ShardingSphereDatabase
database) {