terrymanu edited a comment on issue #11307:
URL:
https://github.com/apache/shardingsphere/issues/11307#issuecomment-897803147
The problem is for thread safe in class OrderedSPIRegistry.
When I add some log in the method:
```java
/**
* Get registered services.
*
* @param types types
* @param orderedSPIClass class of ordered SPI
* @param <K> type of key
* @param <V> type of ordered SPI class
* @param comparator comparator
* @return registered services
*/
@SuppressWarnings("unchecked")
public static <K, V extends OrderedSPI<?>> Map<K, V>
getRegisteredServices(final Collection<K> types, final Class<V>
orderedSPIClass, final Comparator<Integer> comparator) {
Optional<CachedOrderedServices> cachedServices =
OrderedServicesCache.findCachedServices(types, orderedSPIClass);
if (cachedServices.isPresent()) {
Map<K, V> result = (Map<K, V>)
cachedServices.get().getServices();
if (types.size() == 2 && !result.isEmpty() &&
result.keySet().iterator().next().getClass().equals(SingleTableRuleBuilder.class))
{
// Add log
System.out.println("from cache: types:" + types + "result: "
+ result);
}
return result;
}
Collection<V> registeredServices =
getRegisteredServices(orderedSPIClass, comparator);
Map<K, V> result = new LinkedHashMap<>(registeredServices.size(), 1);
for (V each : registeredServices) {
types.stream().filter(type -> each.getTypeClass() ==
type.getClass()).forEach(type -> result.put(type, each));
}
OrderedServicesCache.cacheServices(types, orderedSPIClass, result);
return result;
}
```
The result form cache are error sometimes.
The error log:
```
from cache:
types:
[org.apache.shardingsphere.infra.persist.rule.builder.DistMetaDataPersistRuleBuilder@21cf7d6c,
org.apache.shardingsphere.authority.rule.builder.AuthorityRuleBuilder@14e57238]
result:
{org.apache.shardingsphere.infra.rule.builder.single.SingleTableRuleBuilder@6015bb85=org.apache.shardingsphere.infra.rule.builder.single.DefaultSingleTableRuleConfigurationBuilder@602e976a}
```
When using `DistMetaDataPersistRuleBuilder` and `AuthorityRuleBuilder` to
get the builder, but return `SingleTableRuleBuilder`
And then throw exception below:
```
java.lang.ClassCastException:
org.apache.shardingsphere.infra.rule.builder.single.SingleTableRuleBuilder
cannot be cast to
org.apache.shardingsphere.infra.rule.builder.scope.GlobalRuleBuilder
at
org.apache.shardingsphere.infra.rule.builder.ShardingSphereRulesBuilder.buildGlobalRules(ShardingSphereRulesBuilder.java:129)
at
org.apache.shardingsphere.infra.context.metadata.MetaDataContextsBuilder.buildGlobalSchemaMetaData(MetaDataContextsBuilder.java:119)
at
org.apache.shardingsphere.infra.context.metadata.MetaDataContextsBuilder.build(MetaDataContextsBuilder.java:108)
at
org.apache.shardingsphere.driver.jdbc.core.datasource.ShardingSphereDataSource.<init>(ShardingSphereDataSource.java:66)
at
org.apache.shardingsphere.driver.jdbc.core.datasource.ShardingSphereDataSource.<init>(ShardingSphereDataSource.java:58)
at
org.apache.shardingsphere.driver.api.ShardingSphereDataSourceFactory.createDataSource(ShardingSphereDataSourceFactory.java:52)
at
org.apache.shardingsphere.driver.api.yaml.YamlShardingSphereDataSourceFactory.createDataSource(YamlShardingSphereDataSourceFactory.java:132)
at
org.apache.shardingsphere.driver.api.yaml.YamlShardingSphereDataSourceFactory.createDataSource(YamlShardingSphereDataSourceFactory.java:83)
at
org.apache.shardingsphere.test.integration.junit.container.adapter.impl.ShardingSphereJDBCContainer.getDataSource(ShardingSphereJDBCContainer.java:77)
at
org.apache.shardingsphere.test.integration.junit.compose.ContainerCompose.getDataSourceMap(ContainerCompose.java:162)
at
org.apache.shardingsphere.test.integration.engine.it.BaseITCase.createDataSource(BaseITCase.java:83)
at sun.reflect.GeneratedMethodAccessor34.invoke(Unknown Source)
at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at
org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
at
org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at
org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
at
org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:24)
at
org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:27)
at org.junit.rules.TestWatcher$1.evaluate(TestWatcher.java:55)
at org.junit.rules.ExternalResource$1.evaluate(ExternalResource.java:48)
at org.junit.rules.RunRules.evaluate(RunRules.java:20)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
at
org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
at
org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
at org.junit.runners.Suite.runChild(Suite.java:128)
at org.junit.runners.Suite.runChild(Suite.java:27)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
at
java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
at
com.google.common.util.concurrent.TrustedListenableFutureTask$TrustedFutureInterruptibleTask.runInterruptibly(TrustedListenableFutureTask.java:125)
at
com.google.common.util.concurrent.InterruptibleTask.run(InterruptibleTask.java:69)
at
com.google.common.util.concurrent.TrustedListenableFutureTask.run(TrustedListenableFutureTask.java:78)
at
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
```
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]