This is an automated email from the ASF dual-hosted git repository. jiangmaolin pushed a commit to branch dev-5.5.1 in repository https://gitbox.apache.org/repos/asf/shardingsphere.git
commit be22d7df977cb4a002baacd03fb2035ebb410f31 Author: Haoran Meng <[email protected]> AuthorDate: Thu Nov 7 11:46:10 2024 +0800 Fixed the wrong sorting method for metadata version (#33579) * Fix npe for ShowTablesExecutor * Fixed the wrong sorting method for metadata version (cherry picked from commit 42cefe008fe26a066e528a5c072c3c3769a9ff31) --- .../rule/AuthorityRuleConfigurationPersistDecorator.java | 2 +- .../config/database/DataSourceNodePersistService.java | 12 +++++++++--- .../config/database/DataSourceUnitPersistService.java | 12 +++++++++--- .../config/database/DatabaseRulePersistService.java | 6 +++++- .../service/config/global/GlobalRulePersistService.java | 2 +- .../service/config/global/PropertiesPersistService.java | 2 +- .../metadata/table/TableMetaDataPersistService.java | 2 +- .../metadata/table/ViewMetaDataPersistService.java | 2 +- .../version/MetaDataVersionBasedPersistService.java | 11 ++++++++++- .../service/version/MetaDataVersionPersistService.java | 15 ++++++++++++--- .../config/global/GlobalRulePersistServiceTest.java | 2 ++ .../config/global/PropertiesPersistServiceTest.java | 10 +++------- .../metadata/table/TableMetaDataPersistServiceTest.java | 14 +++----------- .../metadata/table/ViewMetaDataPersistServiceTest.java | 13 +++---------- .../version/MetaDataVersionPersistServiceTest.java | 6 ++++++ .../mode/metadata/MetaDataContextsFactory.java | 2 -- .../mysql/handler/admin/executor/ShowTablesExecutor.java | 5 ++++- 17 files changed, 71 insertions(+), 47 deletions(-) diff --git a/kernel/authority/core/src/main/java/com/sphereex/dbplusengine/authority/rule/AuthorityRuleConfigurationPersistDecorator.java b/kernel/authority/core/src/main/java/com/sphereex/dbplusengine/authority/rule/AuthorityRuleConfigurationPersistDecorator.java index 173885c0b55..27c50f56d4e 100644 --- a/kernel/authority/core/src/main/java/com/sphereex/dbplusengine/authority/rule/AuthorityRuleConfigurationPersistDecorator.java +++ b/kernel/authority/core/src/main/java/com/sphereex/dbplusengine/authority/rule/AuthorityRuleConfigurationPersistDecorator.java @@ -44,7 +44,7 @@ public final class AuthorityRuleConfigurationPersistDecorator implements RuleCon private AESTextEncryptor textEncryptor; @Override - public void init(Properties props) { + public void init(final Properties props) { if (!props.containsKey(ENCRYPT_UNIQUE_VALUE_KEY)) { log.warn("The encrypt unique key not found, default value will be used"); } diff --git a/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/config/database/DataSourceNodePersistService.java b/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/config/database/DataSourceNodePersistService.java index 6bf39765cf4..1090edfc2b5 100644 --- a/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/config/database/DataSourceNodePersistService.java +++ b/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/config/database/DataSourceNodePersistService.java @@ -18,12 +18,12 @@ package org.apache.shardingsphere.metadata.persist.service.config.database; import com.google.common.base.Strings; -import lombok.RequiredArgsConstructor; import org.apache.shardingsphere.infra.datasource.pool.props.domain.DataSourcePoolProperties; import org.apache.shardingsphere.infra.metadata.version.MetaDataVersion; import org.apache.shardingsphere.infra.util.yaml.YamlEngine; import org.apache.shardingsphere.infra.yaml.config.swapper.resource.YamlDataSourceConfigurationSwapper; import org.apache.shardingsphere.metadata.persist.node.metadata.DataSourceMetaDataNode; +import org.apache.shardingsphere.metadata.persist.service.version.MetaDataVersionPersistService; import org.apache.shardingsphere.mode.spi.PersistRepository; import java.util.Collection; @@ -35,11 +35,17 @@ import java.util.Map.Entry; /** * Data source node persist service. */ -@RequiredArgsConstructor public final class DataSourceNodePersistService { private final PersistRepository repository; + private final MetaDataVersionPersistService metaDataVersionPersistService; + + public DataSourceNodePersistService(final PersistRepository repository) { + this.repository = repository; + metaDataVersionPersistService = new MetaDataVersionPersistService(repository); + } + /** * Load data source pool properties map. * @@ -81,7 +87,7 @@ public final class DataSourceNodePersistService { public void persist(final String databaseName, final Map<String, DataSourcePoolProperties> dataSourceConfigs) { for (Entry<String, DataSourcePoolProperties> entry : dataSourceConfigs.entrySet()) { String activeVersion = getDataSourceActiveVersion(databaseName, entry.getKey()); - List<String> versions = repository.getChildrenKeys(DataSourceMetaDataNode.getDataSourceNodeVersionsNode(databaseName, entry.getKey())); + List<String> versions = metaDataVersionPersistService.getVersions(DataSourceMetaDataNode.getDataSourceNodeVersionsNode(databaseName, entry.getKey())); repository.persist(DataSourceMetaDataNode.getDataSourceNodeVersionNode(databaseName, entry.getKey(), versions.isEmpty() ? MetaDataVersion.DEFAULT_VERSION : String.valueOf(Integer.parseInt(versions.get(0)) + 1)), YamlEngine.marshal(new YamlDataSourceConfigurationSwapper().swapToMap(entry.getValue()))); diff --git a/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/config/database/DataSourceUnitPersistService.java b/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/config/database/DataSourceUnitPersistService.java index f2657d847a7..4e9a4cc2b98 100644 --- a/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/config/database/DataSourceUnitPersistService.java +++ b/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/config/database/DataSourceUnitPersistService.java @@ -18,12 +18,12 @@ package org.apache.shardingsphere.metadata.persist.service.config.database; import com.google.common.base.Strings; -import lombok.RequiredArgsConstructor; import org.apache.shardingsphere.infra.datasource.pool.props.domain.DataSourcePoolProperties; import org.apache.shardingsphere.infra.metadata.version.MetaDataVersion; import org.apache.shardingsphere.infra.util.yaml.YamlEngine; import org.apache.shardingsphere.infra.yaml.config.swapper.resource.YamlDataSourceConfigurationSwapper; import org.apache.shardingsphere.metadata.persist.node.metadata.DataSourceMetaDataNode; +import org.apache.shardingsphere.metadata.persist.service.version.MetaDataVersionPersistService; import org.apache.shardingsphere.mode.spi.PersistRepository; import java.util.Collection; @@ -37,11 +37,17 @@ import java.util.stream.Collectors; /** * Data source unit persist service. */ -@RequiredArgsConstructor public final class DataSourceUnitPersistService { private final PersistRepository repository; + private final MetaDataVersionPersistService metaDataVersionPersistService; + + public DataSourceUnitPersistService(final PersistRepository repository) { + this.repository = repository; + metaDataVersionPersistService = new MetaDataVersionPersistService(repository); + } + /** * Load data source pool properties map. * @@ -77,7 +83,7 @@ public final class DataSourceUnitPersistService { Collection<MetaDataVersion> result = new LinkedList<>(); for (Entry<String, DataSourcePoolProperties> entry : dataSourcePropsMap.entrySet()) { String activeVersion = getDataSourceActiveVersion(databaseName, entry.getKey()); - List<String> versions = repository.getChildrenKeys(DataSourceMetaDataNode.getDataSourceUnitVersionsNode(databaseName, entry.getKey())); + List<String> versions = metaDataVersionPersistService.getVersions(DataSourceMetaDataNode.getDataSourceUnitVersionsNode(databaseName, entry.getKey())); String nextActiveVersion = versions.isEmpty() ? MetaDataVersion.DEFAULT_VERSION : String.valueOf(Integer.parseInt(versions.get(0)) + 1); repository.persist(DataSourceMetaDataNode.getDataSourceUnitVersionNode(databaseName, entry.getKey(), nextActiveVersion), YamlEngine.marshal(new YamlDataSourceConfigurationSwapper().swapToMap(entry.getValue()))); 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 fe4b1bf7720..41fc68e35d5 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 @@ -26,6 +26,7 @@ import org.apache.shardingsphere.infra.yaml.config.pojo.rule.YamlRuleConfigurati import org.apache.shardingsphere.infra.yaml.config.swapper.rule.YamlRuleConfigurationSwapperEngine; import org.apache.shardingsphere.metadata.persist.node.metadata.DatabaseRuleMetaDataNode; import org.apache.shardingsphere.metadata.persist.service.config.RepositoryTuplePersistService; +import org.apache.shardingsphere.metadata.persist.service.version.MetaDataVersionPersistService; import org.apache.shardingsphere.mode.spi.PersistRepository; import org.apache.shardingsphere.mode.tuple.RepositoryTuple; import org.apache.shardingsphere.mode.tuple.RepositoryTupleSwapperEngine; @@ -46,9 +47,12 @@ public final class DatabaseRulePersistService { private final RepositoryTuplePersistService repositoryTuplePersistService; + private final MetaDataVersionPersistService metaDataVersionPersistService; + public DatabaseRulePersistService(final PersistRepository repository) { this.repository = repository; repositoryTuplePersistService = new RepositoryTuplePersistService(repository); + metaDataVersionPersistService = new MetaDataVersionPersistService(repository); } /** @@ -83,7 +87,7 @@ public final class DatabaseRulePersistService { private Collection<MetaDataVersion> persistDataNodes(final String databaseName, final String ruleName, final Collection<RepositoryTuple> repositoryTuples) { Collection<MetaDataVersion> result = new LinkedList<>(); for (RepositoryTuple each : repositoryTuples) { - List<String> versions = repository.getChildrenKeys(DatabaseRuleMetaDataNode.getDatabaseRuleVersionsNode(databaseName, ruleName, each.getKey())); + List<String> versions = metaDataVersionPersistService.getVersions(DatabaseRuleMetaDataNode.getDatabaseRuleVersionsNode(databaseName, ruleName, each.getKey())); String nextVersion = versions.isEmpty() ? MetaDataVersion.DEFAULT_VERSION : String.valueOf(Integer.parseInt(versions.get(0)) + 1); repository.persist(DatabaseRuleMetaDataNode.getDatabaseRuleVersionNode(databaseName, ruleName, each.getKey(), nextVersion), each.getValue()); if (Strings.isNullOrEmpty(getActiveVersion(databaseName, ruleName, each.getKey()))) { diff --git a/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/config/global/GlobalRulePersistService.java b/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/config/global/GlobalRulePersistService.java index d9bea638983..7b59e74dbc6 100644 --- a/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/config/global/GlobalRulePersistService.java +++ b/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/config/global/GlobalRulePersistService.java @@ -88,7 +88,7 @@ public final class GlobalRulePersistService { private Collection<MetaDataVersion> persistTuples(final Collection<RepositoryTuple> repositoryTuples) { Collection<MetaDataVersion> result = new LinkedList<>(); for (RepositoryTuple each : repositoryTuples) { - List<String> versions = repository.getChildrenKeys(GlobalNode.getGlobalRuleVersionsNode(each.getKey())); + List<String> versions = metaDataVersionPersistService.getVersions(GlobalNode.getGlobalRuleVersionsNode(each.getKey())); String nextActiveVersion = versions.isEmpty() ? MetaDataVersion.DEFAULT_VERSION : String.valueOf(Integer.parseInt(versions.get(0)) + 1); repository.persist(GlobalNode.getGlobalRuleVersionNode(each.getKey(), nextActiveVersion), each.getValue()); if (Strings.isNullOrEmpty(repository.query(GlobalNode.getGlobalRuleActiveVersionNode(each.getKey())))) { diff --git a/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/config/global/PropertiesPersistService.java b/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/config/global/PropertiesPersistService.java index d479f180873..c7e35fbbeab 100644 --- a/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/config/global/PropertiesPersistService.java +++ b/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/config/global/PropertiesPersistService.java @@ -55,7 +55,7 @@ public final class PropertiesPersistService { * @param props properties */ public void persist(final Properties props) { - List<String> versions = repository.getChildrenKeys(GlobalNode.getPropsVersionsNode()); + List<String> versions = metaDataVersionPersistService.getVersions(GlobalNode.getPropsVersionsNode()); String nextActiveVersion = versions.isEmpty() ? MetaDataVersion.DEFAULT_VERSION : String.valueOf(Integer.parseInt(versions.get(0)) + 1); repository.persist(GlobalNode.getPropsVersionNode(nextActiveVersion), YamlEngine.marshal(props)); if (Strings.isNullOrEmpty(getActiveVersion())) { diff --git a/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/metadata/table/TableMetaDataPersistService.java b/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/metadata/table/TableMetaDataPersistService.java index 4e7dd91fb18..397d9a802d7 100644 --- a/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/metadata/table/TableMetaDataPersistService.java +++ b/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/metadata/table/TableMetaDataPersistService.java @@ -83,7 +83,7 @@ public final class TableMetaDataPersistService { Collection<MetaDataVersion> metaDataVersions = new LinkedList<>(); for (Entry<String, ShardingSphereTable> entry : tables.entrySet()) { String tableName = entry.getKey().toLowerCase(); - List<String> versions = repository.getChildrenKeys(TableMetaDataNode.getTableVersionsNode(databaseName, schemaName, tableName)); + List<String> versions = metaDataVersionPersistService.getVersions(TableMetaDataNode.getTableVersionsNode(databaseName, schemaName, tableName)); String nextActiveVersion = versions.isEmpty() ? MetaDataVersion.DEFAULT_VERSION : String.valueOf(Integer.parseInt(versions.get(0)) + 1); if (null != entry.getValue()) { repository.persist(TableMetaDataNode.getTableVersionNode(databaseName, schemaName, tableName, nextActiveVersion), diff --git a/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/metadata/table/ViewMetaDataPersistService.java b/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/metadata/table/ViewMetaDataPersistService.java index 0071f499c0d..68092d1b16a 100644 --- a/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/metadata/table/ViewMetaDataPersistService.java +++ b/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/metadata/table/ViewMetaDataPersistService.java @@ -83,7 +83,7 @@ public final class ViewMetaDataPersistService { Collection<MetaDataVersion> metaDataVersions = new LinkedList<>(); for (Entry<String, ShardingSphereView> entry : views.entrySet()) { String viewName = entry.getKey().toLowerCase(); - List<String> versions = repository.getChildrenKeys(ViewMetaDataNode.getViewVersionsNode(databaseName, schemaName, viewName)); + List<String> versions = metaDataVersionPersistService.getVersions(ViewMetaDataNode.getViewVersionsNode(databaseName, schemaName, viewName)); String nextActiveVersion = versions.isEmpty() ? MetaDataVersion.DEFAULT_VERSION : String.valueOf(Integer.parseInt(versions.get(0)) + 1); repository.persist(ViewMetaDataNode.getViewVersionNode(databaseName, schemaName, viewName, nextActiveVersion), YamlEngine.marshal(new YamlViewSwapper().swapToYamlConfiguration(entry.getValue()))); diff --git a/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/version/MetaDataVersionBasedPersistService.java b/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/version/MetaDataVersionBasedPersistService.java index df8bc1cd5a8..3abf8a17197 100644 --- a/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/version/MetaDataVersionBasedPersistService.java +++ b/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/version/MetaDataVersionBasedPersistService.java @@ -21,6 +21,7 @@ import com.sphereex.dbplusengine.SphereEx; import org.apache.shardingsphere.infra.metadata.version.MetaDataVersion; import java.util.Collection; +import java.util.List; /** * Meta data version based registry service. @@ -50,7 +51,7 @@ public interface MetaDataVersionBasedPersistService { * @return version path */ String getVersionPathByActiveVersion(String path, String activeVersion); - + /** * Switch active version without consistency. * @@ -58,4 +59,12 @@ public interface MetaDataVersionBasedPersistService { */ @SphereEx void switchActiveVersionWithoutConsistency(Collection<MetaDataVersion> versions); + + /** + * Get versions. + * + * @param path path + * @return versions + */ + List<String> getVersions(String path); } diff --git a/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/version/MetaDataVersionPersistService.java b/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/version/MetaDataVersionPersistService.java index fe4eba79bd4..74091e55e4e 100644 --- a/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/version/MetaDataVersionPersistService.java +++ b/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/version/MetaDataVersionPersistService.java @@ -26,14 +26,13 @@ import org.apache.shardingsphere.metadata.persist.node.DatabaseMetaDataNode; import org.apache.shardingsphere.mode.spi.PersistRepository; import java.util.Collection; +import java.util.List; /** * Meta data version persist service. */ @RequiredArgsConstructor -// SPEX ADDED: BEGIN @Slf4j -// SPEX ADDED: END public final class MetaDataVersionPersistService implements MetaDataVersionBasedPersistService { private final PersistRepository repository; @@ -68,7 +67,7 @@ public final class MetaDataVersionPersistService implements MetaDataVersionBased public String getVersionPathByActiveVersion(final String path, final String activeVersion) { return repository.query(DatabaseMetaDataNode.getVersionNodeByActiveVersionPath(path, activeVersion)); } - + @SphereEx @Override public void switchActiveVersionWithoutConsistency(final Collection<MetaDataVersion> metaDataVersions) { @@ -80,4 +79,14 @@ public final class MetaDataVersionPersistService implements MetaDataVersionBased repository.deleteWithoutConsistency(each.getVersionsNodePath()); } } + + @Override + public List<String> getVersions(final String path) { + List<String> result = repository.getChildrenKeys(path); + if (result.size() > 1) { + log.warn("There are multiple versions of :{}, please check the configuration.", path); + result.sort((v1, v2) -> Integer.compare(Integer.parseInt(v2), Integer.parseInt(v1))); + } + return result; + } } diff --git a/kernel/metadata/core/src/test/java/org/apache/shardingsphere/metadata/persist/service/config/global/GlobalRulePersistServiceTest.java b/kernel/metadata/core/src/test/java/org/apache/shardingsphere/metadata/persist/service/config/global/GlobalRulePersistServiceTest.java index ac806ddf942..6cc8825387a 100644 --- a/kernel/metadata/core/src/test/java/org/apache/shardingsphere/metadata/persist/service/config/global/GlobalRulePersistServiceTest.java +++ b/kernel/metadata/core/src/test/java/org/apache/shardingsphere/metadata/persist/service/config/global/GlobalRulePersistServiceTest.java @@ -59,6 +59,7 @@ class GlobalRulePersistServiceTest { @BeforeEach void setUp() throws ReflectiveOperationException { + metaDataVersionPersistService = new MetaDataVersionPersistService(repository); globalRulePersistService = new GlobalRulePersistService(repository, metaDataVersionPersistService); Plugins.getMemberAccessor().set(GlobalRulePersistService.class.getDeclaredField("repositoryTuplePersistService"), globalRulePersistService, repositoryTuplePersistService); } @@ -100,6 +101,7 @@ class GlobalRulePersistServiceTest { YamlRuleConfiguration yamlRuleConfig = new MetaDataYamlRuleConfigurationFixture(); when(swapper.swapToYamlConfiguration(ruleConfig)).thenReturn(yamlRuleConfig); when(repository.getChildrenKeys("/rules/fixture/versions")).thenReturn(Collections.emptyList()); + when(repository.query("/rules/fixture/active_version")).thenReturn("", "0"); globalRulePersistService.persist(Collections.singleton(ruleConfig)); verify(repository).persist("/rules/fixture/versions/0", "{}" + System.lineSeparator()); verify(repository).persist("/rules/fixture/active_version", "0"); diff --git a/kernel/metadata/core/src/test/java/org/apache/shardingsphere/metadata/persist/service/config/global/PropertiesPersistServiceTest.java b/kernel/metadata/core/src/test/java/org/apache/shardingsphere/metadata/persist/service/config/global/PropertiesPersistServiceTest.java index fb7c5a491b1..4fbd285ae82 100644 --- a/kernel/metadata/core/src/test/java/org/apache/shardingsphere/metadata/persist/service/config/global/PropertiesPersistServiceTest.java +++ b/kernel/metadata/core/src/test/java/org/apache/shardingsphere/metadata/persist/service/config/global/PropertiesPersistServiceTest.java @@ -33,7 +33,6 @@ import java.util.Properties; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.MatcherAssert.assertThat; import static org.junit.jupiter.api.Assertions.assertTrue; -import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; @@ -45,11 +44,9 @@ class PropertiesPersistServiceTest { @Mock private PersistRepository repository; - @Mock - private MetaDataVersionPersistService metaDataVersionPersistService; - @BeforeEach void setUp() { + MetaDataVersionPersistService metaDataVersionPersistService = new MetaDataVersionPersistService(repository); persistService = new PropertiesPersistService(repository, metaDataVersionPersistService); when(repository.query("/props/active_version")).thenReturn("0"); } @@ -69,11 +66,10 @@ class PropertiesPersistServiceTest { @Test void assertPersistWithEmptyActiveVersion() { - when(repository.query("/props/active_version")).thenReturn(""); + when(repository.query("/props/active_version")).thenReturn("", "0"); persistService.persist(PropertiesBuilder.build(new Property("k", "v"))); verify(repository).persist("/props/versions/0", "k: v" + System.lineSeparator()); verify(repository).persist("/props/active_version", "0"); - verify(metaDataVersionPersistService).switchActiveVersion(any()); } @Test @@ -81,6 +77,6 @@ class PropertiesPersistServiceTest { when(repository.getChildrenKeys("/props/versions")).thenReturn(Collections.singletonList("10")); persistService.persist(PropertiesBuilder.build(new Property("k", "v"))); verify(repository).persist("/props/versions/11", "k: v" + System.lineSeparator()); - verify(metaDataVersionPersistService).switchActiveVersion(any()); + verify(repository).persist("/props/active_version", "11"); } } diff --git a/kernel/metadata/core/src/test/java/org/apache/shardingsphere/metadata/persist/service/metadata/table/TableMetaDataPersistServiceTest.java b/kernel/metadata/core/src/test/java/org/apache/shardingsphere/metadata/persist/service/metadata/table/TableMetaDataPersistServiceTest.java index 07e1884bed4..e1263c5a3b5 100644 --- a/kernel/metadata/core/src/test/java/org/apache/shardingsphere/metadata/persist/service/metadata/table/TableMetaDataPersistServiceTest.java +++ b/kernel/metadata/core/src/test/java/org/apache/shardingsphere/metadata/persist/service/metadata/table/TableMetaDataPersistServiceTest.java @@ -18,7 +18,6 @@ package org.apache.shardingsphere.metadata.persist.service.metadata.table; import org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereTable; -import org.apache.shardingsphere.infra.metadata.version.MetaDataVersion; import org.apache.shardingsphere.metadata.persist.service.version.MetaDataVersionPersistService; import org.apache.shardingsphere.mode.spi.PersistRepository; import org.junit.jupiter.api.BeforeEach; @@ -30,10 +29,8 @@ import org.mockito.junit.jupiter.MockitoExtension; import java.util.Collections; import java.util.Map; -import static org.apache.shardingsphere.test.matcher.ShardingSphereArgumentVerifyMatchers.deepEq; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.MatcherAssert.assertThat; -import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.times; @@ -48,11 +45,9 @@ class TableMetaDataPersistServiceTest { @Mock private PersistRepository repository; - @Mock - private MetaDataVersionPersistService metaDataVersionPersistService; - @BeforeEach void setUp() { + MetaDataVersionPersistService metaDataVersionPersistService = new MetaDataVersionPersistService(repository); persistService = new TableMetaDataPersistService(repository, metaDataVersionPersistService); } @@ -68,11 +63,10 @@ class TableMetaDataPersistServiceTest { @Test void assertPersistWithoutVersion() { + when(repository.query("/metadata/foo_db/schemas/foo_schema/tables/foo_tbl/active_version")).thenReturn("", "0"); persistService.persist("foo_db", "foo_schema", Collections.singletonMap("foo_tbl", mock(ShardingSphereTable.class))); verify(repository).persist("/metadata/foo_db/schemas/foo_schema/tables/foo_tbl/versions/0", "{}" + System.lineSeparator()); verify(repository).persist("/metadata/foo_db/schemas/foo_schema/tables/foo_tbl/active_version", "0"); - verify(metaDataVersionPersistService).switchActiveVersion( - deepEq(Collections.singletonList(new MetaDataVersion("/metadata/foo_db/schemas/foo_schema/tables/foo_tbl", null, "0")))); } @Test @@ -81,9 +75,7 @@ class TableMetaDataPersistServiceTest { when(repository.query("/metadata/foo_db/schemas/foo_schema/tables/foo_tbl/active_version")).thenReturn("10"); persistService.persist("foo_db", "foo_schema", Collections.singletonMap("foo_tbl", mock(ShardingSphereTable.class))); verify(repository).persist("/metadata/foo_db/schemas/foo_schema/tables/foo_tbl/versions/11", "{}" + System.lineSeparator()); - verify(repository, times(0)).persist(eq("/metadata/foo_db/schemas/foo_schema/tables/foo_tbl/active_version"), any()); - verify(metaDataVersionPersistService).switchActiveVersion( - deepEq(Collections.singletonList(new MetaDataVersion("/metadata/foo_db/schemas/foo_schema/tables/foo_tbl", "10", "11")))); + verify(repository, times(1)).persist(eq("/metadata/foo_db/schemas/foo_schema/tables/foo_tbl/active_version"), eq("11")); } @Test diff --git a/kernel/metadata/core/src/test/java/org/apache/shardingsphere/metadata/persist/service/metadata/table/ViewMetaDataPersistServiceTest.java b/kernel/metadata/core/src/test/java/org/apache/shardingsphere/metadata/persist/service/metadata/table/ViewMetaDataPersistServiceTest.java index 4d2502ecacd..140253fd72e 100644 --- a/kernel/metadata/core/src/test/java/org/apache/shardingsphere/metadata/persist/service/metadata/table/ViewMetaDataPersistServiceTest.java +++ b/kernel/metadata/core/src/test/java/org/apache/shardingsphere/metadata/persist/service/metadata/table/ViewMetaDataPersistServiceTest.java @@ -18,7 +18,6 @@ package org.apache.shardingsphere.metadata.persist.service.metadata.table; import org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereView; -import org.apache.shardingsphere.infra.metadata.version.MetaDataVersion; import org.apache.shardingsphere.metadata.persist.service.version.MetaDataVersionPersistService; import org.apache.shardingsphere.mode.spi.PersistRepository; import org.junit.jupiter.api.BeforeEach; @@ -30,10 +29,8 @@ import org.mockito.junit.jupiter.MockitoExtension; import java.util.Collections; import java.util.Map; -import static org.apache.shardingsphere.test.matcher.ShardingSphereArgumentVerifyMatchers.deepEq; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.MatcherAssert.assertThat; -import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.times; @@ -48,11 +45,9 @@ class ViewMetaDataPersistServiceTest { @Mock private PersistRepository repository; - @Mock - private MetaDataVersionPersistService metaDataVersionPersistService; - @BeforeEach void setUp() { + MetaDataVersionPersistService metaDataVersionPersistService = new MetaDataVersionPersistService(repository); persistService = new ViewMetaDataPersistService(repository, metaDataVersionPersistService); } @@ -68,10 +63,10 @@ class ViewMetaDataPersistServiceTest { @Test void assertPersistWithoutVersion() { + when(repository.query("/metadata/foo_db/schemas/foo_schema/views/foo_view/active_version")).thenReturn("", "0"); persistService.persist("foo_db", "foo_schema", Collections.singletonMap("foo_view", mock(ShardingSphereView.class))); verify(repository).persist("/metadata/foo_db/schemas/foo_schema/views/foo_view/versions/0", "{}" + System.lineSeparator()); verify(repository).persist("/metadata/foo_db/schemas/foo_schema/views/foo_view/active_version", "0"); - verify(metaDataVersionPersistService).switchActiveVersion(deepEq(Collections.singletonList(new MetaDataVersion("/metadata/foo_db/schemas/foo_schema/views/foo_view", null, "0")))); } @Test @@ -80,9 +75,7 @@ class ViewMetaDataPersistServiceTest { when(repository.query("/metadata/foo_db/schemas/foo_schema/views/foo_view/active_version")).thenReturn("10"); persistService.persist("foo_db", "foo_schema", Collections.singletonMap("foo_view", mock(ShardingSphereView.class))); verify(repository).persist("/metadata/foo_db/schemas/foo_schema/views/foo_view/versions/11", "{}" + System.lineSeparator()); - verify(repository, times(0)).persist(eq("/metadata/foo_db/schemas/foo_schema/views/foo_view/active_version"), any()); - verify(metaDataVersionPersistService).switchActiveVersion( - deepEq(Collections.singletonList(new MetaDataVersion("/metadata/foo_db/schemas/foo_schema/views/foo_view", "10", "11")))); + verify(repository, times(1)).persist(eq("/metadata/foo_db/schemas/foo_schema/views/foo_view/active_version"), eq("11")); } @Test diff --git a/kernel/metadata/core/src/test/java/org/apache/shardingsphere/metadata/persist/service/version/MetaDataVersionPersistServiceTest.java b/kernel/metadata/core/src/test/java/org/apache/shardingsphere/metadata/persist/service/version/MetaDataVersionPersistServiceTest.java index 8d86e733e0a..d2c3e0b43c7 100644 --- a/kernel/metadata/core/src/test/java/org/apache/shardingsphere/metadata/persist/service/version/MetaDataVersionPersistServiceTest.java +++ b/kernel/metadata/core/src/test/java/org/apache/shardingsphere/metadata/persist/service/version/MetaDataVersionPersistServiceTest.java @@ -63,4 +63,10 @@ class MetaDataVersionPersistServiceTest { when(repository.query("foo_db/versions/1")).thenReturn("foo_path"); assertThat(persistService.getVersionPathByActiveVersion("foo_db/active_version", "1"), is("foo_path")); } + + @Test + void assertGetVersions() { + when(repository.getChildrenKeys("foo_db/versions")).thenReturn(Arrays.asList("1", "0", "2", "10")); + assertThat(persistService.getVersions("foo_db/versions"), is(Arrays.asList("10", "2", "1", "0"))); + } } diff --git a/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/MetaDataContextsFactory.java b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/MetaDataContextsFactory.java index d57b4f87dbe..89be75ad02e 100644 --- a/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/MetaDataContextsFactory.java +++ b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/MetaDataContextsFactory.java @@ -46,7 +46,6 @@ import org.apache.shardingsphere.infra.datasource.pool.destroyer.DataSourcePoolD import org.apache.shardingsphere.infra.datasource.pool.props.domain.DataSourcePoolProperties; import org.apache.shardingsphere.infra.instance.ComputeNodeInstanceContext; import org.apache.shardingsphere.infra.lock.GlobalLockNames; -import org.apache.shardingsphere.infra.lock.GlobalLockNames; import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData; import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase; import org.apache.shardingsphere.infra.metadata.database.resource.ResourceMetaData; @@ -68,7 +67,6 @@ import org.apache.shardingsphere.metadata.factory.ExternalMetaDataFactory; import org.apache.shardingsphere.metadata.factory.InternalMetaDataFactory; import org.apache.shardingsphere.metadata.persist.MetaDataPersistService; import org.apache.shardingsphere.mode.lock.GlobalLockDefinition; -import org.apache.shardingsphere.mode.lock.GlobalLockDefinition; import org.apache.shardingsphere.mode.manager.ContextManagerBuilderParameter; import org.apache.shardingsphere.mode.metadata.decorator.RuleConfigurationPersistDecorateEngine; import org.apache.shardingsphere.mode.metadata.manager.SwitchingResource; diff --git a/proxy/backend/type/mysql/src/main/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/executor/ShowTablesExecutor.java b/proxy/backend/type/mysql/src/main/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/executor/ShowTablesExecutor.java index e14de5ec342..6ce3c0034a9 100644 --- a/proxy/backend/type/mysql/src/main/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/executor/ShowTablesExecutor.java +++ b/proxy/backend/type/mysql/src/main/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/executor/ShowTablesExecutor.java @@ -105,6 +105,9 @@ public final class ShowTablesExecutor implements DatabaseAdminQueryExecutor { } private Collection<ShardingSphereTable> getTables(final String databaseName, @SphereEx final Grantee grantee) { + if (null == ProxyContext.getInstance().getContextManager().getDatabase(databaseName).getSchema(databaseName)) { + return Collections.emptyList(); + } @SphereEx(Type.MODIFY) Collection<ShardingSphereTable> tables = ProxyContext.getInstance().getContextManager().getDatabase(databaseName).getSchema(databaseName).getTables().values(); Collection<ShardingSphereTable> filteredTables = filterByLike(tables); @@ -125,7 +128,7 @@ public final class ShowTablesExecutor implements DatabaseAdminQueryExecutor { AuthorityChecker authorityChecker = new AuthorityChecker(authorityRule, grantee); return tables.stream().filter(each -> authorityChecker.isAuthorized(databaseName, each.getName())).collect(Collectors.toList()); } - + private Optional<Pattern> getLikePattern() { if (!sqlStatement.getFilter().isPresent()) { return Optional.empty();
