22
22
import org .apache .shardingsphere .infra .config .rule .RuleConfiguration ;
23
23
import org .apache .shardingsphere .infra .database .core .type .DatabaseTypeRegistry ;
24
24
import org .apache .shardingsphere .infra .datasource .pool .props .domain .DataSourcePoolProperties ;
25
+ import org .apache .shardingsphere .infra .exception .core .ShardingSpherePreconditions ;
25
26
import org .apache .shardingsphere .infra .metadata .database .ShardingSphereDatabase ;
26
27
import org .apache .shardingsphere .infra .metadata .database .rule .RuleMetaData ;
27
28
import org .apache .shardingsphere .infra .metadata .database .schema .builder .GenericSchemaBuilder ;
30
31
import org .apache .shardingsphere .infra .metadata .database .schema .model .ShardingSphereSchema ;
31
32
import org .apache .shardingsphere .infra .metadata .database .schema .model .ShardingSphereTable ;
32
33
import org .apache .shardingsphere .infra .metadata .database .schema .model .ShardingSphereView ;
34
+ import org .apache .shardingsphere .infra .util .retry .RetryExecutor ;
33
35
import org .apache .shardingsphere .mode .exception .LoadTableMetaDataFailedException ;
34
36
import org .apache .shardingsphere .mode .manager .cluster .exception .ReloadMetaDataContextFailedException ;
35
37
import org .apache .shardingsphere .mode .manager .cluster .persist .coordinator .database .ClusterDatabaseListenerCoordinatorType ;
@@ -80,7 +82,7 @@ public void createDatabase(final String databaseName) {
80
82
}
81
83
82
84
private void afterDatabaseCreated (final String databaseName , final MetaDataContexts originalMetaDataContexts ) {
83
- MetaDataContexts reloadMetaDataContexts = getReloadMetaDataContexts (originalMetaDataContexts );
85
+ MetaDataContexts reloadMetaDataContexts = getReloadedMetaDataContexts (originalMetaDataContexts );
84
86
metaDataPersistFacade .persistReloadDatabaseByAlter (databaseName , reloadMetaDataContexts .getMetaData ().getDatabase (databaseName ),
85
87
originalMetaDataContexts .getMetaData ().getDatabase (databaseName ));
86
88
}
@@ -174,7 +176,7 @@ private Collection<String> getToBeDroppedResourceNames(final String databaseName
174
176
}
175
177
176
178
private void afterStorageUnitsAltered (final String databaseName , final MetaDataContexts originalMetaDataContexts ) {
177
- MetaDataContexts reloadMetaDataContexts = getReloadMetaDataContexts (originalMetaDataContexts );
179
+ MetaDataContexts reloadMetaDataContexts = getReloadedMetaDataContexts (originalMetaDataContexts );
178
180
Optional .ofNullable (reloadMetaDataContexts .getStatistics ().getDatabaseStatistics (databaseName ))
179
181
.ifPresent (optional -> optional .getSchemaStatisticsMap ().forEach ((schemaName , schemaStatistics ) -> metaDataPersistFacade .getStatisticsService ()
180
182
.persist (originalMetaDataContexts .getMetaData ().getDatabase (databaseName ), schemaName , schemaStatistics )));
@@ -183,7 +185,7 @@ private void afterStorageUnitsAltered(final String databaseName, final MetaDataC
183
185
}
184
186
185
187
private void afterStorageUnitsDropped (final String databaseName , final MetaDataContexts originalMetaDataContexts ) {
186
- MetaDataContexts reloadMetaDataContexts = getReloadMetaDataContexts (originalMetaDataContexts );
188
+ MetaDataContexts reloadMetaDataContexts = getReloadedMetaDataContexts (originalMetaDataContexts );
187
189
ShardingSphereDatabase database = reloadMetaDataContexts .getMetaData ().getDatabase (databaseName );
188
190
GenericSchemaBuilderMaterial material = new GenericSchemaBuilderMaterial (database .getResourceMetaData ().getStorageUnits (),
189
191
database .getRuleMetaData ().getRules (), reloadMetaDataContexts .getMetaData ().getProps (),
@@ -232,7 +234,7 @@ public void removeRuleConfigurationItem(final ShardingSphereDatabase database, f
232
234
}
233
235
234
236
private void reloadAlteredTables (final String databaseName , final MetaDataContexts originalMetaDataContexts , final Collection <String > needReloadTables ) {
235
- MetaDataContexts reloadMetaDataContexts = getReloadMetaDataContexts (originalMetaDataContexts );
237
+ MetaDataContexts reloadMetaDataContexts = getReloadedMetaDataContexts (originalMetaDataContexts );
236
238
ShardingSphereDatabase database = reloadMetaDataContexts .getMetaData ().getDatabase (databaseName );
237
239
GenericSchemaBuilderMaterial material = new GenericSchemaBuilderMaterial (database .getResourceMetaData ().getStorageUnits (),
238
240
database .getRuleMetaData ().getRules (), reloadMetaDataContexts .getMetaData ().getProps (),
@@ -273,21 +275,14 @@ public void alterProperties(final Properties props) {
273
275
}
274
276
275
277
@ SneakyThrows (InterruptedException .class )
276
- private MetaDataContexts getReloadMetaDataContexts (final MetaDataContexts originalMetaDataContexts ) {
278
+ private MetaDataContexts getReloadedMetaDataContexts (final MetaDataContexts originalMetaDataContexts ) {
277
279
Thread .sleep (3000L );
278
280
MetaDataContexts reloadMetaDataContexts = metaDataContextManager .getMetaDataContexts ();
279
281
if (reloadMetaDataContexts .getMetaData () != originalMetaDataContexts .getMetaData () && reloadMetaDataContexts .getStatistics () != originalMetaDataContexts .getStatistics ()) {
280
282
return reloadMetaDataContexts ;
281
283
}
282
- long startTime = System .currentTimeMillis ();
283
- long timeout = 30000 ;
284
- while (System .currentTimeMillis () - startTime < timeout ) {
285
- reloadMetaDataContexts = metaDataContextManager .getMetaDataContexts ();
286
- if (reloadMetaDataContexts != originalMetaDataContexts ) {
287
- return reloadMetaDataContexts ;
288
- }
289
- Thread .sleep (1000L );
290
- }
291
- throw new ReloadMetaDataContextFailedException ();
284
+ RetryExecutor retryExecutor = new RetryExecutor (30000L , 1000L );
285
+ ShardingSpherePreconditions .checkState (retryExecutor .execute (arg -> metaDataContextManager .getMetaDataContexts () != arg , originalMetaDataContexts ), ReloadMetaDataContextFailedException ::new );
286
+ return metaDataContextManager .getMetaDataContexts ();
292
287
}
293
288
}
0 commit comments