Skip to content

Commit f4cefdf

Browse files
committed
Add DatabaseMetaDataPersistFacade.persistAlteredTables()
1 parent c2c6f22 commit f4cefdf

File tree

3 files changed

+40
-48
lines changed

3 files changed

+40
-48
lines changed

mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/persist/metadata/DatabaseMetaDataPersistFacade.java

+28
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@
3838

3939
import java.sql.SQLException;
4040
import java.util.Collection;
41+
import java.util.HashMap;
4142
import java.util.Map;
4243
import java.util.Map.Entry;
4344

@@ -148,4 +149,31 @@ public void unregisterStorageUnits(final String databaseName, final MetaDataCont
148149
throw new LoadTableMetaDataFailedException(databaseName, ex);
149150
}
150151
}
152+
153+
/**
154+
* Persist altered tables.
155+
*
156+
* @param databaseName database name
157+
* @param reloadMetaDataContexts reload meta data contexts
158+
* @param needReloadTables need reload tables
159+
* @return altered schema and tables map
160+
*/
161+
public Map<String, Collection<ShardingSphereTable>> persistAlteredTables(final String databaseName, final MetaDataContexts reloadMetaDataContexts, final Collection<String> needReloadTables) {
162+
ShardingSphereDatabase database = reloadMetaDataContexts.getMetaData().getDatabase(databaseName);
163+
GenericSchemaBuilderMaterial material = new GenericSchemaBuilderMaterial(database.getResourceMetaData().getStorageUnits(),
164+
database.getRuleMetaData().getRules(), reloadMetaDataContexts.getMetaData().getProps(),
165+
new DatabaseTypeRegistry(database.getProtocolType()).getDefaultSchemaName(databaseName));
166+
try {
167+
Map<String, ShardingSphereSchema> schemas = GenericSchemaBuilder.build(needReloadTables, database.getProtocolType(), material);
168+
Map<String, Collection<ShardingSphereTable>> result = new HashMap<>(schemas.size(), 1F);
169+
for (Entry<String, ShardingSphereSchema> entry : schemas.entrySet()) {
170+
Collection<ShardingSphereTable> tables = GenericSchemaManager.getToBeAddedTables(entry.getValue(), database.getSchema(entry.getKey()));
171+
table.persist(databaseName, entry.getKey(), tables);
172+
result.put(entry.getKey(), tables);
173+
}
174+
return result;
175+
} catch (final SQLException ex) {
176+
throw new LoadTableMetaDataFailedException(databaseName, needReloadTables, ex);
177+
}
178+
}
151179
}

mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/persist/service/ClusterMetaDataManagerPersistService.java

+2-26
Original file line numberDiff line numberDiff line change
@@ -19,21 +19,15 @@
1919

2020
import lombok.SneakyThrows;
2121
import org.apache.shardingsphere.infra.config.rule.RuleConfiguration;
22-
import org.apache.shardingsphere.infra.database.core.type.DatabaseTypeRegistry;
2322
import org.apache.shardingsphere.infra.datasource.pool.props.domain.DataSourcePoolProperties;
2423
import org.apache.shardingsphere.infra.exception.core.ShardingSpherePreconditions;
2524
import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
2625
import org.apache.shardingsphere.infra.metadata.database.rule.RuleMetaData;
27-
import org.apache.shardingsphere.infra.metadata.database.schema.builder.GenericSchemaBuilder;
28-
import org.apache.shardingsphere.infra.metadata.database.schema.builder.GenericSchemaBuilderMaterial;
29-
import org.apache.shardingsphere.infra.metadata.database.schema.manager.GenericSchemaManager;
30-
import org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereSchema;
3126
import org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereTable;
3227
import org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereView;
3328
import org.apache.shardingsphere.infra.metadata.statistics.DatabaseStatistics;
3429
import org.apache.shardingsphere.infra.metadata.statistics.SchemaStatistics;
3530
import org.apache.shardingsphere.infra.util.retry.RetryExecutor;
36-
import org.apache.shardingsphere.mode.exception.LoadTableMetaDataFailedException;
3731
import org.apache.shardingsphere.mode.manager.cluster.exception.ReloadMetaDataContextFailedException;
3832
import org.apache.shardingsphere.mode.manager.cluster.persist.coordinator.database.ClusterDatabaseListenerCoordinatorType;
3933
import org.apache.shardingsphere.mode.manager.cluster.persist.coordinator.database.ClusterDatabaseListenerPersistCoordinator;
@@ -46,7 +40,6 @@
4640
import org.apache.shardingsphere.single.config.SingleRuleConfiguration;
4741
import org.apache.shardingsphere.single.rule.SingleRule;
4842

