This is an automated email from the ASF dual-hosted git repository.

zhaojinchao 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 345292d0ee3 Fix collect data error with different storage type and 
protocol type. (#23781)
345292d0ee3 is described below

commit 345292d0ee35ced62fe37e066aae0ea2d2e464a6
Author: Chuxin Chen <[email protected]>
AuthorDate: Sun Jan 29 09:47:22 2023 +0800

    Fix collect data error with different storage type and protocol type. 
(#23781)
---
 .../metadata/data/ShardingStatisticsTableCollector.java   |  6 ++++--
 .../collector/ShardingSphereTableDataCollectorUtil.java   | 15 ++++++++++++---
 .../data/collector/tables/PgClassTableCollector.java      |  2 +-
 .../data/collector/tables/PgNamespaceTableCollector.java  |  2 +-
 .../shardingsphere/mode/manager/ContextManager.java       |  2 ++
 5 files changed, 20 insertions(+), 7 deletions(-)

diff --git 
a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/metadata/data/ShardingStatisticsTableCollector.java
 
b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/metadata/data/ShardingStatisticsTableCollector.java
index 9534a2d0ba4..2e90ed02435 100644
--- 
a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/metadata/data/ShardingStatisticsTableCollector.java
+++ 
b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/metadata/data/ShardingStatisticsTableCollector.java
@@ -87,13 +87,15 @@ public final class ShardingStatisticsTableCollector 
implements ShardingSphereDat
                 row.add(each.getLogicTable());
                 row.add(dataNode.getDataSourceName());
                 row.add(dataNode.getTableName());
-                
addTableRowsAndDataLength(shardingSphereDatabase.getResourceMetaData().getDataSources(),
 dataNode, row, shardingSphereDatabase.getProtocolType());
+                
addTableRowsAndDataLength(shardingSphereDatabase.getResourceMetaData().getStorageTypes(),
 shardingSphereDatabase.getResourceMetaData().getDataSources(), dataNode, row);
                 tableData.getRows().add(new ShardingSphereRowData(row));
             }
         }
     }
     
