sandynz opened a new issue #14576:
URL: https://github.com/apache/shardingsphere/issues/14576
## Bug Report
### Which version of ShardingSphere did you use?
master branch, commit 8ba7daf169aa4a7b9c74782c85c5c2c85e00ca5e
### Which project did you use? ShardingSphere-JDBC or ShardingSphere-Proxy?
ShardingSphere-Proxy
macOS Big Sur 11.3.1
JDK 8
### Expected behavior
No long lock time on `InstanceId` construction
### Actual behavior
BLOCKED for a long time
scaling data consistency check will create ShardingSphereDataSource, it cost
much time to completion, e.g.
```
mysql> check scaling 1587380407988673 by type(name=CRC32_MATCH);
+--------------+----------------------+----------------------+-----------------------+-------------------------+
| table_name | source_records_count | target_records_count |
records_count_matched | records_content_matched |
+--------------+----------------------+----------------------+-----------------------+-------------------------+
| t_order_item | 6 | 6 | true
| true |
| t_order | 6 | 6 | true
| true |
+--------------+----------------------+----------------------+-----------------------+-------------------------+
2 rows in set (25.49 sec)
mysql> check scaling 1587380407988673 by type(name=CRC32_MATCH);
+--------------+----------------------+----------------------+-----------------------+-------------------------+
| table_name | source_records_count | target_records_count |
records_count_matched | records_content_matched |
+--------------+----------------------+----------------------+-----------------------+-------------------------+
| t_order_item | 6 | 6 | true
| true |
| t_order | 6 | 6 | true
| true |
+--------------+----------------------+----------------------+-----------------------+-------------------------+
2 rows in set (2 min 20.08 sec)
```
From thread snapshot, I found much threads are blocked on
`ManagementFactory.getRuntimeMXBean().getName()`, stack trace examples:
```
"Curator-SafeNotifyService-0" #80 daemon prio=5 os_prio=31
tid=0x00007fe0ddc20000 nid=0xc203 waiting for monitor entry [0x0000700011736000]
java.lang.Thread.State: BLOCKED (on object monitor)
at java.net.InetAddress.getLocalHost(InetAddress.java:1487)
- waiting to lock <0x00000006c005f328> (a java.lang.Object)
at sun.management.VMManagementImpl.getVmId(VMManagementImpl.java:140)
at sun.management.RuntimeImpl.getName(RuntimeImpl.java:59)
at
org.apache.shardingsphere.elasticjob.infra.handler.sharding.JobInstance.<init>(JobInstance.java:44)
at
org.apache.shardingsphere.elasticjob.lite.internal.schedule.JobScheduler.registerStartUpInfo(JobScheduler.java:176)
at
org.apache.shardingsphere.elasticjob.lite.internal.schedule.JobScheduler.createJobScheduleController(JobScheduler.java:140)
at
org.apache.shardingsphere.elasticjob.lite.internal.schedule.JobScheduler.<init>(JobScheduler.java:90)
at
org.apache.shardingsphere.elasticjob.lite.api.bootstrap.impl.OneOffJobBootstrap.<init>(OneOffJobBootstrap.java:40)
at
org.apache.shardingsphere.data.pipeline.core.execute.PipelineJobExecutor.execute(PipelineJobExecutor.java:94)
```
```
"elasticjob-1599777329568527-2" #129 daemon prio=5 os_prio=31
tid=0x00007fe0ca0ed800 nid=0xdc03 waiting for monitor entry [0x0000700013796000]
java.lang.Thread.State: BLOCKED (on object monitor)
at java.net.InetAddress.getLocalHost(InetAddress.java:1487)
- waiting to lock <merged>(a java.lang.Object)
at sun.management.VMManagementImpl.getVmId(VMManagementImpl.java:140)
at sun.management.RuntimeImpl.getName(RuntimeImpl.java:59)
at
org.apache.shardingsphere.infra.instance.InstanceId.<init>(InstanceId.java:54)
at
org.apache.shardingsphere.infra.instance.InstanceDefinition.<init>(InstanceDefinition.java:36)
at
org.apache.shardingsphere.driver.jdbc.core.datasource.ShardingSphereDataSource.createContextManager(ShardingSphereDataSource.java:79)
at
org.apache.shardingsphere.driver.jdbc.core.datasource.ShardingSphereDataSource.<init>(ShardingSphereDataSource.java:64)
at
org.apache.shardingsphere.driver.api.ShardingSphereDataSourceFactory.createDataSource(ShardingSphereDataSourceFactory.java:77)
```
```
"1594994149277781_Worker-1" #101 prio=5 os_prio=31 tid=0x00007fe0e6328000
nid=0xc903 waiting for monitor entry [0x0000700012257000]
java.lang.Thread.State: BLOCKED (on object monitor)
at java.net.InetAddress.getLocalHost(InetAddress.java:1487)
- waiting to lock <0x00000006c005f328> (a java.lang.Object)
at sun.management.VMManagementImpl.getVmId(VMManagementImpl.java:140)
at sun.management.RuntimeImpl.getName(RuntimeImpl.java:59)
at
org.apache.shardingsphere.elasticjob.infra.handler.sharding.JobInstance.<init>(JobInstance.java:44)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at
sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at
sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
at
org.yaml.snakeyaml.constructor.Constructor$ConstructMapping.createEmptyJavaBean(Constructor.java:217)
at
org.yaml.snakeyaml.constructor.Constructor$ConstructMapping.construct(Constructor.java:189)
at
org.yaml.snakeyaml.constructor.Constructor$ConstructYamlObject.construct(Constructor.java:345)
at
org.yaml.snakeyaml.constructor.BaseConstructor.constructObject(BaseConstructor.java:182)
at
org.yaml.snakeyaml.constructor.BaseConstructor.constructDocument(BaseConstructor.java:141)
at
org.yaml.snakeyaml.constructor.BaseConstructor.getSingleData(BaseConstructor.java:127)
at org.yaml.snakeyaml.Yaml.loadFromReader(Yaml.java:450)
at org.yaml.snakeyaml.Yaml.loadAs(Yaml.java:427)
at
org.apache.shardingsphere.elasticjob.infra.yaml.YamlEngine.unmarshal(YamlEngine.java:50)
at
org.apache.shardingsphere.elasticjob.lite.internal.instance.InstanceService.getAvailableJobInstances(InstanceService.java:72)
at
org.apache.shardingsphere.elasticjob.lite.internal.sharding.ShardingService.shardingIfNecessary(ShardingService.java:111)
at
org.apache.shardingsphere.elasticjob.lite.internal.schedule.LiteJobFacade.getShardingContexts(LiteJobFacade.java:115)
at
org.apache.shardingsphere.elasticjob.executor.ElasticJobExecutor.execute(ElasticJobExecutor.java:85)
at
org.apache.shardingsphere.elasticjob.lite.internal.schedule.LiteJob.execute(LiteJob.java:35)
```
```
"ShardingSphere-Command-0" #106 daemon prio=5 os_prio=31
tid=0x00007fe0db76b000 nid=0x13003 waiting for monitor entry
[0x0000700012560000]
java.lang.Thread.State: BLOCKED (on object monitor)
at java.net.InetAddress.getLocalHost(InetAddress.java:1487)
- waiting to lock <0x00000006c005f328> (a java.lang.Object)
at sun.management.VMManagementImpl.getVmId(VMManagementImpl.java:140)
at sun.management.RuntimeImpl.getName(RuntimeImpl.java:59)
at
org.apache.shardingsphere.infra.instance.InstanceId.<init>(InstanceId.java:54)
at
org.apache.shardingsphere.infra.instance.InstanceDefinition.<init>(InstanceDefinition.java:36)
at
org.apache.shardingsphere.driver.jdbc.core.datasource.ShardingSphereDataSource.createContextManager(ShardingSphereDataSource.java:79)
at
org.apache.shardingsphere.driver.jdbc.core.datasource.ShardingSphereDataSource.<init>(ShardingSphereDataSource.java:64)
at
org.apache.shardingsphere.driver.api.ShardingSphereDataSourceFactory.createDataSource(ShardingSphereDataSourceFactory.java:77)
at
org.apache.shardingsphere.driver.api.ShardingSphereDataSourceFactory.createDataSource(ShardingSphereDataSourceFactory.java:138)
at
org.apache.shardingsphere.driver.config.datasource.ShardingSpherePipelineDataSourceCreator.createPipelineDataSource(ShardingSpherePipelineDataSourceCreator.java:43)
at
org.apache.shardingsphere.data.pipeline.core.datasource.PipelineDataSourceFactory.newInstance(PipelineDataSourceFactory.java:42)
at
org.apache.shardingsphere.data.pipeline.core.check.consistency.DataConsistencyCheckerImpl.checkRecordsContent(DataConsistencyCheckerImpl.java:148)
at
org.apache.shardingsphere.data.pipeline.core.api.impl.PipelineJobAPIImpl.dataConsistencyCheck0(PipelineJobAPIImpl.java:254)
at
org.apache.shardingsphere.data.pipeline.core.api.impl.PipelineJobAPIImpl.dataConsistencyCheck(PipelineJobAPIImpl.java:246)
```
After some code change:
```
public InstanceId() {
port = 0;
ip = IpUtils.getIp();
// id = String.join(DELIMITER, ip,
ManagementFactory.getRuntimeMXBean().getName().split(DELIMITER)[0]);
id = String.join(DELIMITER, ip, "test1");
}
```
And test again, it get much faster, e.g.
```
mysql> check scaling 1587380407988673 by type(name=CRC32_MATCH);
+--------------+----------------------+----------------------+-----------------------+-------------------------+
| table_name | source_records_count | target_records_count |
records_count_matched | records_content_matched |
+--------------+----------------------+----------------------+-----------------------+-------------------------+
| t_order_item | 6 | 6 | true
| true |
| t_order | 6 | 6 | true
| true |
+--------------+----------------------+----------------------+-----------------------+-------------------------+
2 rows in set (0.35 sec)
```
### Reason analyze (If you can)
### Steps to reproduce the behavior, such as: SQL to execute, sharding rule
configuration, when exception occur etc.
### Example codes for reproduce this issue (such as a github link).
--
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]