Skip to content

Commit 603c222

Browse files
authored
Pick fix commits in 5.5.1-fix from apache (#27)
* Pick 5.5.0-fix #15, optimize the rollback strategy for import database config failed * Pick #33248, Check weight load balancer props when create readwrite-splitting rule * Pick #33274, Add query parameters and check for mysql kill processId * Pick #33367, Remove ShardingRouteAlgorithmException check logic temporarily to support different actual table name config * Pick #33346, Fix missing logic db when query information_schema.SCHEMATA with NOT IN clause * Pick #33370, Fix table does not exist exception when use HintManager#setDatabaseName to transparent
1 parent 271dede commit 603c222

File tree

12 files changed

+140
-38
lines changed

12 files changed

+140
-38
lines changed

features/readwrite-splitting/distsql/handler/src/main/java/org/apache/shardingsphere/readwritesplitting/distsql/handler/checker/ReadwriteSplittingRuleStatementChecker.java

Lines changed: 26 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@
2020
import com.google.common.base.Strings;
2121
import lombok.AccessLevel;
2222
import lombok.NoArgsConstructor;
23+
import org.apache.shardingsphere.distsql.segment.AlgorithmSegment;
24+
import org.apache.shardingsphere.infra.algorithm.core.exception.InvalidAlgorithmConfigurationException;
2325
import org.apache.shardingsphere.infra.algorithm.loadbalancer.core.LoadBalanceAlgorithm;
2426
import org.apache.shardingsphere.infra.exception.core.ShardingSpherePreconditions;
2527
import org.apache.shardingsphere.infra.exception.kernel.metadata.resource.storageunit.MissingRequiredStorageUnitsException;
@@ -33,11 +35,11 @@
3335
import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader;
3436
import org.apache.shardingsphere.readwritesplitting.config.ReadwriteSplittingRuleConfiguration;
3537
import org.apache.shardingsphere.readwritesplitting.config.rule.ReadwriteSplittingDataSourceGroupRuleConfiguration;
36-
import org.apache.shardingsphere.readwritesplitting.transaction.TransactionalReadQueryStrategy;
3738
import org.apache.shardingsphere.readwritesplitting.constant.ReadwriteSplittingDataSourceType;
3839
import org.apache.shardingsphere.readwritesplitting.distsql.segment.ReadwriteSplittingRuleSegment;
3940
import org.apache.shardingsphere.readwritesplitting.exception.ReadwriteSplittingRuleExceptionIdentifier;
4041
import org.apache.shardingsphere.readwritesplitting.exception.actual.DuplicateReadwriteSplittingActualDataSourceException;
42+
import org.apache.shardingsphere.readwritesplitting.transaction.TransactionalReadQueryStrategy;
4143

4244
import java.util.Arrays;
4345
import java.util.Collection;
@@ -46,7 +48,6 @@
4648
import java.util.LinkedHashSet;
4749
import java.util.LinkedList;
4850
import java.util.Map.Entry;
49-
import java.util.Objects;
5051
import java.util.stream.Collectors;
5152

5253
/**
@@ -218,7 +219,28 @@ private static void checkTransactionalReadQueryStrategy(final Collection<Readwri
218219
}
219220

220221
private static void checkLoadBalancers(final Collection<ReadwriteSplittingRuleSegment> segments) {
221-
segments.stream().map(ReadwriteSplittingRuleSegment::getLoadBalancer).filter(Objects::nonNull)
222-
.forEach(each -> TypedSPILoader.checkService(LoadBalanceAlgorithm.class, each.getName(), each.getProps()));
222+
for (ReadwriteSplittingRuleSegment each : segments) {
223+
AlgorithmSegment loadBalancer = each.getLoadBalancer();
224+
if (loadBalancer != null) {
225+
TypedSPILoader.checkService(LoadBalanceAlgorithm.class, loadBalancer.getName(), loadBalancer.getProps());
226+
checkProperties(each);
227+
}
228+
}
229+
}
230+
231+
private static void checkProperties(final ReadwriteSplittingRuleSegment each) {
232+
if ("WEIGHT".equalsIgnoreCase(each.getLoadBalancer().getName())) {
233+
ShardingSpherePreconditions.checkNotEmpty(each.getLoadBalancer().getProps(),
234+
() -> new InvalidAlgorithmConfigurationException("Load balancer", each.getLoadBalancer().getName()));
235+
checkDataSource(each);
236+
}
237+
}
238+
239+
private static void checkDataSource(final ReadwriteSplittingRuleSegment ruleSegment) {
240+
for (Object each : ruleSegment.getLoadBalancer().getProps().keySet()) {
241+
String dataSourceName = (String) each;
242+
ShardingSpherePreconditions.checkState(ruleSegment.getReadDataSources().contains(dataSourceName) || ruleSegment.getWriteDataSource().equals(dataSourceName),
243+
() -> new InvalidAlgorithmConfigurationException("Load balancer", ruleSegment.getLoadBalancer().getName()));
244+
}
223245
}
224246
}

features/readwrite-splitting/distsql/handler/src/test/java/org/apache/shardingsphere/readwritesplitting/distsql/handler/update/AlterReadwriteSplittingRuleExecutorTest.java

Lines changed: 27 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
package org.apache.shardingsphere.readwritesplitting.distsql.handler.update;
1919

2020
import org.apache.shardingsphere.distsql.segment.AlgorithmSegment;
21+
import org.apache.shardingsphere.infra.algorithm.core.exception.InvalidAlgorithmConfigurationException;
2122
import org.apache.shardingsphere.infra.exception.kernel.metadata.resource.storageunit.MissingRequiredStorageUnitsException;
2223
import org.apache.shardingsphere.infra.exception.kernel.metadata.rule.MissingRequiredRuleException;
2324
import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
@@ -29,6 +30,8 @@
2930
import org.apache.shardingsphere.readwritesplitting.distsql.statement.AlterReadwriteSplittingRuleStatement;
3031
import org.apache.shardingsphere.readwritesplitting.exception.actual.DuplicateReadwriteSplittingActualDataSourceException;
3132
import org.apache.shardingsphere.readwritesplitting.rule.ReadwriteSplittingRule;
33+
import org.apache.shardingsphere.test.util.PropertiesBuilder;
34+
import org.apache.shardingsphere.test.util.PropertiesBuilder.Property;
3235
import org.junit.jupiter.api.BeforeEach;
3336
import org.junit.jupiter.api.Test;
3437
import org.junit.jupiter.api.extension.ExtendWith;
@@ -74,7 +77,7 @@ void assertCheckSQLStatementWithoutToBeAlteredRules() {
7477
}
7578

7679
@Test
77-
void assertCheckSQLStatementWithoutExistedResources() {
80+
void assertCheckSQLStatementWithNotExistedDataSources() {
7881
when(resourceMetaData.getNotExistedDataSources(any())).thenReturn(Collections.singleton("read_ds_0"));
7982
ReadwriteSplittingRule rule = mock(ReadwriteSplittingRule.class);
8083
when(rule.getConfiguration()).thenReturn(createCurrentRuleConfiguration());
@@ -93,48 +96,58 @@ void assertCheckSQLStatementWithoutToBeAlteredLoadBalancers() {
9396
}
9497

9598
@Test
96-
void assertCheckSQLStatementWithDuplicateWriteResourceNamesInStatement() {
99+
void assertCheckSQLStatementWithDuplicateWriteDataSourcesInStatement() {
97100
ShardingSphereDatabase database = mock(ShardingSphereDatabase.class, RETURNS_DEEP_STUBS);
98101
when(database.getResourceMetaData()).thenReturn(resourceMetaData);
99102
ReadwriteSplittingRule rule = mock(ReadwriteSplittingRule.class);
100103
when(rule.getConfiguration()).thenReturn(createCurrentRuleConfigurationWithMultipleRules());
101104
executor.setRule(rule);
102105
assertThrows(DuplicateReadwriteSplittingActualDataSourceException.class,
103-
() -> executor.checkBeforeUpdate(createSQLStatementWithDuplicateWriteResourceNames("readwrite_ds_0", "readwrite_ds_1", "TEST")));
106+
() -> executor.checkBeforeUpdate(createSQLStatementWithDuplicateWriteDataSources("readwrite_ds_0", "readwrite_ds_1", "TEST")));
104107
}
105108

106109
@Test
107-
void assertCheckSQLStatementWithDuplicateWriteResourceNames() {
110+
void assertCheckSQLStatementWithDuplicateWriteDataSources() {
108111
ShardingSphereDatabase database = mock(ShardingSphereDatabase.class, RETURNS_DEEP_STUBS);
109112
when(database.getResourceMetaData()).thenReturn(resourceMetaData);
110113
ReadwriteSplittingRule rule = mock(ReadwriteSplittingRule.class);
111114
when(rule.getConfiguration()).thenReturn(createCurrentRuleConfigurationWithMultipleRules());
112115
executor.setRule(rule);
113116
assertThrows(DuplicateReadwriteSplittingActualDataSourceException.class,
114117
() -> executor.checkBeforeUpdate(
115-
createSQLStatement("readwrite_ds_0", "ds_write_1", Arrays.asList("read_ds_0", "read_ds_1"), "TEST")));
118+
createSQLStatement("readwrite_ds_0", "ds_write_1", Arrays.asList("read_ds_0", "read_ds_1"), "TEST", new Properties())));
116119
}
117120

118121
@Test
119-
void assertCheckSQLStatementWithDuplicateReadResourceNamesInStatement() {
122+
void assertCheckSQLStatementWithDuplicateReadDataSourcesInStatement() {
120123
ShardingSphereDatabase database = mock(ShardingSphereDatabase.class, RETURNS_DEEP_STUBS);
121124
when(database.getResourceMetaData()).thenReturn(resourceMetaData);
122125
ReadwriteSplittingRule rule = mock(ReadwriteSplittingRule.class);
123126
when(rule.getConfiguration()).thenReturn(createCurrentRuleConfigurationWithMultipleRules());
124127
executor.setRule(rule);
125128
assertThrows(DuplicateReadwriteSplittingActualDataSourceException.class,
126-
() -> executor.checkBeforeUpdate(createSQLStatementWithDuplicateReadResourceNames("readwrite_ds_0", "readwrite_ds_1", "TEST")));
129+
() -> executor.checkBeforeUpdate(createSQLStatementWithDuplicateReadDataSources("readwrite_ds_0", "readwrite_ds_1", "TEST")));
127130
}
128131

129132
@Test
130-
void assertCheckSQLStatementWithDuplicateReadResourceNames() {
133+
void assertCheckSQLStatementWithDuplicateReadDataSources() {
131134
ShardingSphereDatabase database = mock(ShardingSphereDatabase.class, RETURNS_DEEP_STUBS);
132135
when(database.getResourceMetaData()).thenReturn(resourceMetaData);
133136
ReadwriteSplittingRule rule = mock(ReadwriteSplittingRule.class);
134137
when(rule.getConfiguration()).thenReturn(createCurrentRuleConfigurationWithMultipleRules());
135138
executor.setRule(rule);
136139
assertThrows(DuplicateReadwriteSplittingActualDataSourceException.class,
137-
() -> executor.checkBeforeUpdate(createSQLStatement("readwrite_ds_1", "write_ds_1", Arrays.asList("read_ds_0_0", "read_ds_0_1"), "TEST")));
140+
() -> executor.checkBeforeUpdate(createSQLStatement("readwrite_ds_1", "write_ds_1", Arrays.asList("read_ds_0_0", "read_ds_0_1"), "TEST", new Properties())));
141+
}
142+
143+
@Test
144+
void assertCheckSQLStatementWithInvalidLoadBalancerProperties() {
145+
ReadwriteSplittingRule rule = mock(ReadwriteSplittingRule.class);
146+
when(rule.getConfiguration()).thenReturn(createCurrentRuleConfiguration());
147+
executor.setRule(rule);
148+
assertThrows(InvalidAlgorithmConfigurationException.class,
149+
() -> executor.checkBeforeUpdate(createSQLStatement("readwrite_ds", "write_ds", Arrays.asList("read_ds_0", "read_ds_1"), "weight",
150+
PropertiesBuilder.build(new Property("read_ds_0", "5"), new Property("read_ds_2", "5")))));
138151
}
139152

140153
private AlterReadwriteSplittingRuleStatement createSQLStatement(final String loadBalancerTypeName) {
@@ -143,20 +156,21 @@ private AlterReadwriteSplittingRuleStatement createSQLStatement(final String loa
143156
return new AlterReadwriteSplittingRuleStatement(Collections.singleton(ruleSegment));
144157
}
145158

146-
private AlterReadwriteSplittingRuleStatement createSQLStatement(final String ruleName, final String writeDataSource, final Collection<String> readDataSources, final String loadBalancerName) {
147-
ReadwriteSplittingRuleSegment ruleSegment = new ReadwriteSplittingRuleSegment(ruleName, writeDataSource, readDataSources, new AlgorithmSegment(loadBalancerName, new Properties()));
159+
private AlterReadwriteSplittingRuleStatement createSQLStatement(final String ruleName, final String writeDataSource, final Collection<String> readDataSources,
160+
final String loadBalancerName, final Properties props) {
161+
ReadwriteSplittingRuleSegment ruleSegment = new ReadwriteSplittingRuleSegment(ruleName, writeDataSource, readDataSources, new AlgorithmSegment(loadBalancerName, props));
148162
return new AlterReadwriteSplittingRuleStatement(Collections.singleton(ruleSegment));
149163
}
150164

151-
private AlterReadwriteSplittingRuleStatement createSQLStatementWithDuplicateWriteResourceNames(final String ruleName0, final String ruleName1, final String loadBalancerName) {
165+
private AlterReadwriteSplittingRuleStatement createSQLStatementWithDuplicateWriteDataSources(final String ruleName0, final String ruleName1, final String loadBalancerName) {
152166
ReadwriteSplittingRuleSegment ruleSegment0 = new ReadwriteSplittingRuleSegment(ruleName0, "write_ds", Arrays.asList("read_ds_0", "read_ds_1"),
153167
new AlgorithmSegment(loadBalancerName, new Properties()));
154168
ReadwriteSplittingRuleSegment ruleSegment1 = new ReadwriteSplittingRuleSegment(ruleName1, "write_ds", Arrays.asList("read_ds_2", "read_ds_3"),
155169
new AlgorithmSegment(loadBalancerName, new Properties()));
156170
return new AlterReadwriteSplittingRuleStatement(Arrays.asList(ruleSegment0, ruleSegment1));
157171
}
158172

159-
private AlterReadwriteSplittingRuleStatement createSQLStatementWithDuplicateReadResourceNames(final String ruleName0, final String ruleName1, final String loadBalancerName) {
173+
private AlterReadwriteSplittingRuleStatement createSQLStatementWithDuplicateReadDataSources(final String ruleName0, final String ruleName1, final String loadBalancerName) {
160174
ReadwriteSplittingRuleSegment ruleSegment0 = new ReadwriteSplittingRuleSegment(ruleName0, "write_ds_0", Arrays.asList("read_ds_0", "read_ds_1"),
161175
new AlgorithmSegment(loadBalancerName, new Properties()));
162176
ReadwriteSplittingRuleSegment ruleSegment1 = new ReadwriteSplittingRuleSegment(ruleName1, "write_ds_1", Arrays.asList("read_ds_0", "read_ds_1"),

0 commit comments

Comments
 (0)