49-
import java.sql.SQLException;
5043
import java.util.Collection;
5144
import java.util.Collections;
5245
import java.util.Map;
@@ -188,7 +181,7 @@ public void alterRuleConfiguration(final ShardingSphereDatabase database, final
188181
Collection<String> needReloadTables = getNeedReloadTables(database, toBeAlteredRuleConfig);
189182
MetaDataContexts originalMetaDataContexts = new MetaDataContexts(metaDataContextManager.getMetaDataContexts().getMetaData(), metaDataContextManager.getMetaDataContexts().getStatistics());
190183
metaDataPersistFacade.getDatabaseRuleService().persist(database.getName(), Collections.singleton(toBeAlteredRuleConfig));
191-
reloadAlteredTables(database.getName(), originalMetaDataContexts, needReloadTables);
184+
metaDataPersistFacade.getDatabaseMetaDataFacade().persistAlteredTables(database.getName(), getReloadedMetaDataContexts(originalMetaDataContexts), needReloadTables);
192185
}
193186

194187
@Override
@@ -199,24 +192,7 @@ public void removeRuleConfigurationItem(final ShardingSphereDatabase database, f
199192
Collection<String> needReloadTables = getNeedReloadTables(database, toBeRemovedRuleConfig);
200193
MetaDataContexts originalMetaDataContexts = new MetaDataContexts(metaDataContextManager.getMetaDataContexts().getMetaData(), metaDataContextManager.getMetaDataContexts().getStatistics());
201194
metaDataPersistFacade.getDatabaseRuleService().delete(database.getName(), Collections.singleton(toBeRemovedRuleConfig));
202-
reloadAlteredTables(database.getName(), originalMetaDataContexts, needReloadTables);
203-
}
204-
205-
private void reloadAlteredTables(final String databaseName, final MetaDataContexts originalMetaDataContexts, final Collection<String> needReloadTables) {
206-
MetaDataContexts reloadMetaDataContexts = getReloadedMetaDataContexts(originalMetaDataContexts);
207-
ShardingSphereDatabase database = reloadMetaDataContexts.getMetaData().getDatabase(databaseName);
208-
GenericSchemaBuilderMaterial material = new GenericSchemaBuilderMaterial(database.getResourceMetaData().getStorageUnits(),
209-
database.getRuleMetaData().getRules(), reloadMetaDataContexts.getMetaData().getProps(),
210-
new DatabaseTypeRegistry(database.getProtocolType()).getDefaultSchemaName(databaseName));
211-
try {
212-
Map<String, ShardingSphereSchema> schemas = GenericSchemaBuilder.build(needReloadTables, database.getProtocolType(), material);
213-
for (Entry<String, ShardingSphereSchema> entry : schemas.entrySet()) {
214-
Collection<ShardingSphereTable> tables = GenericSchemaManager.getToBeAddedTables(entry.getValue(), database.getSchema(entry.getKey()));
215-
metaDataPersistFacade.getDatabaseMetaDataFacade().getTable().persist(databaseName, entry.getKey(), tables);
216-
}
217-
} catch (final SQLException ex) {
218-
throw new LoadTableMetaDataFailedException(databaseName, needReloadTables, ex);
219-
}
195+
metaDataPersistFacade.getDatabaseMetaDataFacade().persistAlteredTables(database.getName(), getReloadedMetaDataContexts(originalMetaDataContexts), needReloadTables);
220196
}
221197

