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 8b9549d0ddb Rollback if import database configuration failed (#32420)
8b9549d0ddb is described below
commit 8b9549d0ddbf2a743fd21a4d9cd9fb37c201c2f5
Author: yx9o <[email protected]>
AuthorDate: Fri Aug 9 22:41:38 2024 +0800
Rollback if import database configuration failed (#32420)
* Rollback if import database configuration failed
* Update test
* Update test
---
.../YamlDatabaseConfigurationImportExecutor.java | 11 +++++---
.../ral/updatable/ImportMetaDataExecutorTest.java | 30 +++++++++++++++-------
2 files changed, 28 insertions(+), 13 deletions(-)
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 d21bc274586..33078e9e56a 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
@@ -30,6 +30,7 @@ import
org.apache.shardingsphere.infra.exception.core.ShardingSpherePrecondition
import
org.apache.shardingsphere.infra.exception.core.external.sql.ShardingSphereSQLException;
import
org.apache.shardingsphere.infra.exception.dialect.exception.syntax.database.DatabaseCreateExistsException;
import
org.apache.shardingsphere.infra.exception.kernel.metadata.MissingRequiredDatabaseException;
+import
org.apache.shardingsphere.infra.exception.kernel.metadata.resource.storageunit.EmptyStorageUnitException;
import
org.apache.shardingsphere.infra.exception.kernel.metadata.resource.storageunit.StorageUnitsOperateException;
import org.apache.shardingsphere.infra.instance.ComputeNodeInstanceContext;
import
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
@@ -76,12 +77,10 @@ public final class YamlDatabaseConfigurationImportExecutor {
public void importDatabaseConfiguration(final
YamlProxyDatabaseConfiguration yamlConfig) throws SQLException {
String databaseName = yamlConfig.getDatabaseName();
checkDatabase(databaseName);
+ checkDataSources(databaseName, yamlConfig.getDataSources());
addDatabase(databaseName);
- if (null == yamlConfig.getDataSources() ||
yamlConfig.getDataSources().isEmpty()) {
- return;
- }
- importDataSources(databaseName, yamlConfig.getDataSources());
try {
+ importDataSources(databaseName, yamlConfig.getDataSources());
importRules(databaseName, yamlConfig.getRules());
} catch (final ShardingSphereSQLException ex) {
dropDatabase(databaseName);
@@ -89,6 +88,10 @@ public final class YamlDatabaseConfigurationImportExecutor {
}
}
+ private void checkDataSources(final String databaseName, final Map<String,
YamlProxyDataSourceConfiguration> dataSources) {
+ ShardingSpherePreconditions.checkNotEmpty(dataSources, () -> new
EmptyStorageUnitException(databaseName));
+ }
+
private void checkDatabase(final String databaseName) {
ShardingSpherePreconditions.checkNotEmpty(databaseName,
MissingRequiredDatabaseException::new);
ShardingSpherePreconditions.checkState(!ProxyContext.getInstance().databaseExists(databaseName),
() -> new DatabaseCreateExistsException(databaseName));
diff --git
a/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/ImportMetaDataExecutorTest.java
b/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/ImportMetaDataExecutorTest.java
index 290b0e5b184..d12da3e4faa 100644
---
a/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/ImportMetaDataExecutorTest.java
+++
b/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/ImportMetaDataExecutorTest.java
@@ -18,12 +18,14 @@
package org.apache.shardingsphere.proxy.backend.handler.distsql.ral.updatable;
import org.apache.groovy.util.Maps;
+import
org.apache.shardingsphere.distsql.handler.validate.DistSQLDataSourcePoolPropertiesValidator;
import
org.apache.shardingsphere.distsql.statement.ral.updatable.ImportMetaDataStatement;
import org.apache.shardingsphere.infra.config.props.ConfigurationProperties;
import org.apache.shardingsphere.infra.config.props.ConfigurationPropertyKey;
import org.apache.shardingsphere.infra.database.core.DefaultDatabase;
import
org.apache.shardingsphere.infra.datasource.pool.props.domain.DataSourcePoolProperties;
import
org.apache.shardingsphere.infra.exception.dialect.exception.syntax.database.DatabaseCreateExistsException;
+import
org.apache.shardingsphere.infra.exception.kernel.metadata.resource.storageunit.EmptyStorageUnitException;
import
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
import
org.apache.shardingsphere.infra.metadata.database.resource.node.StorageNode;
import
org.apache.shardingsphere.infra.metadata.database.resource.unit.StorageUnit;
@@ -33,6 +35,7 @@ import
org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSp
import
org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereTable;
import org.apache.shardingsphere.mode.manager.ContextManager;
import org.apache.shardingsphere.proxy.backend.context.ProxyContext;
+import
org.apache.shardingsphere.proxy.backend.util.YamlDatabaseConfigurationImportExecutor;
import org.apache.shardingsphere.test.fixture.jdbc.MockedDataSource;
import org.apache.shardingsphere.test.mock.AutoMockExtension;
import org.apache.shardingsphere.test.mock.StaticMockSettings;
@@ -41,6 +44,7 @@ import
org.apache.shardingsphere.test.util.PropertiesBuilder.Property;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
+import org.mockito.internal.configuration.plugins.Plugins;
import org.mockito.junit.jupiter.MockitoSettings;
import org.mockito.quality.Strictness;
@@ -63,9 +67,13 @@ import static org.mockito.Mockito.when;
@MockitoSettings(strictness = Strictness.LENIENT)
class ImportMetaDataExecutorTest {
- private static final String METADATA_VALUE =
"eyJtZXRhX2RhdGEiOnsiZGF0YWJhc2VzIjp7InNoYXJkaW5nX2RiIjoiZGF0YWJhc2VOYW1lOiBzaGFyZGluZ19kYlxuZGF0YVNvdXJjZXM6XG5ydWxlczpcbiJ9LCJwcm9w"
- +
"cyI6InByb3BzOlxuICBzeXN0ZW0tbG9nLWxldmVsOiBJTkZPXG4gIHNxbC1zaG93OiBmYWxzZVxuIiwicnVsZXMiOiJydWxlczpcbi0gIUFVVEhPUklUWVxuICBwcml2aWxlZ2U6XG4gICAgdHlwZTogQUxMX1BFUk1JVFRFR"
- +
"FxuICB1c2VyczpcbiAgLSBhdXRoZW50aWNhdGlvbk1ldGhvZE5hbWU6ICcnXG4gICAgcGFzc3dvcmQ6IHJvb3RcbiAgICB1c2VyOiByb290QCVcbiJ9fQ==";
+ private static final String METADATA_VALUE =
"eyJtZXRhX2RhdGEiOnsiZGF0YWJhc2VzIjp7InNoYXJkaW5nX2RiIjoiZGF0YWJhc2VOYW1lOiBzaGFyZGluZ19kYlxuZGF0YVNvdXJjZXM6XG4gIGRzXzA6XG4gICAgcGFzc3dvcmQ6IFxu"
+ +
"ICAgIGRhdGFTb3VyY2VDbGFzc05hbWU6IG51bGxcbiAgICB1cmw6IGpkYmM6bXlzcWw6Ly8xMjcuMC4wLjE6MzMwNi9kZW1vX2RzXzA/dXNlU1NMPWZhbHNlXG4gICAgdXNlcm5hbWU6IHJvb3RcbiAgICBtaW5Qb29sU2l6ZTogMVxuICAgI"
+ +
"GNvbm5lY3Rpb25UaW1lb3V0TWlsbGlzZWNvbmRzOiAzMDAwMFxuICAgIG1heExpZmV0aW1lTWlsbGlzZWNvbmRzOiAxODAwMDAwXG4gICAgaWRsZVRpbWVvdXRNaWxsaXNlY29uZHM6IDYwMDAwXG4gICAgbWF4UG9vbFNpemU6IDUwXG4gIG"
+ +
"RzXzE6XG4gICAgcGFzc3dvcmQ6IFxuICAgIGRhdGFTb3VyY2VDbGFzc05hbWU6IG51bGxcbiAgICB1cmw6IGpkYmM6bXlzcWw6Ly8xMjcuMC4wLjE6MzMwNi9kZW1vX2RzXzE/dXNlU1NMPWZhbHNlXG4gICAgdXNlcm5hbWU6IHJvb3RcbiA"
+ +
"gICBtaW5Qb29sU2l6ZTogMVxuICAgIGNvbm5lY3Rpb25UaW1lb3V0TWlsbGlzZWNvbmRzOiAzMDAwMFxuICAgIG1heExpZmV0aW1lTWlsbGlzZWNvbmRzOiAxODAwMDAwXG4gICAgaWRsZVRpbWVvdXRNaWxsaXNlY29uZHM6IDYwMDAwXG4g"
+ +
"ICAgbWF4UG9vbFNpemU6IDUwXG5ydWxlczpcbiJ9LCJwcm9wcyI6InByb3BzOlxuICBzeXN0ZW0tbG9nLWxldmVsOiBJTkZPXG4gIHNxbC1zaG93OiBmYWxzZVxuIiwicnVsZXMiOiJydWxlczpcbi0gIUFVVEhPUklUWVxuICBwcml2aWxlZ"
+ +
"2U6XG4gICAgdHlwZTogQUxMX1BFUk1JVFRFRFxuICB1c2VyczpcbiAgLSBhdXRoZW50aWNhdGlvbk1ldGhvZE5hbWU6ICcnXG4gICAgcGFzc3dvcmQ6IHJvb3RcbiAgICB1c2VyOiByb290QCVcbiJ9fQ==";
private static final String EMPTY = "empty_metadata";
@@ -79,15 +87,15 @@ class ImportMetaDataExecutorTest {
}
@Test
- void assertImportEmptyMetaData() throws SQLException {
+ void assertImportEmptyMetaData() throws NoSuchFieldException,
IllegalAccessException {
init(null);
ContextManager contextManager = mock(ContextManager.class,
RETURNS_DEEP_STUBS);
- executor.executeUpdate(new ImportMetaDataStatement(null,
Objects.requireNonNull(ImportMetaDataExecutorTest.class.getResource(featureMap.get(EMPTY))).getPath()),
contextManager);
- assertNotNull(contextManager.getDatabase("empty_metadata"));
+ assertThrows(EmptyStorageUnitException.class, () ->
executor.executeUpdate(
+ new ImportMetaDataStatement(null,
Objects.requireNonNull(ImportMetaDataExecutorTest.class.getResource(featureMap.get(EMPTY))).getPath()),
contextManager));
}
@Test
- void assertImportMetaDataFromJsonValue() throws SQLException {
+ void assertImportMetaDataFromJsonValue() throws SQLException,
NoSuchFieldException, IllegalAccessException {
init(EMPTY);
ContextManager contextManager = mock(ContextManager.class,
RETURNS_DEEP_STUBS);
executor.executeUpdate(new ImportMetaDataStatement(METADATA_VALUE,
null), contextManager);
@@ -95,18 +103,22 @@ class ImportMetaDataExecutorTest {
}
@Test
- void assertImportExistedMetaDataFromFile() {
+ void assertImportExistedMetaDataFromFile() throws NoSuchFieldException,
IllegalAccessException {
init(EMPTY);
ContextManager contextManager = mock(ContextManager.class,
RETURNS_DEEP_STUBS);
assertThrows(DatabaseCreateExistsException.class, () ->
executor.executeUpdate(
new ImportMetaDataStatement(null,
Objects.requireNonNull(ImportMetaDataExecutorTest.class.getResource(featureMap.get(EMPTY))).getPath()),
contextManager));
}
- private void init(final String feature) {
+ private void init(final String feature) throws NoSuchFieldException,
IllegalAccessException {
executor = new ImportMetaDataExecutor();
ContextManager contextManager = mockContextManager(feature);
when(ProxyContext.getInstance().getContextManager()).thenReturn(contextManager);
when(ProxyContext.getInstance().databaseExists(feature)).thenReturn(true);
+ YamlDatabaseConfigurationImportExecutor databaseConfigImportExecutor =
new YamlDatabaseConfigurationImportExecutor();
+
Plugins.getMemberAccessor().set(executor.getClass().getDeclaredField("databaseConfigImportExecutor"),
executor, databaseConfigImportExecutor);
+
Plugins.getMemberAccessor().set(databaseConfigImportExecutor.getClass().getDeclaredField("validateHandler"),
databaseConfigImportExecutor,
+ mock(DistSQLDataSourcePoolPropertiesValidator.class));
}
private ContextManager mockContextManager(final String feature) {