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)));