222198
private Collection<String> getNeedReloadTables(final ShardingSphereDatabase originalShardingDatabase, final RuleConfiguration toBeAlteredRuleConfig) {

mode/type/standalone/core/src/main/java/org/apache/shardingsphere/mode/manager/standalone/persist/service/StandaloneMetaDataManagerPersistService.java

+10-22
Original file line numberDiff line numberDiff line change
@@ -18,21 +18,15 @@
1818
package org.apache.shardingsphere.mode.manager.standalone.persist.service;
1919

2020
import org.apache.shardingsphere.infra.config.rule.RuleConfiguration;
21-
import org.apache.shardingsphere.infra.database.core.type.DatabaseTypeRegistry;
2221
import org.apache.shardingsphere.infra.datasource.pool.props.domain.DataSourcePoolProperties;
2322
import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
2423
import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
2524
import org.apache.shardingsphere.infra.metadata.database.rule.RuleMetaData;
26-
import org.apache.shardingsphere.infra.metadata.database.schema.builder.GenericSchemaBuilder;
27-
import org.apache.shardingsphere.infra.metadata.database.schema.builder.GenericSchemaBuilderMaterial;
28-
import org.apache.shardingsphere.infra.metadata.database.schema.manager.GenericSchemaManager;
29-
import org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereSchema;
3025
import org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereTable;
3126
import org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereView;
3227
import org.apache.shardingsphere.infra.rule.scope.GlobalRule;
3328
import org.apache.shardingsphere.infra.rule.scope.GlobalRule.GlobalRuleChangedType;
3429
import org.apache.shardingsphere.infra.spi.type.ordered.cache.OrderedServicesCache;
35-
import org.apache.shardingsphere.mode.exception.LoadTableMetaDataFailedException;
3630
import org.apache.shardingsphere.mode.metadata.MetaDataContexts;
3731
import org.apache.shardingsphere.mode.metadata.changed.RuleItemChangedNodePathBuilder;
3832
import org.apache.shardingsphere.mode.metadata.manager.ActiveVersionChecker;
@@ -221,7 +215,9 @@ && new ActiveVersionChecker(metaDataPersistFacade.getRepository()).checkSame(new
221215
metaDataContextManager.getDatabaseRuleItemManager().alter(databaseRuleNodePath.get());
222216
}
223217
}
224-
reloadAlteredTables(database.getName(), needReloadTables);
218+
Map<String, Collection<ShardingSphereTable>> schemaAndTablesMap = metaDataPersistFacade.getDatabaseMetaDataFacade().persistAlteredTables(
219+
database.getName(), metaDataContextManager.getMetaDataContexts(), needReloadTables);
220+
alterTables(database, schemaAndTablesMap);
225221
OrderedServicesCache.clearCache();
226222
}
227223

@@ -238,25 +234,17 @@ public void removeRuleConfigurationItem(final ShardingSphereDatabase database, f
238234
metaDataContextManager.getDatabaseRuleItemManager().drop(databaseRuleNodePath.get());
239235
}
240236
}
241-
reloadAlteredTables(database.getName(), needReloadTables);
237+
Map<String, Collection<ShardingSphereTable>> schemaAndTablesMap = metaDataPersistFacade.getDatabaseMetaDataFacade().persistAlteredTables(
238+
database.getName(), metaDataContextManager.getMetaDataContexts(), needReloadTables);
239+
alterTables(database, schemaAndTablesMap);
242240
OrderedServicesCache.clearCache();
243241
}
244242

245-
private void reloadAlteredTables(final String databaseName, final Collection<String> needReloadTables) {
246-
MetaDataContexts reloadMetaDataContexts = metaDataContextManager.getMetaDataContexts();
247-
ShardingSphereDatabase database = reloadMetaDataContexts.getMetaData().getDatabase(databaseName);
248-
GenericSchemaBuilderMaterial material = new GenericSchemaBuilderMaterial(database.getResourceMetaData().getStorageUnits(),
249-
database.getRuleMetaData().getRules(), reloadMetaDataContexts.getMetaData().getProps(),
250-
new DatabaseTypeRegistry(database.getProtocolType()).getDefaultSchemaName(databaseName));
251-
try {
252-
Map<String, ShardingSphereSchema> schemas = GenericSchemaBuilder.build(needReloadTables, database.getProtocolType(), material);
253-
for (Entry<String, ShardingSphereSchema> entry : schemas.entrySet()) {
254-
Collection<ShardingSphereTable> tables = GenericSchemaManager.getToBeAddedTables(entry.getValue(), database.getSchema(entry.getKey()));
255-
metaDataPersistFacade.getDatabaseMetaDataFacade().getTable().persist(databaseName, entry.getKey(), tables);
256-
tables.forEach(each -> metaDataContextManager.getDatabaseMetaDataManager().alterTable(databaseName, entry.getKey(), each));
243+
private void alterTables(final ShardingSphereDatabase database, final Map<String, Collection<ShardingSphereTable>> schemaAndTablesMap) {
244+
for (Entry<String, Collection<ShardingSphereTable>> entry : schemaAndTablesMap.entrySet()) {
245+
for (ShardingSphereTable each : entry.getValue()) {
246+
metaDataContextManager.getDatabaseMetaDataManager().alterTable(database.getName(), entry.getKey(), each);
257247
}
258-
} catch (final SQLException ex) {
259-
throw new LoadTableMetaDataFailedException(databaseName, needReloadTables, ex);
260248
}
261249
}
262250

0 commit comments

Comments
 (0)