From 1e0cbff617c2c7a23ff255412f6a98ac5196c4a6 Mon Sep 17 00:00:00 2001 From: linghengqian Date: Sun, 17 Dec 2023 11:57:42 +0800 Subject: [PATCH] Add GraalVM Reachability Metadata and corresponding nativeTest for Zookeeper integration --- .../reflect-config.json | 118 ++++++++++++++---- .../resource-config.json | 20 ++- .../native-image-filter/extra-filter.json | 2 + test/native/pom.xml | 7 +- .../natived/jdbc/databases/MySQLTest.java | 51 ++++---- .../natived/jdbc/databases/OpenGaussTest.java | 46 +++---- .../jdbc/mode/cluster/ZookeeperTest.java | 86 +++++++++++++ .../resource-config.json | 3 + .../yaml/mode/cluster/zookeeper.yaml | 83 ++++++++++++ 9 files changed, 330 insertions(+), 86 deletions(-) create mode 100644 test/native/src/test/java/org/apache/shardingsphere/test/natived/jdbc/mode/cluster/ZookeeperTest.java create mode 100644 test/native/src/test/resources/test-native/yaml/mode/cluster/zookeeper.yaml diff --git a/infra/reachability-metadata/src/main/resources/META-INF/native-image/org.apache.shardingsphere/shardingsphere-infra-reachability-metadata/reflect-config.json b/infra/reachability-metadata/src/main/resources/META-INF/native-image/org.apache.shardingsphere/shardingsphere-infra-reachability-metadata/reflect-config.json index 851418370ec22f..035f8bbd032285 100644 --- a/infra/reachability-metadata/src/main/resources/META-INF/native-image/org.apache.shardingsphere/shardingsphere-infra-reachability-metadata/reflect-config.json +++ b/infra/reachability-metadata/src/main/resources/META-INF/native-image/org.apache.shardingsphere/shardingsphere-infra-reachability-metadata/reflect-config.json @@ -34,7 +34,7 @@ "name":"org.apache.shardingsphere.broadcast.yaml.config.YamlBroadcastRuleConfigurationCustomizer" }, { - "condition":{"typeReachable":"org.apache.shardingsphere.infra.state.datasource.DataSourceStateManager"}, + "condition":{"typeReachable":"org.apache.shardingsphere.infra.database.DatabaseTypeEngine"}, "name":"org.apache.shardingsphere.driver.ShardingSphereDriver" }, { @@ -136,12 +136,27 @@ "condition":{"typeReachable":"org.apache.shardingsphere.infra.yaml.config.shortcut.YamlRuleConfigurationShortcuts"}, "name":"org.apache.shardingsphere.globalclock.core.yaml.config.YamlGlobalClockRuleConfiguration" }, +{ + "condition":{"typeReachable":"org.apache.shardingsphere.mode.manager.cluster.coordinator.registry.status.compute.service.ComputeNodeStatusService"}, + "name":"org.apache.shardingsphere.infra.instance.ComputeNodeData", + "allDeclaredFields":true, + "queryAllPublicMethods":true, + "methods":[{"name":"","parameterTypes":[] }, {"name":"getAttribute","parameterTypes":[] }, {"name":"getVersion","parameterTypes":[] }, {"name":"setAttribute","parameterTypes":["java.lang.String"] }, {"name":"setVersion","parameterTypes":["java.lang.String"] }] +}, +{ + "condition":{"typeReachable":"org.apache.shardingsphere.mode.manager.cluster.coordinator.registry.status.compute.service.ComputeNodeStatusService"}, + "name":"org.apache.shardingsphere.infra.instance.ComputeNodeDataBeanInfo" +}, +{ + "condition":{"typeReachable":"org.apache.shardingsphere.mode.manager.cluster.coordinator.registry.status.compute.service.ComputeNodeStatusService"}, + "name":"org.apache.shardingsphere.infra.instance.ComputeNodeDataCustomizer" +}, { "condition":{"typeReachable":"org.apache.shardingsphere.infra.parser.cache.SQLStatementCacheBuilder"}, "name":"org.apache.shardingsphere.infra.parser.cache.SQLStatementCacheLoader" }, { - "condition":{"typeReachable":"org.apache.shardingsphere.infra.yaml.config.pojo.algorithm.YamlAlgorithmConfiguration"}, + "condition":{"typeReachable":"org.apache.shardingsphere.encrypt.yaml.swapper.NewYamlEncryptRuleConfigurationSwapper"}, "name":"org.apache.shardingsphere.infra.yaml.config.pojo.algorithm.YamlAlgorithmConfiguration", "allDeclaredFields":true, "queryAllPublicMethods":true, @@ -174,12 +189,8 @@ "condition":{"typeReachable":"org.apache.shardingsphere.infra.util.yaml.YamlEngine"}, "name":"org.apache.shardingsphere.infra.yaml.config.pojo.mode.YamlPersistRepositoryConfiguration", "allDeclaredFields":true, - "methods":[{"name":"","parameterTypes":[] }, {"name":"setType","parameterTypes":["java.lang.String"] }] -}, -{ - "condition":{"typeReachable":"org.apache.shardingsphere.infra.yaml.config.pojo.mode.YamlPersistRepositoryConfiguration"}, - "name":"org.apache.shardingsphere.infra.yaml.config.pojo.mode.YamlPersistRepositoryConfiguration", - "queryAllPublicMethods":true + "queryAllPublicMethods":true, + "methods":[{"name":"","parameterTypes":[] }, {"name":"setProps","parameterTypes":["java.util.Properties"] }, {"name":"setType","parameterTypes":["java.lang.String"] }] }, { "condition":{"typeReachable":"org.apache.shardingsphere.infra.yaml.config.pojo.mode.YamlPersistRepositoryConfigurationBeanInfo"}, @@ -210,7 +221,7 @@ "name":"org.apache.shardingsphere.infra.yaml.schema.pojo.YamlShardingSphereColumn", "allDeclaredFields":true, "queryAllPublicMethods":true, - "methods":[{"name":"","parameterTypes":[] }, {"name":"getDataType","parameterTypes":[] }, {"name":"getName","parameterTypes":[] }, {"name":"isCaseSensitive","parameterTypes":[] }, {"name":"isGenerated","parameterTypes":[] }, {"name":"isNullable","parameterTypes":[] }, {"name":"isPrimaryKey","parameterTypes":[] }, {"name":"isUnsigned","parameterTypes":[] }, {"name":"isVisible","parameterTypes":[] }, {"name":"setCaseSensitive","parameterTypes":["boolean"] }, {"name":"setDataType","parameterTypes":["int"] }, {"name":"setGenerated","parameterTypes":["boolean"] }, {"name":"setName","parameterTypes":["java.lang.String"] }, {"name":"setPrimaryKey","parameterTypes":["boolean"] }, {"name":"setUnsigned","parameterTypes":["boolean"] }, {"name":"setVisible","parameterTypes":["boolean"] }] + "methods":[{"name":"","parameterTypes":[] }, {"name":"getDataType","parameterTypes":[] }, {"name":"getName","parameterTypes":[] }, {"name":"isCaseSensitive","parameterTypes":[] }, {"name":"isGenerated","parameterTypes":[] }, {"name":"isNullable","parameterTypes":[] }, {"name":"isPrimaryKey","parameterTypes":[] }, {"name":"isUnsigned","parameterTypes":[] }, {"name":"isVisible","parameterTypes":[] }, {"name":"setCaseSensitive","parameterTypes":["boolean"] }, {"name":"setDataType","parameterTypes":["int"] }, {"name":"setGenerated","parameterTypes":["boolean"] }, {"name":"setName","parameterTypes":["java.lang.String"] }, {"name":"setNullable","parameterTypes":["boolean"] }, {"name":"setPrimaryKey","parameterTypes":["boolean"] }, {"name":"setUnsigned","parameterTypes":["boolean"] }, {"name":"setVisible","parameterTypes":["boolean"] }] }, { "condition":{"typeReachable":"org.apache.shardingsphere.infra.yaml.schema.pojo.YamlShardingSphereColumnBeanInfo"}, @@ -225,7 +236,7 @@ "name":"org.apache.shardingsphere.infra.yaml.schema.pojo.YamlShardingSphereIndex", "allDeclaredFields":true, "queryAllPublicMethods":true, - "methods":[{"name":"","parameterTypes":[] }, {"name":"getColumns","parameterTypes":[] }, {"name":"getName","parameterTypes":[] }, {"name":"isUnique","parameterTypes":[] }, {"name":"setName","parameterTypes":["java.lang.String"] }] + "methods":[{"name":"","parameterTypes":[] }, {"name":"getColumns","parameterTypes":[] }, {"name":"getName","parameterTypes":[] }, {"name":"isUnique","parameterTypes":[] }, {"name":"setName","parameterTypes":["java.lang.String"] }, {"name":"setUnique","parameterTypes":["boolean"] }] }, { "condition":{"typeReachable":"org.apache.shardingsphere.infra.yaml.schema.pojo.YamlShardingSphereIndexBeanInfo"}, @@ -236,7 +247,7 @@ "name":"org.apache.shardingsphere.infra.yaml.schema.pojo.YamlShardingSphereIndexCustomizer" }, { - "condition":{"typeReachable":"org.apache.shardingsphere.metadata.persist.service.schema.NewTableMetaDataPersistService"}, + "condition":{"typeReachable":"org.apache.shardingsphere.infra.metadata.database.schema.builder.SystemSchemaBuilder"}, "name":"org.apache.shardingsphere.infra.yaml.schema.pojo.YamlShardingSphereTable", "allDeclaredFields":true, "queryAllPublicMethods":true, @@ -359,16 +370,73 @@ "condition":{"typeReachable":"org.apache.shardingsphere.mask.yaml.config.rule.YamlMaskTableRuleConfigurationCustomizer"}, "name":"org.apache.shardingsphere.mask.yaml.config.rule.YamlMaskTableRuleConfigurationCustomizer" }, +{ + "condition":{"typeReachable":"org.apache.shardingsphere.mode.manager.cluster.coordinator.registry.metadata.subscriber.ShardingSphereSchemaDataRegistrySubscriber"}, + "name":"org.apache.shardingsphere.mode.manager.cluster.coordinator.registry.metadata.subscriber.ShardingSphereSchemaDataRegistrySubscriber", + "queryAllDeclaredMethods":true +}, +{ + "condition":{"typeReachable":"org.apache.shardingsphere.mode.manager.cluster.coordinator.registry.process.subscriber.ClusterProcessSubscriber"}, + "name":"org.apache.shardingsphere.mode.manager.cluster.coordinator.registry.process.subscriber.ClusterProcessSubscriber", + "queryAllDeclaredMethods":true +}, +{ + "condition":{"typeReachable":"org.apache.shardingsphere.mode.manager.cluster.coordinator.registry.process.subscriber.NewProcessListChangedSubscriber"}, + "name":"org.apache.shardingsphere.mode.manager.cluster.coordinator.registry.process.subscriber.NewProcessListChangedSubscriber", + "queryAllDeclaredMethods":true +}, +{ + "condition":{"typeReachable":"org.apache.shardingsphere.mode.manager.cluster.coordinator.registry.status.cluster.subscriber.ClusterStatusSubscriber"}, + "name":"org.apache.shardingsphere.mode.manager.cluster.coordinator.registry.status.cluster.subscriber.ClusterStatusSubscriber", + "queryAllDeclaredMethods":true +}, +{ + "condition":{"typeReachable":"org.apache.shardingsphere.mode.manager.cluster.coordinator.registry.status.compute.subscriber.NewComputeNodeStatusSubscriber"}, + "name":"org.apache.shardingsphere.mode.manager.cluster.coordinator.registry.status.compute.subscriber.NewComputeNodeStatusSubscriber", + "queryAllDeclaredMethods":true +}, +{ + "condition":{"typeReachable":"org.apache.shardingsphere.mode.manager.cluster.coordinator.registry.status.storage.subscriber.StorageNodeStatusSubscriber"}, + "name":"org.apache.shardingsphere.mode.manager.cluster.coordinator.registry.status.storage.subscriber.StorageNodeStatusSubscriber", + "queryAllDeclaredMethods":true +}, +{ + "condition":{"typeReachable":"org.apache.shardingsphere.infra.util.eventbus.EventBusContext"}, + "name":"org.apache.shardingsphere.mode.manager.cluster.coordinator.subscriber.CacheEvictedSubscriber", + "queryAllDeclaredMethods":true, + "methods":[{"name":"onGovernanceEvent","parameterTypes":["org.apache.shardingsphere.infra.rule.event.GovernanceEvent"] }] +}, +{ + "condition":{"typeReachable":"org.apache.shardingsphere.mode.manager.cluster.coordinator.subscriber.DatabaseChangedSubscriber"}, + "name":"org.apache.shardingsphere.mode.manager.cluster.coordinator.subscriber.DatabaseChangedSubscriber", + "queryAllDeclaredMethods":true +}, +{ + "condition":{"typeReachable":"org.apache.shardingsphere.infra.util.eventbus.EventBusContext"}, + "name":"org.apache.shardingsphere.mode.manager.cluster.coordinator.subscriber.NewResourceMetaDataChangedSubscriber", + "queryAllDeclaredMethods":true, + "methods":[{"name":"renew","parameterTypes":["org.apache.shardingsphere.mode.event.schema.table.AlterTableEvent"] }, {"name":"renew","parameterTypes":["org.apache.shardingsphere.mode.event.schema.table.DropTableEvent"] }] +}, +{ + "condition":{"typeReachable":"org.apache.shardingsphere.mode.manager.cluster.coordinator.subscriber.NewStateChangedSubscriber"}, + "name":"org.apache.shardingsphere.mode.manager.cluster.coordinator.subscriber.NewStateChangedSubscriber", + "queryAllDeclaredMethods":true +}, { "condition":{"typeReachable":"org.apache.shardingsphere.mode.manager.standalone.subscriber.StandaloneProcessSubscriber"}, "name":"org.apache.shardingsphere.mode.manager.standalone.subscriber.StandaloneProcessSubscriber", "queryAllDeclaredMethods":true }, { - "condition":{"typeReachable":"org.apache.shardingsphere.mode.manager.standalone.subscriber.StandaloneProcessSubscriber"}, + "condition":{"typeReachable":"org.apache.shardingsphere.mode.manager.cluster.coordinator.registry.process.subscriber.ClusterProcessSubscriber"}, "name":"org.apache.shardingsphere.mode.process.ProcessSubscriber", "queryAllDeclaredMethods":true }, +{ + "condition":{"typeReachable":"org.apache.shardingsphere.mode.manager.cluster.NewClusterContextManagerBuilder"}, + "name":"org.apache.shardingsphere.mode.repository.cluster.zookeeper.ZookeeperRepository", + "methods":[{"name":"","parameterTypes":[] }] +}, { "condition":{"typeReachable":"org.apache.shardingsphere.mode.manager.standalone.NewStandaloneContextManagerBuilder"}, "name":"org.apache.shardingsphere.mode.repository.standalone.jdbc.JDBCRepository", @@ -386,7 +454,7 @@ "queryAllDeclaredMethods":true }, { - "condition":{"typeReachable":"org.apache.shardingsphere.mode.manager.standalone.NewStandaloneContextManagerBuilder"}, + "condition":{"typeReachable":"org.apache.shardingsphere.mode.manager.cluster.NewClusterContextManagerBuilder"}, "name":"org.apache.shardingsphere.mode.subsciber.RuleItemChangedSubscriber", "queryAllDeclaredMethods":true }, @@ -688,22 +756,18 @@ "name":"org.apache.shardingsphere.sharding.yaml.config.strategy.sharding.YamlStandardShardingStrategyConfigurationCustomizer" }, { - "condition":{"typeReachable":"org.apache.shardingsphere.single.yaml.config.pojo.YamlSingleRuleConfiguration"}, - "name":"org.apache.shardingsphere.single.yaml.config.pojo.YamlSingleRuleConfiguration", - "queryAllPublicMethods":true -}, -{ - "condition":{"typeReachable":"org.apache.shardingsphere.single.yaml.config.swapper.NewYamlSingleRuleConfigurationSwapper"}, + "condition":{"typeReachable":"org.apache.shardingsphere.infra.yaml.config.shortcut.YamlRuleConfigurationShortcuts"}, "name":"org.apache.shardingsphere.single.yaml.config.pojo.YamlSingleRuleConfiguration", + "queryAllPublicMethods":true, "allDeclaredFields":true, "methods":[{"name":"getDefaultDataSource","parameterTypes":[] }, {"name":"getTables","parameterTypes":[] }] }, { - "condition":{"typeReachable":"org.apache.shardingsphere.single.yaml.config.pojo.YamlSingleRuleConfigurationBeanInfo"}, + "condition":{"typeReachable":"org.apache.shardingsphere.mode.manager.cluster.NewClusterContextManagerBuilder"}, "name":"org.apache.shardingsphere.single.yaml.config.pojo.YamlSingleRuleConfigurationBeanInfo" }, { - "condition":{"typeReachable":"org.apache.shardingsphere.single.yaml.config.pojo.YamlSingleRuleConfigurationCustomizer"}, + "condition":{"typeReachable":"org.apache.shardingsphere.mode.manager.cluster.NewClusterContextManagerBuilder"}, "name":"org.apache.shardingsphere.single.yaml.config.pojo.YamlSingleRuleConfigurationCustomizer" }, { @@ -876,7 +940,12 @@ "methods":[{"name":"","parameterTypes":[] }] }, { - "condition":{"typeReachable":"org.apache.shardingsphere.sqlfederation.rule.SQLFederationRule"}, + "condition":{"typeReachable":"org.apache.shardingsphere.sql.parser.sqlserver.visitor.statement.type.SQLServerDMLStatementVisitor"}, + "name":"org.apache.shardingsphere.sql.parser.sqlserver.visitor.statement.type.SQLServerDMLStatementVisitor", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "condition":{"typeReachable":"org.apache.shardingsphere.sqlfederation.rule.builder.SQLFederationRuleBuilder"}, "name":"org.apache.shardingsphere.sqlfederation.optimizer.planner.util.SQLFederationFunctionUtils", "queryAllPublicMethods":true }, @@ -900,10 +969,5 @@ { "condition":{"typeReachable":"org.apache.shardingsphere.infra.yaml.config.shortcut.YamlRuleConfigurationShortcuts"}, "name":"org.apache.shardingsphere.transaction.yaml.config.YamlTransactionRuleConfiguration" -}, -{ - "condition":{"typeReachable":"org.apache.shardingsphere.sql.parser.sqlserver.visitor.statement.type.SQLServerDMLStatementVisitor"}, - "name":"org.apache.shardingsphere.sql.parser.sqlserver.visitor.statement.type.SQLServerDMLStatementVisitor", - "methods":[{"name":"","parameterTypes":[] }] } ] diff --git a/infra/reachability-metadata/src/main/resources/META-INF/native-image/org.apache.shardingsphere/shardingsphere-infra-reachability-metadata/resource-config.json b/infra/reachability-metadata/src/main/resources/META-INF/native-image/org.apache.shardingsphere/shardingsphere-infra-reachability-metadata/resource-config.json index 64b7a2a13b1355..04449f0e133d56 100644 --- a/infra/reachability-metadata/src/main/resources/META-INF/native-image/org.apache.shardingsphere/shardingsphere-infra-reachability-metadata/resource-config.json +++ b/infra/reachability-metadata/src/main/resources/META-INF/native-image/org.apache.shardingsphere/shardingsphere-infra-reachability-metadata/resource-config.json @@ -7,10 +7,10 @@ "condition":{"typeReachable":"org.apache.shardingsphere.mode.repository.standalone.jdbc.sql.JDBCRepositorySQLLoader"}, "pattern":".*sql/.+\\.xml$" }, { - "condition":{"typeReachable":"org.apache.shardingsphere.driver.ShardingSphereDriver"}, + "condition":{"typeReachable":"org.apache.shardingsphere.infra.state.datasource.DataSourceStateManager"}, "pattern":"\\QMETA-INF/services/java.sql.Driver\\E" }, { - "condition":{"typeReachable":"org.apache.shardingsphere.infra.spi.ShardingSphereServiceLoader"}, + "condition":{"typeReachable":"org.apache.shardingsphere.mode.manager.cluster.NewClusterContextManagerBuilder"}, "pattern":"\\QMETA-INF/services/org.apache.shardingsphere.authority.spi.AuthorityRegistryProvider\\E" }, { "condition":{"typeReachable":"org.apache.shardingsphere.infra.spi.ShardingSphereServiceLoader"}, @@ -64,7 +64,7 @@ "condition":{"typeReachable":"org.apache.shardingsphere.infra.metadata.database.schema.builder.GenericSchemaBuilder"}, "pattern":"\\QMETA-INF/services/org.apache.shardingsphere.infra.metadata.database.schema.reviser.MetaDataReviseEntry\\E" }, { - "condition":{"typeReachable":"org.apache.shardingsphere.infra.spi.ShardingSphereServiceLoader"}, + "condition":{"typeReachable":"org.apache.shardingsphere.mode.manager.cluster.NewClusterContextManagerBuilder"}, "pattern":"\\QMETA-INF/services/org.apache.shardingsphere.infra.metadata.statistics.builder.ShardingSphereStatisticsBuilder\\E" }, { "condition":{"typeReachable":"org.apache.shardingsphere.infra.rewrite.SQLRewriteEntry"}, @@ -102,9 +102,21 @@ }, { "condition":{"typeReachable":"org.apache.shardingsphere.infra.spi.ShardingSphereServiceLoader"}, "pattern":"\\QMETA-INF/services/org.apache.shardingsphere.mode.manager.ContextManagerBuilder\\E" + }, { + "condition":{"typeReachable":"org.apache.shardingsphere.mode.manager.cluster.coordinator.registry.NewGovernanceWatcherFactory"}, + "pattern":"\\QMETA-INF/services/org.apache.shardingsphere.mode.manager.cluster.coordinator.registry.NewGovernanceWatcher\\E" + }, { + "condition":{"typeReachable":"org.apache.shardingsphere.mode.manager.cluster.NewClusterContextManagerBuilder"}, + "pattern":"\\QMETA-INF/services/org.apache.shardingsphere.mode.repository.cluster.ClusterPersistRepository\\E" + }, { + "condition":{"typeReachable":"org.apache.shardingsphere.mode.repository.cluster.lock.holder.DistributedLockHolder"}, + "pattern":"\\QMETA-INF/services/org.apache.shardingsphere.mode.repository.cluster.lock.creator.DistributedLockCreator\\E" }, { "condition":{"typeReachable":"org.apache.shardingsphere.infra.spi.ShardingSphereServiceLoader"}, "pattern":"\\QMETA-INF/services/org.apache.shardingsphere.mode.repository.standalone.StandalonePersistRepository\\E" + }, { + "condition":{"typeReachable":"org.apache.shardingsphere.mode.metadata.builder.RuleConfigurationEventBuilder"}, + "pattern":"\\QMETA-INF/services/org.apache.shardingsphere.mode.spi.RuleNodePathProvider\\E" }, { "condition":{"typeReachable":"org.apache.shardingsphere.readwritesplitting.route.standard.StandardReadwriteSplittingDataSourceRouter"}, "pattern":"\\QMETA-INF/services/org.apache.shardingsphere.readwritesplitting.route.standard.filter.ReadDataSourcesFilter\\E" @@ -127,7 +139,7 @@ "condition":{"typeReachable":"org.apache.shardingsphere.sqltranslator.rule.SQLTranslatorRule"}, "pattern":"\\QMETA-INF/services/org.apache.shardingsphere.sqltranslator.spi.SQLTranslator\\E" }, { - "condition":{"typeReachable":"org.apache.shardingsphere.infra.spi.ShardingSphereServiceLoader"}, + "condition":{"typeReachable":"org.apache.shardingsphere.mode.manager.cluster.NewClusterContextManagerBuilder"}, "pattern":"\\QMETA-INF/services/org.apache.shardingsphere.timeservice.spi.TimestampService\\E" }, { "condition":{"typeReachable":"org.apache.shardingsphere.mode.repository.standalone.jdbc.sql.JDBCRepositorySQLLoader"}, diff --git a/test/native/native-image-filter/extra-filter.json b/test/native/native-image-filter/extra-filter.json index 327dcc4e9e3866..535055b6a7a795 100644 --- a/test/native/native-image-filter/extra-filter.json +++ b/test/native/native-image-filter/extra-filter.json @@ -18,11 +18,13 @@ {"excludeClasses": "com.github.dockerjava.api.**"}, {"excludeClasses": "com.google.common.util.concurrent.**"}, {"excludeClasses": "com.ibm.icu.text.**"}, + {"excludeClasses": "com.microsoft.sqlserver.jdbc.**"}, {"excludeClasses": "com.mysql.cj.**"}, {"excludeClasses": "com.zaxxer.hikari.**"}, {"excludeClasses": "javax.xml.**"}, {"excludeClasses": "groovy.**"}, {"excludeClasses": "org.apache.calcite.**"}, + {"excludeClasses": "org.apache.zookeeper.**"}, {"excludeClasses": "org.codehaus.groovy.**"}, {"excludeClasses": "org.h2.**"}, {"excludeClasses": "org.locationtech.jts.geom.**"}, diff --git a/test/native/pom.xml b/test/native/pom.xml index bafa5da53a9c84..96d87fb8d2b6f0 100644 --- a/test/native/pom.xml +++ b/test/native/pom.xml @@ -39,12 +39,13 @@ ${project.version} test - - org.hamcrest - hamcrest + org.apache.shardingsphere + shardingsphere-cluster-mode-repository-zookeeper + ${project.version} test + org.awaitility awaitility diff --git a/test/native/src/test/java/org/apache/shardingsphere/test/natived/jdbc/databases/MySQLTest.java b/test/native/src/test/java/org/apache/shardingsphere/test/natived/jdbc/databases/MySQLTest.java index 6ca7b876f2dee7..9b232aa4d86362 100644 --- a/test/native/src/test/java/org/apache/shardingsphere/test/natived/jdbc/databases/MySQLTest.java +++ b/test/native/src/test/java/org/apache/shardingsphere/test/natived/jdbc/databases/MySQLTest.java @@ -17,6 +17,10 @@ package org.apache.shardingsphere.test.natived.jdbc.databases; +import com.github.dockerjava.api.model.ExposedPort; +import com.github.dockerjava.api.model.HostConfig; +import com.github.dockerjava.api.model.PortBinding; +import com.github.dockerjava.api.model.Ports; import com.mysql.cj.jdbc.exceptions.CommunicationsException; import org.apache.shardingsphere.driver.api.yaml.YamlShardingSphereDataSourceFactory; import org.apache.shardingsphere.test.natived.jdbc.commons.AbstractShardingCommonTest; @@ -24,9 +28,10 @@ import org.awaitility.Awaitility; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.condition.EnabledInNativeImage; +import org.testcontainers.containers.GenericContainer; +import org.testcontainers.utility.DockerImageName; import javax.sql.DataSource; -import java.io.File; import java.io.IOException; import java.sql.Connection; import java.sql.DriverManager; @@ -34,6 +39,10 @@ import java.time.Duration; import java.util.Properties; +/** + * Unable to use `org.testcontainers:mysql:1.19.3` under GraalVM Native Image. + * Background comes from testcontainers/testcontainers-java#7954. + */ public class MySQLTest { private static final String USERNAME = "root"; @@ -44,20 +53,25 @@ public class MySQLTest { private static final String JDBC_URL = "jdbc:mysql://localhost:65107/" + DATABASE; - private static Process process; - private AbstractShardingCommonTest abstractShardingCommonTest; + @SuppressWarnings("resource") @Test @EnabledInNativeImage void assertShardingInLocalTransactions() throws SQLException, IOException { - beforeAll(); - DataSource dataSource = YamlShardingSphereDataSourceFactory.createDataSource(FileTestUtils.readFromFileURLString("test-native/yaml/databases/mysql.yaml")); - abstractShardingCommonTest = new AbstractShardingCommonTest(dataSource); - this.initEnvironment(); - abstractShardingCommonTest.processSuccess(); - abstractShardingCommonTest.cleanEnvironment(); - tearDown(); + try ( + GenericContainer mySQLContainer = new GenericContainer<>(DockerImageName.parse("mysql:8.2.0-oracle")) + .withEnv("MYSQL_DATABASE", DATABASE) + .withEnv("MYSQL_ROOT_PASSWORD", PASSWORD) + .withCreateContainerCmdModifier(cmd -> cmd.withHostConfig(new HostConfig().withPortBindings(new PortBinding(Ports.Binding.bindPort(65107), new ExposedPort(3306)))))) { + mySQLContainer.start(); + beforeAll(); + DataSource dataSource = YamlShardingSphereDataSourceFactory.createDataSource(FileTestUtils.readFromFileURLString("test-native/yaml/databases/mysql.yaml")); + abstractShardingCommonTest = new AbstractShardingCommonTest(dataSource); + this.initEnvironment(); + abstractShardingCommonTest.processSuccess(); + abstractShardingCommonTest.cleanEnvironment(); + } } private void initEnvironment() throws SQLException { @@ -77,14 +91,7 @@ private static Connection openConnection() throws SQLException { } @SuppressWarnings({"SqlDialectInspection", "SqlNoDataSourceInspection"}) - private static void beforeAll() throws IOException { - System.out.println("Starting MySQL ..."); - process = new ProcessBuilder( - "docker", "run", "--rm", "-p", "65107:3306", "-e", "MYSQL_DATABASE=" + DATABASE, - "-e", "MYSQL_ROOT_PASSWORD=" + PASSWORD, "mysql:8.2.0-oracle") - .redirectOutput(new File("target/mysql-stdout.txt")) - .redirectError(new File("target/mysql-stderr.txt")) - .start(); + private void beforeAll() { Awaitility.await().atMost(Duration.ofMinutes(1)).ignoreExceptionsMatching(e -> e instanceof CommunicationsException) .until(() -> { openConnection().close(); @@ -97,13 +104,5 @@ private static void beforeAll() throws IOException { } catch (SQLException e) { throw new RuntimeException(e); } - System.out.println("MySQL started"); - } - - private static void tearDown() { - if (null != process && process.isAlive()) { - System.out.println("Shutting down MySQL"); - process.destroy(); - } } } diff --git a/test/native/src/test/java/org/apache/shardingsphere/test/natived/jdbc/databases/OpenGaussTest.java b/test/native/src/test/java/org/apache/shardingsphere/test/natived/jdbc/databases/OpenGaussTest.java index 1c84b9e923fc50..766f1fdd437ccd 100644 --- a/test/native/src/test/java/org/apache/shardingsphere/test/natived/jdbc/databases/OpenGaussTest.java +++ b/test/native/src/test/java/org/apache/shardingsphere/test/natived/jdbc/databases/OpenGaussTest.java @@ -17,15 +17,20 @@ package org.apache.shardingsphere.test.natived.jdbc.databases; +import com.github.dockerjava.api.model.ExposedPort; +import com.github.dockerjava.api.model.HostConfig; +import com.github.dockerjava.api.model.PortBinding; +import com.github.dockerjava.api.model.Ports; import org.apache.shardingsphere.driver.api.yaml.YamlShardingSphereDataSourceFactory; import org.apache.shardingsphere.test.natived.jdbc.commons.AbstractShardingCommonTest; import org.apache.shardingsphere.test.natived.jdbc.commons.FileTestUtils; import org.awaitility.Awaitility; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.condition.EnabledInNativeImage; +import org.testcontainers.containers.GenericContainer; +import org.testcontainers.utility.DockerImageName; import javax.sql.DataSource; -import java.io.File; import java.io.IOException; import java.sql.Connection; import java.sql.DriverManager; @@ -43,20 +48,24 @@ public class OpenGaussTest { private static final String JDBC_URL = "jdbc:opengauss://localhost:62390/" + DATABASE; - private static Process process; - private AbstractShardingCommonTest abstractShardingCommonTest; + @SuppressWarnings("resource") @Test @EnabledInNativeImage void assertShardingInLocalTransactions() throws SQLException, IOException { - beforeAll(); - DataSource dataSource = YamlShardingSphereDataSourceFactory.createDataSource(FileTestUtils.readFromFileURLString("test-native/yaml/databases/opengauss.yaml")); - abstractShardingCommonTest = new AbstractShardingCommonTest(dataSource); - this.initEnvironment(); - abstractShardingCommonTest.processSuccess(); - abstractShardingCommonTest.cleanEnvironment(); - tearDown(); + try ( + GenericContainer openGaussContainer = new GenericContainer<>(DockerImageName.parse("opengauss/opengauss:5.0.0")) + .withEnv("GS_PASSWORD", PASSWORD) + .withCreateContainerCmdModifier(cmd -> cmd.withHostConfig(new HostConfig().withPortBindings(new PortBinding(Ports.Binding.bindPort(62390), new ExposedPort(5432)))))) { + openGaussContainer.start(); + beforeAll(); + DataSource dataSource = YamlShardingSphereDataSourceFactory.createDataSource(FileTestUtils.readFromFileURLString("test-native/yaml/databases/opengauss.yaml")); + abstractShardingCommonTest = new AbstractShardingCommonTest(dataSource); + this.initEnvironment(); + abstractShardingCommonTest.processSuccess(); + abstractShardingCommonTest.cleanEnvironment(); + } } private void initEnvironment() throws SQLException { @@ -76,14 +85,7 @@ private static Connection openConnection() throws SQLException { } @SuppressWarnings({"SqlDialectInspection", "SqlNoDataSourceInspection"}) - private static void beforeAll() throws IOException { - System.out.println("Starting OpenGauss ..."); - process = new ProcessBuilder( - "docker", "run", "--rm", "-p", "62390:5432", "-e", "GS_PASSWORD=" + PASSWORD, - "opengauss/opengauss:5.0.0") - .redirectOutput(new File("target/opengauss-stdout.txt")) - .redirectError(new File("target/opengauss-stderr.txt")) - .start(); + private void beforeAll() { Awaitility.await().atMost(Duration.ofMinutes(1)).ignoreExceptions().until(() -> { openConnection().close(); return true; @@ -95,13 +97,5 @@ private static void beforeAll() throws IOException { } catch (SQLException e) { throw new RuntimeException(e); } - System.out.println("OpenGauss started"); - } - - private static void tearDown() { - if (null != process && process.isAlive()) { - System.out.println("Shutting down OpenGauss"); - process.destroy(); - } } } diff --git a/test/native/src/test/java/org/apache/shardingsphere/test/natived/jdbc/mode/cluster/ZookeeperTest.java b/test/native/src/test/java/org/apache/shardingsphere/test/natived/jdbc/mode/cluster/ZookeeperTest.java new file mode 100644 index 00000000000000..d5116a09064fdc --- /dev/null +++ b/test/native/src/test/java/org/apache/shardingsphere/test/natived/jdbc/mode/cluster/ZookeeperTest.java @@ -0,0 +1,86 @@ +/* + * 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.test.natived.jdbc.mode.cluster; + +import com.github.dockerjava.api.model.ExposedPort; +import com.github.dockerjava.api.model.HostConfig; +import com.github.dockerjava.api.model.PortBinding; +import com.github.dockerjava.api.model.Ports; +import org.apache.curator.framework.CuratorFramework; +import org.apache.curator.framework.CuratorFrameworkFactory; +import org.apache.curator.retry.ExponentialBackoffRetry; +import org.apache.shardingsphere.driver.api.yaml.YamlShardingSphereDataSourceFactory; +import org.apache.shardingsphere.test.natived.jdbc.commons.AbstractShardingCommonTest; +import org.apache.shardingsphere.test.natived.jdbc.commons.FileTestUtils; +import org.awaitility.Awaitility; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.condition.EnabledInNativeImage; +import org.testcontainers.containers.GenericContainer; +import org.testcontainers.utility.DockerImageName; + +import javax.sql.DataSource; +import java.io.IOException; +import java.sql.SQLException; +import java.time.Duration; +import java.util.concurrent.TimeUnit; + +public class ZookeeperTest { + + private AbstractShardingCommonTest abstractShardingCommonTest; + + @SuppressWarnings("resource") + @Test + @EnabledInNativeImage + void assertShardingInLocalTransactions() throws SQLException, IOException { + try ( + GenericContainer zookeeperContainer = new GenericContainer<>(DockerImageName.parse("zookeeper:3.9.1-jre-17")) + .withCreateContainerCmdModifier(cmd -> cmd.withHostConfig(new HostConfig().withPortBindings(new PortBinding(Ports.Binding.bindPort(62372), new ExposedPort(2181)))))) { + zookeeperContainer.start(); + this.beforeAll(); + DataSource dataSource = YamlShardingSphereDataSourceFactory.createDataSource(FileTestUtils.readFromFileURLString("test-native/yaml/mode/cluster/zookeeper.yaml")); + abstractShardingCommonTest = new AbstractShardingCommonTest(dataSource); + this.initEnvironment(); + abstractShardingCommonTest.processSuccess(); + abstractShardingCommonTest.cleanEnvironment(); + } + } + + private void initEnvironment() throws SQLException { + abstractShardingCommonTest.getOrderRepository().createTableIfNotExistsInMySQL(); + abstractShardingCommonTest.getOrderItemRepository().createTableIfNotExistsInMySQL(); + abstractShardingCommonTest.getAddressRepository().createTableIfNotExists(); + abstractShardingCommonTest.getOrderRepository().truncateTable(); + abstractShardingCommonTest.getOrderItemRepository().truncateTable(); + abstractShardingCommonTest.getAddressRepository().truncateTable(); + } + + private void beforeAll() { + CuratorFrameworkFactory.Builder builder = CuratorFrameworkFactory.builder() + .connectString("localhost:" + 62372) + .retryPolicy(new ExponentialBackoffRetry(1000, 3)) + .connectionTimeoutMs(15 * 1000) + .sessionTimeoutMs(60 * 1000); + Awaitility.await().atMost(Duration.ofMinutes(1)).ignoreExceptions().until(() -> { + CuratorFramework client = builder.build(); + client.start(); + boolean connected = client.blockUntilConnected(5, TimeUnit.SECONDS); + client.close(); + return connected; + }); + } +} diff --git a/test/native/src/test/resources/META-INF/native-image/shardingsphere-test-native-test-metadata/resource-config.json b/test/native/src/test/resources/META-INF/native-image/shardingsphere-test-native-test-metadata/resource-config.json index f299bfa6457568..c904b01b547963 100644 --- a/test/native/src/test/resources/META-INF/native-image/shardingsphere-test-native-test-metadata/resource-config.json +++ b/test/native/src/test/resources/META-INF/native-image/shardingsphere-test-native-test-metadata/resource-config.json @@ -30,6 +30,9 @@ }, { "condition":{"typeReachable":"org.apache.shardingsphere.test.natived.jdbc.features.ShardingTest"}, "pattern":"\\Qtest-native/yaml/features/sharding.yaml\\E" + }, { + "condition":{"typeReachable":"org.apache.shardingsphere.test.natived.jdbc.mode.cluster.ZookeeperTest"}, + "pattern":"\\Qtest-native/yaml/mode/cluster/zookeeper.yaml\\E" }]}, "bundles":[] } diff --git a/test/native/src/test/resources/test-native/yaml/mode/cluster/zookeeper.yaml b/test/native/src/test/resources/test-native/yaml/mode/cluster/zookeeper.yaml new file mode 100644 index 00000000000000..e8f97657b98e59 --- /dev/null +++ b/test/native/src/test/resources/test-native/yaml/mode/cluster/zookeeper.yaml @@ -0,0 +1,83 @@ +# +# 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. +# + +mode: + type: Cluster + repository: + type: ZooKeeper + props: + namespace: governance + server-lists: localhost:62372 + retryIntervalMilliseconds: 1000 + timeToLiveSeconds: 1000 + +dataSources: + ds_0: + dataSourceClassName: com.zaxxer.hikari.HikariDataSource + driverClassName: org.h2.Driver + jdbcUrl: jdbc:h2:mem:cluster_zookeeper_ds_0;MODE=MYSQL;IGNORECASE=TRUE;CASE_INSENSITIVE_IDENTIFIERS=TRUE + username: root + password: 123456 + ds_1: + dataSourceClassName: com.zaxxer.hikari.HikariDataSource + driverClassName: org.h2.Driver + jdbcUrl: jdbc:h2:mem:cluster_zookeeper_ds_1;MODE=MYSQL;IGNORECASE=TRUE;CASE_INSENSITIVE_IDENTIFIERS=TRUE + username: root + password: 123456 + ds_2: + dataSourceClassName: com.zaxxer.hikari.HikariDataSource + driverClassName: org.h2.Driver + jdbcUrl: jdbc:h2:mem:cluster_zookeeper_ds_2;MODE=MYSQL;IGNORECASE=TRUE;CASE_INSENSITIVE_IDENTIFIERS=TRUE + username: root + password: 123456 + +rules: + - !SHARDING + tables: + t_order: + actualDataNodes: + keyGenerateStrategy: + column: order_id + keyGeneratorName: snowflake + t_order_item: + actualDataNodes: + keyGenerateStrategy: + column: order_item_id + keyGeneratorName: snowflake + defaultDatabaseStrategy: + standard: + shardingColumn: user_id + shardingAlgorithmName: inline + shardingAlgorithms: + inline: + type: CLASS_BASED + props: + strategy: STANDARD + algorithmClassName: org.apache.shardingsphere.test.natived.jdbc.commons.algorithm.ClassBasedInlineShardingAlgorithmFixture + keyGenerators: + snowflake: + type: SNOWFLAKE + auditors: + sharding_key_required_auditor: + type: DML_SHARDING_CONDITIONS + + - !BROADCAST + tables: + - t_address + +props: + sql-show: false