You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@shardingsphere.apache.org by du...@apache.org on 2022/04/29 01:49:29 UTC
[shardingsphere] branch master updated: Remove getDefaultSchema method and adjust refresh table metadata (#17184)
This is an automated email from the ASF dual-hosted git repository.
duanzhengqiang 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 e72248834b0 Remove getDefaultSchema method and adjust refresh table metadata (#17184)
e72248834b0 is described below
commit e72248834b0c764d44c78f6b066216c1b0d7cf02
Author: zhaojinchao <zh...@apache.org>
AuthorDate: Fri Apr 29 09:49:21 2022 +0800
Remove getDefaultSchema method and adjust refresh table metadata (#17184)
* Fix NPE when drop database
* Fix checkstyle
* Remove getDefaultSchema method and adjust refresh table metadata
* Fix checkstyle
---
.../infra/metadata/ShardingSphereMetaData.java | 11 ----------
.../mode/manager/ContextManager.java | 25 +++++++++++-----------
.../mode/manager/ContextManagerTest.java | 4 ++--
.../metadata/watcher/MetaDataChangedWatcher.java | 2 +-
.../common/queryable/ShowTableMetadataHandler.java | 3 ++-
.../queryable/ShowTableMetadataHandlerTest.java | 11 +++++-----
6 files changed, 23 insertions(+), 33 deletions(-)
diff --git a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/ShardingSphereMetaData.java b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/ShardingSphereMetaData.java
index d51aa413a17..36ed1dad3b0 100644
--- a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/ShardingSphereMetaData.java
+++ b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/ShardingSphereMetaData.java
@@ -103,17 +103,6 @@ public final class ShardingSphereMetaData {
return !resource.getDataSources().isEmpty();
}
- /**
- * Get default schema.
- *
- * @return ShardingSphereSchema default schema
- */
- public ShardingSphereSchema getDefaultSchema() {
- // TODO remove this method when no features call
- ShardingSphereSchema defaultSchema = schemas.values().isEmpty() ? null : schemas.get("public");
- return schemas.getOrDefault(databaseName, defaultSchema);
- }
-
/**
* Get schema by name.
*
diff --git a/shardingsphere-mode/shardingsphere-mode-core/src/main/java/org/apache/shardingsphere/mode/manager/ContextManager.java b/shardingsphere-mode/shardingsphere-mode-core/src/main/java/org/apache/shardingsphere/mode/manager/ContextManager.java
index 9bc9dd2891a..cfccf541de3 100644
--- a/shardingsphere-mode/shardingsphere-mode-core/src/main/java/org/apache/shardingsphere/mode/manager/ContextManager.java
+++ b/shardingsphere-mode/shardingsphere-mode-core/src/main/java/org/apache/shardingsphere/mode/manager/ContextManager.java
@@ -185,11 +185,10 @@ public final class ContextManager implements AutoCloseable {
* @param deletedTable deleted table
*/
public void alterDatabase(final String databaseName, final String schemaName, final TableMetaData changedTableMetaData, final String deletedTable) {
- Optional.ofNullable(changedTableMetaData).ifPresent(optional -> alterTableSchema(databaseName, schemaName, optional));
- if (null == metaDataContexts.getMetaData(databaseName).getSchemaByName(schemaName)) {
- return;
+ if (null != metaDataContexts.getMetaData(databaseName)) {
+ Optional.ofNullable(changedTableMetaData).ifPresent(optional -> alterTableSchema(databaseName, schemaName, optional));
+ Optional.ofNullable(deletedTable).ifPresent(optional -> deleteTable(databaseName, schemaName, optional));
}
- Optional.ofNullable(deletedTable).ifPresent(optional -> deleteTable(databaseName, schemaName, optional));
}
private void alterTableSchema(final String databaseName, final String schemaName, final TableMetaData changedTableMetaData) {
@@ -215,11 +214,12 @@ public final class ContextManager implements AutoCloseable {
}
private void deleteTable(final String databaseName, final String schemaName, final String deletedTable) {
- ShardingSphereMetaData metaData = metaDataContexts.getMetaData(databaseName);
- metaData.getSchemaByName(schemaName).remove(deletedTable);
- FederationDatabaseMetaData databaseMetaData = metaDataContexts.getOptimizerContext().getFederationMetaData().getDatabases().get(databaseName);
- databaseMetaData.remove(schemaName, deletedTable);
- metaDataContexts.getOptimizerContext().getPlannerContexts().put(databaseName, OptimizerPlannerContextFactory.create(databaseMetaData));
+ if (null != metaDataContexts.getMetaData(databaseName).getSchemaByName(schemaName)) {
+ metaDataContexts.getMetaData(databaseName).getSchemaByName(schemaName).remove(deletedTable);
+ FederationDatabaseMetaData databaseMetaData = metaDataContexts.getOptimizerContext().getFederationMetaData().getDatabases().get(databaseName);
+ databaseMetaData.remove(schemaName, deletedTable);
+ metaDataContexts.getOptimizerContext().getPlannerContexts().put(databaseName, OptimizerPlannerContextFactory.create(databaseMetaData));
+ }
}
private boolean containsInDataNodeContainedRule(final String tableName, final ShardingSphereMetaData schemaMetaData) {
@@ -250,12 +250,13 @@ public final class ContextManager implements AutoCloseable {
* @param schemaName schema name
*/
public void dropSchema(final String databaseName, final String schemaName) {
- if (null == metaDataContexts.getMetaData(databaseName).getSchemaByName(schemaName)) {
+ ShardingSphereMetaData metaData = metaDataContexts.getMetaData(databaseName);
+ if (null == metaData || null == metaData.getSchemaByName(schemaName)) {
return;
}
FederationDatabaseMetaData databaseMetaData = metaDataContexts.getOptimizerContext().getFederationMetaData().getDatabases().get(databaseName);
databaseMetaData.remove(schemaName);
- metaDataContexts.getMetaDataMap().get(databaseName).getSchemas().remove(schemaName);
+ metaData.getSchemas().remove(schemaName);
}
/**
@@ -432,7 +433,7 @@ public final class ContextManager implements AutoCloseable {
if (schemaMetaData.getTables().containsKey(tableName)) {
metaDataContexts.getMetaData(databaseName).getSchemaByName(schemaName).put(tableName, schemaMetaData.getTables().get(tableName));
metaDataContexts.getMetaDataPersistService()
- .ifPresent(optional -> optional.getSchemaMetaDataService().persistTables(databaseName, databaseName, metaDataContexts.getMetaData(databaseName).getDefaultSchema()));
+ .ifPresent(optional -> optional.getSchemaMetaDataService().persistTables(databaseName, databaseName, metaDataContexts.getMetaData(databaseName).getSchemaByName(schemaName)));
}
}
diff --git a/shardingsphere-mode/shardingsphere-mode-core/src/test/java/org/apache/shardingsphere/mode/manager/ContextManagerTest.java b/shardingsphere-mode/shardingsphere-mode-core/src/test/java/org/apache/shardingsphere/mode/manager/ContextManagerTest.java
index 56b0ad1c794..14be112593a 100644
--- a/shardingsphere-mode/shardingsphere-mode-core/src/test/java/org/apache/shardingsphere/mode/manager/ContextManagerTest.java
+++ b/shardingsphere-mode/shardingsphere-mode-core/src/test/java/org/apache/shardingsphere/mode/manager/ContextManagerTest.java
@@ -123,7 +123,7 @@ public final class ContextManagerTest {
public void assertAlterDatabase() {
contextManager.alterDatabase("foo_db", Collections.singletonMap("foo_db", new ShardingSphereSchema(Collections.singletonMap("foo_table",
new TableMetaData("foo_table", Collections.emptyList(), Collections.emptyList(), Collections.emptyList())))));
- assertTrue(contextManager.getMetaDataContexts().getMetaDataMap().get("foo_db").getDefaultSchema().containsTable("foo_table"));
+ assertTrue(contextManager.getMetaDataContexts().getMetaDataMap().get("foo_db").getSchemaByName("foo_db").containsTable("foo_table"));
assertTrue(contextManager.getMetaDataContexts().getOptimizerContext().getFederationMetaData().getDatabases().containsKey("foo_db"));
Map<String, FederationSchemaMetaData> schemas = contextManager.getMetaDataContexts().getOptimizerContext().getFederationMetaData().getDatabases().get("foo_db").getSchemas();
assertTrue(schemas.get("foo_db").getTables().containsKey("foo_table"));
@@ -266,7 +266,7 @@ public final class ContextManagerTest {
contextManager.reloadMetaData("foo_db", "foo_table");
assertNotNull(contextManager.getMetaDataContexts().getMetaData("foo_db"));
contextManager.reloadMetaData("foo_db", "foo_table", "foo_ds");
- assertNotNull(contextManager.getMetaDataContexts().getMetaData("foo_db").getDefaultSchema());
+ assertNotNull(contextManager.getMetaDataContexts().getMetaData("foo_db").getSchemaByName("foo_db"));
assertTrue(contextManager.getMetaDataContexts().getMetaData("foo_db").getResource().getDataSources().containsKey("foo_ds"));
}
diff --git a/shardingsphere-mode/shardingsphere-mode-type/shardingsphere-cluster-mode/shardingsphere-cluster-mode-core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/coordinator/registry/metadata/watcher/MetaDataChangedWatcher.java b/shardingsphere-mode/shardingsphere-mode-type/shardingsphere-cluster-mode/shardingsphere-cluster-mode-core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/coordinator/registry/metadata/watcher/MetaDataChangedWatcher.java
index 922f25f8ad6..9e37e77c33c 100644
--- a/shardingsphere-mode/shardingsphere-mode-type/shardingsphere-cluster-mode/shardingsphere-cluster-mode-core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/coordinator/registry/metadata/watcher/MetaDataChangedWatcher.java
+++ b/shardingsphere-mode/shardingsphere-mode-type/shardingsphere-cluster-mode/shardingsphere-cluster-mode-core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/coordinator/registry/metadata/watcher/MetaDataChangedWatcher.java
@@ -87,7 +87,7 @@ public final class MetaDataChangedWatcher implements GovernanceWatcher<Governanc
}
private boolean isLogicSchemaChanged(final DataChangedEvent event) {
- return DatabaseMetaDataNode.getSchemaName(event.getKey()).isPresent();
+ return DatabaseMetaDataNode.getDatabaseNameByDatabasePath(event.getKey()).isPresent() && DatabaseMetaDataNode.getSchemaName(event.getKey()).isPresent();
}
private boolean isTableMetaDataChanged(final DataChangedEvent event) {
diff --git a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/ral/common/queryable/ShowTableMetadataHandler.java b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/ral/common/queryable/ShowTableMetadataHandler.java
index ab8ed9d133e..64aa18e47f6 100644
--- a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/ral/common/queryable/ShowTableMetadataHandler.java
+++ b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/ral/common/queryable/ShowTableMetadataHandler.java
@@ -69,7 +69,8 @@ public final class ShowTableMetadataHandler extends QueryableRALBackendHandler<S
if (!ProxyContext.getInstance().getAllDatabaseNames().contains(databaseName)) {
throw new SchemaNotExistedException(databaseName);
}
- ShardingSphereSchema schema = ProxyContext.getInstance().getMetaData(databaseName).getDefaultSchema();
+ String defaultSchema = connectionSession.getDatabaseType().getDefaultSchema(connectionSession.getDatabaseName());
+ ShardingSphereSchema schema = ProxyContext.getInstance().getMetaData(databaseName).getSchemaByName(defaultSchema);
return schema.getAllTableNames().stream().filter(each -> sqlStatement.getTableNames().contains(each))
.map(each -> buildTableRows(databaseName, schema, each)).flatMap(Collection::stream).collect(Collectors.toList());
}
diff --git a/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/text/distsql/ral/common/queryable/ShowTableMetadataHandlerTest.java b/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/text/distsql/ral/common/queryable/ShowTableMetadataHandlerTest.java
index 35fbc77eec4..c9db12ccc28 100644
--- a/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/text/distsql/ral/common/queryable/ShowTableMetadataHandlerTest.java
+++ b/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/text/distsql/ral/common/queryable/ShowTableMetadataHandlerTest.java
@@ -51,10 +51,13 @@ public final class ShowTableMetadataHandlerTest {
ContextManager contextManager = mock(ContextManager.class, RETURNS_DEEP_STUBS);
when(contextManager.getMetaDataContexts().getAllDatabaseNames()).thenReturn(Collections.singletonList("db_name"));
ShardingSphereMetaData shardingSphereMetaData = mock(ShardingSphereMetaData.class, RETURNS_DEEP_STUBS);
- when(shardingSphereMetaData.getDefaultSchema()).thenReturn(new ShardingSphereSchema(createTableMap()));
+ when(shardingSphereMetaData.getSchemaByName("db_name")).thenReturn(new ShardingSphereSchema(createTableMap()));
when(contextManager.getMetaDataContexts().getMetaData("db_name")).thenReturn(shardingSphereMetaData);
ProxyContext.getInstance().init(contextManager);
- ShowTableMetadataHandler handler = new ShowTableMetadataHandler().init(getParameter(createSqlStatement(), mockConnectionSession()));
+ ConnectionSession connectionSession = mock(ConnectionSession.class, RETURNS_DEEP_STUBS);
+ when(connectionSession.getDatabaseName()).thenReturn("db_name");
+ when(connectionSession.getDatabaseType().getDefaultSchema("db_name")).thenReturn("db_name");
+ ShowTableMetadataHandler handler = new ShowTableMetadataHandler().init(getParameter(createSqlStatement(), connectionSession));
handler.execute();
handler.next();
ArrayList<Object> data = new ArrayList<>(handler.getRowData());
@@ -84,10 +87,6 @@ public final class ShowTableMetadataHandlerTest {
return new ShowTableMetadataStatement(Collections.singleton("t_order"), new SchemaSegment(0, 0, new IdentifierValue("db_name")));
}
- private ConnectionSession mockConnectionSession() {
- return mock(ConnectionSession.class);
- }
-
private HandlerParameter<ShowTableMetadataStatement> getParameter(final ShowTableMetadataStatement statement, final ConnectionSession connectionSession) {
return new HandlerParameter<ShowTableMetadataStatement>().setStatement(statement).setConnectionSession(connectionSession);
}