-    private void addTableRowsAndDataLength(final Map<String, DataSource> 
dataSources, final DataNode dataNode, final List<Object> row, final 
DatabaseType databaseType) throws SQLException {
+    private void addTableRowsAndDataLength(final Map<String, DatabaseType> 
databaseTypes, final Map<String, DataSource> dataSources,
+                                           final DataNode dataNode, final 
List<Object> row) throws SQLException {
+        DatabaseType databaseType = 
databaseTypes.get(dataNode.getDataSourceName());
         if (databaseType instanceof MySQLDatabaseType) {
             addForMySQL(dataSources, dataNode, row);
         } else if (databaseType instanceof PostgreSQLDatabaseType) {
diff --git 
a/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/data/collector/ShardingSphereTableDataCollectorUtil.java
 
b/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/data/collector/ShardingSphereTableDataCollectorUtil.java
index 36cf882dc64..f895b09ca3b 100644
--- 
a/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/data/collector/ShardingSphereTableDataCollectorUtil.java
+++ 
b/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/data/collector/ShardingSphereTableDataCollectorUtil.java
@@ -18,6 +18,7 @@
 package org.apache.shardingsphere.infra.metadata.data.collector;
 
 import org.apache.shardingsphere.infra.metadata.data.ShardingSphereRowData;
+import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
 import 
org.apache.shardingsphere.infra.metadata.database.schema.decorator.model.ShardingSphereColumn;
 import 
org.apache.shardingsphere.infra.metadata.database.schema.decorator.model.ShardingSphereTable;
 
@@ -28,6 +29,7 @@ import java.sql.SQLException;
 import java.sql.Statement;
 import java.sql.Types;
 import java.util.Collection;
+import java.util.Collections;
 import java.util.LinkedList;
 import java.util.List;
 
@@ -39,17 +41,20 @@ public final class ShardingSphereTableDataCollectorUtil {
     /**
      * Collect row data.
      *
-     * @param dataSources data sources
+     * @param shardingSphereDatabase ShardingSphere database
      * @param sql sql
      * @param table table
      * @param selectedColumnNames selected column names
      * @return ShardingSphere row data
      * @throws SQLException sql exception
      */
-    public static Collection<ShardingSphereRowData> collectRowData(final 
Collection<DataSource> dataSources, final String sql, final ShardingSphereTable 
table,
+    public static Collection<ShardingSphereRowData> collectRowData(final 
ShardingSphereDatabase shardingSphereDatabase, final String sql, final 
ShardingSphereTable table,
                                                                    final 
Collection<String> selectedColumnNames) throws SQLException {
+        if (isProtocolTypeAndStorageTypeDifferent(shardingSphereDatabase)) {
+            return Collections.emptyList();
+        }
         Collection<ShardingSphereRowData> result = new LinkedList<>();
-        for (DataSource each : dataSources) {
+        for (DataSource each : 
shardingSphereDatabase.getResourceMetaData().getDataSources().values()) {
             try (
                     Connection connection = each.getConnection();
                     Statement statement = connection.createStatement();
@@ -60,6 +65,10 @@ public final class ShardingSphereTableDataCollectorUtil {
         return result;
     }
     
+    private static boolean isProtocolTypeAndStorageTypeDifferent(final 
ShardingSphereDatabase shardingSphereDatabase) {
+        return 
!shardingSphereDatabase.getResourceMetaData().getStorageTypes().values().stream().allMatch(each
 -> each.getType().equals(shardingSphereDatabase.getProtocolType().getType()));
+    }
+    
     private static Collection<ShardingSphereRowData> getRows(final ResultSet 
resultSet, final ShardingSphereTable table, final Collection<String> 
selectedColumnNames) throws SQLException {
         Collection<ShardingSphereRowData> result = new LinkedList<>();
         while (resultSet.next()) {
diff --git 
a/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/data/collector/tables/PgClassTableCollector.java
 
b/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/data/collector/tables/PgClassTableCollector.java
index 9eef2ae8dd6..866e29540d1 100644
--- 
a/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/data/collector/tables/PgClassTableCollector.java
+++ 
b/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/data/collector/tables/PgClassTableCollector.java
@@ -51,7 +51,7 @@ public final class PgClassTableCollector implements 
ShardingSphereDataCollector
     @Override
     public Optional<ShardingSphereTableData> collect(final String 
databaseName, final ShardingSphereTable table,
                                                      final Map<String, 
ShardingSphereDatabase> shardingSphereDatabases) throws SQLException {
-        Collection<ShardingSphereRowData> rows = 
ShardingSphereTableDataCollectorUtil.collectRowData(shardingSphereDatabases.get(databaseName).getResourceMetaData().getDataSources().values(),
+        Collection<ShardingSphereRowData> rows = 
ShardingSphereTableDataCollectorUtil.collectRowData(shardingSphereDatabases.get(databaseName),
                 SELECT_SQL, table, 
Arrays.stream(COLUMN_NAMES.split(",")).map(String::trim).collect(Collectors.toList()));
         Collection<ShardingSphereRowData> rowData = decorateTableName(rows, 
table, shardingSphereDatabases.get(databaseName).getRuleMetaData().getRules());
         ShardingSphereTableData result = new ShardingSphereTableData(PG_CLASS);
diff --git 
a/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/data/collector/tables/PgNamespaceTableCollector.java
 
b/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/data/collector/tables/PgNamespaceTableCollector.java
index fcb7a738565..05bb361949f 100644
--- 
a/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/data/collector/tables/PgNamespaceTableCollector.java
+++ 
b/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/data/collector/tables/PgNamespaceTableCollector.java
@@ -45,7 +45,7 @@ public final class PgNamespaceTableCollector implements 
ShardingSphereDataCollec
     @Override
     public Optional<ShardingSphereTableData> collect(final String 
databaseName, final ShardingSphereTable table,
                                                      final Map<String, 
ShardingSphereDatabase> shardingSphereDatabases) throws SQLException {
-        Collection<ShardingSphereRowData> rows = 
ShardingSphereTableDataCollectorUtil.collectRowData(shardingSphereDatabases.get(databaseName).getResourceMetaData().getDataSources().values(),
+        Collection<ShardingSphereRowData> rows = 
ShardingSphereTableDataCollectorUtil.collectRowData(shardingSphereDatabases.get(databaseName),
                 SELECT_SQL, table, 
Arrays.stream(COLUMN_NAMES.split(",")).map(String::trim).collect(Collectors.toList()));
         ShardingSphereTableData result = new 
ShardingSphereTableData(PG_NAMESPACE);
         result.getRows().addAll(rows);
diff --git 
a/mode/core/src/main/java/org/apache/shardingsphere/mode/manager/ContextManager.java
 
b/mode/core/src/main/java/org/apache/shardingsphere/mode/manager/ContextManager.java
index 3f86853ab5e..d1439f031da 100644
--- 
a/mode/core/src/main/java/org/apache/shardingsphere/mode/manager/ContextManager.java
+++ 
b/mode/core/src/main/java/org/apache/shardingsphere/mode/manager/ContextManager.java
@@ -274,6 +274,8 @@ public final class ContextManager implements AutoCloseable {
             MetaDataContexts reloadMetaDataContexts = 
createMetaDataContexts(databaseName, switchingResource, null);
             
reloadMetaDataContexts.getMetaData().getDatabase(databaseName).getSchemas().forEach((schemaName,
 schema) -> 
reloadMetaDataContexts.getPersistService().getDatabaseMetaDataService()
                     
.persist(reloadMetaDataContexts.getMetaData().getActualDatabaseName(databaseName),
 schemaName, schema));
+            
Optional.ofNullable(reloadMetaDataContexts.getShardingSphereData().getDatabaseData().get(databaseName)).ifPresent(optional
 -> optional.getSchemaData().forEach((schemaName, schemaData) ->
+                    
reloadMetaDataContexts.getPersistService().getShardingSphereDataPersistService().persist(databaseName,
 schemaName, schemaData, metaDataContexts.getMetaData().getDatabases())));
             alterSchemaMetaData(databaseName, 
reloadMetaDataContexts.getMetaData().getDatabase(databaseName), 
metaDataContexts.getMetaData().getDatabase(databaseName));
             metaDataContexts = reloadMetaDataContexts;
             
metaDataContexts.getMetaData().getDatabases().putAll(newShardingSphereDatabase(metaDataContexts.getMetaData().getDatabase(databaseName)));

Reply via email to