This is an automated email from the ASF dual-hosted git repository.

zhangliang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/shardingsphere.git


The following commit(s) were added to refs/heads/master by this push:
     new fc56fcd  Check encryptor & loadBalancer not in use before drop it 
(#11280)
fc56fcd is described below

commit fc56fcda8d10e4e4e8553fd8a2f784e6b1ec006b
Author: Haoran Meng <[email protected]>
AuthorDate: Mon Jul 12 18:16:59 2021 +0800

    Check encryptor & loadBalancer not in use before drop it (#11280)
---
 .../update/DropEncryptRuleStatementUpdater.java    | 14 ++++++++++--
 .../DropEncryptRuleStatementUpdaterTest.java       | 26 ++++++++++++++++++++--
 ...DropReadwriteSplittingRuleStatementUpdater.java |  8 ++++++-
 ...ReadwriteSplittingRuleStatementUpdaterTest.java | 25 +++++++++++++++++++--
 4 files changed, 66 insertions(+), 7 deletions(-)

diff --git 
a/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-distsql/shardingsphere-encrypt-distsql-handler/src/main/java/org/apache/shardingsphere/encrypt/distsql/handler/update/DropEncryptRuleStatementUpdater.java
 
b/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-distsql/shardingsphere-encrypt-distsql-handler/src/main/java/org/apache/shardingsphere/encrypt/distsql/handler/update/DropEncryptRuleStatementUpdater.java
index c371ebf..919439c 100644
--- 
a/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-distsql/shardingsphere-encrypt-distsql-handler/src/main/java/org/apache/shardingsphere/encrypt/distsql/handler/update/DropEncryptRuleStatementUpdater.java
+++ 
b/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-distsql/shardingsphere-encrypt-distsql-handler/src/main/java/org/apache/shardingsphere/encrypt/distsql/handler/update/DropEncryptRuleStatementUpdater.java
@@ -21,9 +21,9 @@ import com.google.common.base.Preconditions;
 import org.apache.shardingsphere.encrypt.api.config.EncryptRuleConfiguration;
 import 
org.apache.shardingsphere.encrypt.api.config.rule.EncryptTableRuleConfiguration;
 import 
org.apache.shardingsphere.encrypt.distsql.parser.statement.DropEncryptRuleStatement;
-import 
org.apache.shardingsphere.infra.distsql.update.RuleDefinitionDropUpdater;
 import 
org.apache.shardingsphere.infra.distsql.exception.rule.RequiredRuleMissedException;
 import 
org.apache.shardingsphere.infra.distsql.exception.rule.RuleDefinitionViolationException;
+import 
org.apache.shardingsphere.infra.distsql.update.RuleDefinitionDropUpdater;
 import 
org.apache.shardingsphere.infra.metadata.resource.ShardingSphereResource;
 
 import java.util.Collection;
@@ -69,7 +69,17 @@ public final class DropEncryptRuleStatementUpdater 
implements RuleDefinitionDrop
         Optional<EncryptTableRuleConfiguration> encryptTableRuleConfig = 
currentRuleConfig.getTables().stream().filter(tableRule -> 
tableRule.getName().equals(ruleName)).findAny();
         Preconditions.checkState(encryptTableRuleConfig.isPresent());
         currentRuleConfig.getTables().remove(encryptTableRuleConfig.get());
-        encryptTableRuleConfig.get().getColumns().forEach(column -> 
currentRuleConfig.getEncryptors().remove(column.getEncryptorName()));
+        encryptTableRuleConfig.get().getColumns().stream().filter(column -> 
!isEncryptorInUse(currentRuleConfig, column.getEncryptorName()))
+                .forEach(column -> 
currentRuleConfig.getEncryptors().remove(column.getEncryptorName()));
+    }
+    
+    private boolean isEncryptorInUse(final EncryptRuleConfiguration 
currentRuleConfig, final String toBeDroppedEncryptorName) {
+        for (EncryptTableRuleConfiguration encryptTableRuleConfiguration : 
currentRuleConfig.getTables()) {
+            if 
(encryptTableRuleConfiguration.getColumns().stream().filter(column -> 
column.getEncryptorName().equals(toBeDroppedEncryptorName)).findAny().isPresent())
 {
+                return true;
+            }
+        }
+        return false;
     }
     
     @Override
diff --git 
a/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-distsql/shardingsphere-encrypt-distsql-handler/src/test/java/org/apache/shardingsphere/encrypt/distsql/handler/update/DropEncryptRuleStatementUpdaterTest.java
 
b/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-distsql/shardingsphere-encrypt-distsql-handler/src/test/java/org/apache/shardingsphere/encrypt/distsql/handler/update/DropEncryptRuleStatementUpdaterTest.java
index 35a2fc1..78ca07e 100644
--- 
a/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-distsql/shardingsphere-encrypt-distsql-handler/src/test/java/org/apache/shardingsphere/encrypt/distsql/handler/update/DropEncryptRuleStatementUpdaterTest.java
+++ 
b/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-distsql/shardingsphere-encrypt-distsql-handler/src/test/java/org/apache/shardingsphere/encrypt/distsql/handler/update/DropEncryptRuleStatementUpdaterTest.java
@@ -27,12 +27,17 @@ import 
org.apache.shardingsphere.infra.distsql.exception.rule.RuleDefinitionViol
 import 
org.apache.shardingsphere.infra.metadata.resource.ShardingSphereResource;
 import org.junit.Test;
 
+import java.util.Arrays;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.LinkedList;
 import java.util.Map;
 import java.util.Properties;
 
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertThat;
+import static org.junit.Assert.assertTrue;
+import static org.hamcrest.CoreMatchers.is;
 import static org.mockito.Mockito.mock;
 
 public final class DropEncryptRuleStatementUpdaterTest {
@@ -51,8 +56,16 @@ public final class DropEncryptRuleStatementUpdaterTest {
     
     @Test
     public void assertUpdateCurrentRuleConfiguration() {
-        updater.updateCurrentRuleConfiguration(createSQLStatement(), 
createCurrentRuleConfiguration());
-        // TODO assert current rule configuration
+        EncryptRuleConfiguration encryptRuleConfiguration = 
createCurrentRuleConfiguration();
+        
assertTrue(updater.updateCurrentRuleConfiguration(createSQLStatement(), 
encryptRuleConfiguration));
+        assertTrue(encryptRuleConfiguration.getEncryptors().isEmpty());
+    }
+    
+    @Test
+    public void assertUpdateCurrentRuleConfigurationWithInUsedEncryptor() {
+        EncryptRuleConfiguration encryptRuleConfiguration = 
createCurrentRuleConfigurationWithMultipleTableRules();
+        
assertFalse(updater.updateCurrentRuleConfiguration(createSQLStatement(), 
encryptRuleConfiguration));
+        assertThat(encryptRuleConfiguration.getEncryptors().size(), is(1));
     }
     
     private DropEncryptRuleStatement createSQLStatement() {
@@ -66,4 +79,13 @@ public final class DropEncryptRuleStatementUpdaterTest {
         encryptors.put("t_encrypt_user_id_MD5", new 
ShardingSphereAlgorithmConfiguration("TEST", new Properties()));
         return new EncryptRuleConfiguration(new 
LinkedList<>(Collections.singleton(tableRuleConfig)), encryptors, true);
     }
+    
+    private EncryptRuleConfiguration 
createCurrentRuleConfigurationWithMultipleTableRules() {
+        EncryptColumnRuleConfiguration columnRuleConfig = new 
EncryptColumnRuleConfiguration("user_id", "user_cipher", "", "user_plain", 
"t_encrypt_user_id_MD5");
+        EncryptTableRuleConfiguration tableRuleConfig = new 
EncryptTableRuleConfiguration("t_encrypt", 
Collections.singleton(columnRuleConfig));
+        Map<String, ShardingSphereAlgorithmConfiguration> encryptors = new 
HashMap<>(1, 1);
+        encryptors.put("t_encrypt_user_id_MD5", new 
ShardingSphereAlgorithmConfiguration("TEST", new Properties()));
+        return new EncryptRuleConfiguration(new 
LinkedList<>(Arrays.asList(tableRuleConfig, 
+                new EncryptTableRuleConfiguration("t_encrypt_another", 
Collections.singleton(columnRuleConfig)))), encryptors, true);
+    }
 }
diff --git 
a/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-distsql/shardingsphere-readwrite-splitting-distsql-handler/src/main/java/org/apache/shardingsphere/readwritesplitting/distsql/handler/update/DropReadwriteSplittingRuleStatementUpdater.java
 
b/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-distsql/shardingsphere-readwrite-splitting-distsql-handler/src/main/java/org/apache/shardingsphere/re
 [...]
index 3cc40e3..045a392 100644
--- 
a/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-distsql/shardingsphere-readwrite-splitting-distsql-handler/src/main/java/org/apache/shardingsphere/readwritesplitting/distsql/handler/update/DropReadwriteSplittingRuleStatementUpdater.java
+++ 
b/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-distsql/shardingsphere-readwrite-splitting-distsql-handler/src/main/java/org/apache/shardingsphere/readwritesplitting/distsql/handler/update/DropReadwriteSplittingRuleStatementUpdater.java
@@ -70,7 +70,13 @@ public final class 
DropReadwriteSplittingRuleStatementUpdater implements RuleDef
                 = 
currentRuleConfig.getDataSources().stream().filter(dataSource -> 
ruleName.equals(dataSource.getName())).findAny();
         Preconditions.checkState(dataSourceRuleConfig.isPresent());
         currentRuleConfig.getDataSources().remove(dataSourceRuleConfig.get());
-        
currentRuleConfig.getLoadBalancers().remove(dataSourceRuleConfig.get().getLoadBalancerName());
+        if (isLoadBalancerNotInUse(currentRuleConfig, 
dataSourceRuleConfig.get().getLoadBalancerName())) {
+            
currentRuleConfig.getLoadBalancers().remove(dataSourceRuleConfig.get().getLoadBalancerName());
+        }
+    }
+    
+    private boolean isLoadBalancerNotInUse(final 
ReadwriteSplittingRuleConfiguration currentRuleConfig, final String 
toBeDroppedLoadBalancerName) {
+        return !currentRuleConfig.getDataSources().stream().filter(each -> 
each.getLoadBalancerName().equals(toBeDroppedLoadBalancerName)).findAny().isPresent();
     }
     
     @Override
diff --git 
a/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-distsql/shardingsphere-readwrite-splitting-distsql-handler/src/test/java/org/apache/shardingsphere/readwritesplitting/distsql/handler/update/DropReadwriteSplittingRuleStatementUpdaterTest.java
 
b/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-distsql/shardingsphere-readwrite-splitting-distsql-handler/src/test/java/org/apache/shardingspher
 [...]
index 20b6af1..e40aa21 100644
--- 
a/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-distsql/shardingsphere-readwrite-splitting-distsql-handler/src/test/java/org/apache/shardingsphere/readwritesplitting/distsql/handler/update/DropReadwriteSplittingRuleStatementUpdaterTest.java
+++ 
b/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-distsql/shardingsphere-readwrite-splitting-distsql-handler/src/test/java/org/apache/shardingsphere/readwritesplitting/distsql/handler/update/DropReadwriteSplittingRuleStatementUpdaterTest.java
@@ -26,12 +26,17 @@ import 
org.apache.shardingsphere.readwritesplitting.api.rule.ReadwriteSplittingD
 import 
org.apache.shardingsphere.readwritesplitting.distsql.parser.statement.DropReadwriteSplittingRuleStatement;
 import org.junit.Test;
 
+import java.util.Arrays;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.LinkedList;
 import java.util.Map;
 import java.util.Properties;
 
+import static org.hamcrest.CoreMatchers.is;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertThat;
+import static org.junit.Assert.assertTrue;
 import static org.mockito.Mockito.mock;
 
 public final class DropReadwriteSplittingRuleStatementUpdaterTest {
@@ -50,8 +55,16 @@ public final class 
DropReadwriteSplittingRuleStatementUpdaterTest {
     
     @Test
     public void assertUpdateCurrentRuleConfiguration() {
-        updater.updateCurrentRuleConfiguration(createSQLStatement(), 
createCurrentRuleConfiguration());
-        // TODO assert current rule configuration
+        ReadwriteSplittingRuleConfiguration 
readwriteSplittingRuleConfiguration = createCurrentRuleConfiguration();
+        
assertTrue(updater.updateCurrentRuleConfiguration(createSQLStatement(), 
readwriteSplittingRuleConfiguration));
+        
assertThat(readwriteSplittingRuleConfiguration.getLoadBalancers().size(), 
is(1));
+    }
+    
+    @Test
+    public void assertUpdateCurrentRuleConfigurationWithInUsedLoadBalancer() {
+        ReadwriteSplittingRuleConfiguration 
readwriteSplittingRuleConfiguration = createMultipleCurrentRuleConfigurations();
+        
assertFalse(updater.updateCurrentRuleConfiguration(createSQLStatement(), 
readwriteSplittingRuleConfiguration));
+        
assertThat(readwriteSplittingRuleConfiguration.getLoadBalancers().size(), 
is(1));
     }
     
     private DropReadwriteSplittingRuleStatement createSQLStatement() {
@@ -64,4 +77,12 @@ public final class 
DropReadwriteSplittingRuleStatementUpdaterTest {
         ReadwriteSplittingDataSourceRuleConfiguration dataSourceRuleConfig = 
new ReadwriteSplittingDataSourceRuleConfiguration("readwrite_ds", null, null, 
null, "TEST");
         return new ReadwriteSplittingRuleConfiguration(new 
LinkedList<>(Collections.singleton(dataSourceRuleConfig)), loadBalancers);
     }
+    
+    private ReadwriteSplittingRuleConfiguration 
createMultipleCurrentRuleConfigurations() {
+        Map<String, ShardingSphereAlgorithmConfiguration> loadBalancers = new 
HashMap<>(1, 1);
+        loadBalancers.put("readwrite_ds", new 
ShardingSphereAlgorithmConfiguration("TEST", new Properties()));
+        ReadwriteSplittingDataSourceRuleConfiguration dataSourceRuleConfig = 
new ReadwriteSplittingDataSourceRuleConfiguration("readwrite_ds", null, null, 
null, "TEST");
+        return new ReadwriteSplittingRuleConfiguration(new 
LinkedList<>(Arrays.asList(dataSourceRuleConfig, 
+                new 
ReadwriteSplittingDataSourceRuleConfiguration("readwrite_ds_another", null, 
null, null, "TEST"))), loadBalancers);
+    }
 }

Reply via email to