shardingsphere
shardingsphere copied to clipboard
When all read data sources are disabled by distsql,`RandomReadQueryLoadBalanceAlgorithm` reports exception
Bug Report
Which version of ShardingSphere did you use?
master
Which project did you use? ShardingSphere-JDBC or ShardingSphere-Proxy?
proxy
Expected behavior
not report expection
Actual behavior
throws java.lang.IllegalArgumentException: bound must be positive
Reason analyze (If you can)
java.lang.IllegalArgumentException: bound must be positive
at java.util.concurrent.ThreadLocalRandom.nextInt(ThreadLocalRandom.java:351)
at org.apache.shardingsphere.readwritesplitting.algorithm.loadbalance.RandomReadQueryLoadBalanceAlgorithm.getDataSource(RandomReadQueryLoadBalanceAlgorithm.java:46)
at org.apache.shardingsphere.readwritesplitting.route.impl.ReadwriteSplittingDataSourceRouter.route(ReadwriteSplittingDataSourceRouter.java:49)
at org.apache.shardingsphere.readwritesplitting.route.ReadwriteSplittingSQLRouter.decorateRouteContext(ReadwriteSplittingSQLRouter.java:61)
at org.apache.shardingsphere.readwritesplitting.route.ReadwriteSplittingSQLRouter.decorateRouteContext(ReadwriteSplittingSQLRouter.java:40)
at org.apache.shardingsphere.infra.route.engine.impl.PartialSQLRouteExecutor.route(PartialSQLRouteExecutor.java:59)
at org.apache.shardingsphere.infra.route.engine.SQLRouteEngine.route(SQLRouteEngine.java:53)
at org.apache.shardingsphere.infra.context.kernel.KernelProcessor.route(KernelProcessor.java:57)
at org.apache.shardingsphere.infra.context.kernel.KernelProcessor.generateExecutionContext(KernelProcessor.java:49)
at org.apache.shardingsphere.proxy.backend.communication.jdbc.JDBCDatabaseCommunicationEngine.execute(JDBCDatabaseCommunicationEngine.java:117)
at org.apache.shardingsphere.proxy.frontend.mysql.command.query.text.query.MySQLComQueryPacketExecutor.execute(MySQLComQueryPacketExecutor.java:94)
at org.apache.shardingsphere.proxy.frontend.command.CommandExecutorTask.executeCommand(CommandExecutorTask.java:112)
at org.apache.shardingsphere.proxy.frontend.command.CommandExecutorTask.run(CommandExecutorTask.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:750)
The param of `ThreadLocalRandom.current().nextInt()` must be a positive number.
Steps to reproduce the behavior, such as: SQL to execute, sharding rule configuration, when exception occur etc.
mysql> DISABLE READWRITE_SPLITTING READ read_ds_1;
Query OK, 0 rows affected (2 min 32.83 sec)
mysql> DISABLE READWRITE_SPLITTING READ read_ds_0;
Query OK, 0 rows affected (0.06 sec)
mysql> select * from t_order;
ERROR 1997 (C1997): Runtime exception: [bound must be positive]
Example codes for reproduce this issue (such as a github link).
server.yaml
mode:
type: Cluster
repository:
type: ZooKeeper
props:
namespace: governance_ds
server-lists: localhost:2181
retryIntervalMilliseconds: 500
timeToLiveSeconds: 60
maxRetries: 3
operationTimeoutMilliseconds: 500
overwrite: true
rules:
- !AUTHORITY
users:
- root@%:root
- sharding@:sharding
provider:
type: ALL_PERMITTED
- !TRANSACTION
defaultType: XA
providerType: Atomikos
- !SQL_PARSER
sqlCommentParseEnabled: true
sqlStatementCache:
initialCapacity: 2000
maximumSize: 65535
parseTreeCache:
initialCapacity: 128
maximumSize: 1024
config-readwrite-splitting.yaml
databaseName: readwrite_splitting_db
dataSources:
write_ds:
url: jdbc:mysql://127.0.0.1:3306/demo_write_ds?serverTimezone=UTC&useSSL=false
username: root
password: 1
connectionTimeoutMilliseconds: 30000
idleTimeoutMilliseconds: 60000
maxLifetimeMilliseconds: 1800000
maxPoolSize: 50
minPoolSize: 1
read_ds_0:
url: jdbc:mysql://127.0.0.1:3306/demo_read_ds_0?serverTimezone=UTC&useSSL=false
username: root
password: 1
connectionTimeoutMilliseconds: 30000
idleTimeoutMilliseconds: 60000
maxLifetimeMilliseconds: 1800000
maxPoolSize: 50
minPoolSize: 1
read_ds_1:
url: jdbc:mysql://127.0.0.1:3306/demo_read_ds_1?serverTimezone=UTC&useSSL=false
username: root
password: 1
connectionTimeoutMilliseconds: 30000
idleTimeoutMilliseconds: 60000
maxLifetimeMilliseconds: 1800000
maxPoolSize: 50
minPoolSize: 1
rules:
- !READWRITE_SPLITTING
dataSources:
readwrite_ds:
staticStrategy:
writeDataSourceName: write_ds
readDataSourceNames:
- read_ds_0
- read_ds_1
loadBalancerName: random
loadBalancers:
random:
type: RANDOM
Hello , this issue has not received a reply for several days. This issue is supposed to be closed.