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

kimmking 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 f477603  Realize global lock for zookeeper (#8342)
f477603 is described below

commit f477603699a1ce7c5283f31721cb34a393ae8f3d
Author: Haoran Meng <[email protected]>
AuthorDate: Wed Nov 25 22:07:00 2020 +0800

    Realize global lock for zookeeper (#8342)
    
    * Realize global lock for zookeeper
    
    * Realize global lock for zookeeper
    
    * Realize global lock for zookeeper
---
 .../core/facade/fixture/TestAllRepository.java     | 14 ++++++
 .../facade/fixture/TestRegistryRepository.java     | 14 ++++++
 .../repository/api/RegistryRepository.java         | 23 ++++++++++
 .../governance/repository/etcd/EtcdRepository.java | 19 +++++++-
 .../zookeeper/CuratorZookeeperRepository.java      | 53 ++++++++++++++++++----
 .../zookeeper/CuratorZookeeperRepositoryTest.java  | 20 ++++++++
 .../governance/fixture/TestRegistryRepository.java | 14 ++++++
 .../registry/TestGovernanceRepository.java         | 14 ++++++
 .../registry/TestGovernanceRepository.java         | 14 ++++++
 .../proxy/fixture/FixtureRegistryRepository.java   | 14 ++++++
 .../core/fixture/FixtureRegistryRepository.java    | 14 ++++++
 11 files changed, 202 insertions(+), 11 deletions(-)

diff --git 
a/shardingsphere-governance/shardingsphere-governance-core/shardingsphere-governance-core-facade/src/test/java/org/apache/shardingsphere/governance/core/facade/fixture/TestAllRepository.java
 
b/shardingsphere-governance/shardingsphere-governance-core/shardingsphere-governance-core-facade/src/test/java/org/apache/shardingsphere/governance/core/facade/fixture/TestAllRepository.java
index 83a0894..9dc58e2 100644
--- 
a/shardingsphere-governance/shardingsphere-governance-core/shardingsphere-governance-core-facade/src/test/java/org/apache/shardingsphere/governance/core/facade/fixture/TestAllRepository.java
+++ 
b/shardingsphere-governance/shardingsphere-governance-core/shardingsphere-governance-core-facade/src/test/java/org/apache/shardingsphere/governance/core/facade/fixture/TestAllRepository.java
@@ -27,6 +27,7 @@ import 
org.apache.shardingsphere.governance.repository.api.listener.DataChangedE
 import java.util.Collections;
 import java.util.List;
 import java.util.Properties;
+import java.util.concurrent.TimeUnit;
 
 @Getter
 @Setter
@@ -57,6 +58,19 @@ public final class TestAllRepository implements 
RegistryRepository, Configuratio
     }
     
     @Override
+    public void initLock(final String key) {
+    }
+    
+    @Override
+    public boolean tryLock(final long time, final TimeUnit unit) {
+        return false;
+    }
+    
+    @Override
+    public void releaseLock() {
+    }
+    
+    @Override
     public void delete(final String key) {
     }
     
diff --git 
a/shardingsphere-governance/shardingsphere-governance-core/shardingsphere-governance-core-facade/src/test/java/org/apache/shardingsphere/governance/core/facade/fixture/TestRegistryRepository.java
 
b/shardingsphere-governance/shardingsphere-governance-core/shardingsphere-governance-core-facade/src/test/java/org/apache/shardingsphere/governance/core/facade/fixture/TestRegistryRepository.java
index 4e66e98..280cc4f 100644
--- 
a/shardingsphere-governance/shardingsphere-governance-core/shardingsphere-governance-core-facade/src/test/java/org/apache/shardingsphere/governance/core/facade/fixture/TestRegistryRepository.java
+++ 
b/shardingsphere-governance/shardingsphere-governance-core/shardingsphere-governance-core-facade/src/test/java/org/apache/shardingsphere/governance/core/facade/fixture/TestRegistryRepository.java
@@ -26,6 +26,7 @@ import 
org.apache.shardingsphere.governance.repository.api.listener.DataChangedE
 import java.util.Collections;
 import java.util.List;
 import java.util.Properties;
+import java.util.concurrent.TimeUnit;
 
 @Getter
 @Setter
@@ -56,6 +57,19 @@ public final class TestRegistryRepository implements 
RegistryRepository {
     }
     
     @Override
+    public void initLock(final String key) {
+    }
+    
+    @Override
+    public boolean tryLock(final long time, final TimeUnit unit) {
+        return false;
+    }
+    
+    @Override
+    public void releaseLock() {
+    }
+    
+    @Override
     public void delete(final String key) {
     }
     
diff --git 
a/shardingsphere-governance/shardingsphere-governance-repository/shardingsphere-governance-repository-api/src/main/java/org/apache/shardingsphere/governance/repository/api/RegistryRepository.java
 
b/shardingsphere-governance/shardingsphere-governance-repository/shardingsphere-governance-repository-api/src/main/java/org/apache/shardingsphere/governance/repository/api/RegistryRepository.java
index e0ae88c..99fbf4a 100644
--- 
a/shardingsphere-governance/shardingsphere-governance-repository/shardingsphere-governance-repository-api/src/main/java/org/apache/shardingsphere/governance/repository/api/RegistryRepository.java
+++ 
b/shardingsphere-governance/shardingsphere-governance-repository/shardingsphere-governance-repository-api/src/main/java/org/apache/shardingsphere/governance/repository/api/RegistryRepository.java
@@ -17,6 +17,8 @@
 
 package org.apache.shardingsphere.governance.repository.api;
 
+import java.util.concurrent.TimeUnit;
+
 /**
  * Registry repository.
  */
@@ -29,4 +31,25 @@ public interface RegistryRepository extends 
GovernanceRepository {
      * @param value value of data
      */
     void persistEphemeral(String key, String value);
+    
+    /**
+     * Initialize lock.
+     * 
+     * @param key the key for lock
+     */
+    void initLock(String key);
+    
+    /**
+     * Try to get lock.
+     * 
+     * @param time time to wait
+     * @param unit time unit
+     * @return true if get the lock, false if not
+     */
+    boolean tryLock(long time, TimeUnit unit);
+    
+    /**
+     * Release lock.
+     */
+    void releaseLock();
 }
diff --git 
a/shardingsphere-governance/shardingsphere-governance-repository/shardingsphere-governance-repository-provider/shardingsphere-governance-repository-etcd/src/main/java/org/apache/shardingsphere/governance/repository/etcd/EtcdRepository.java
 
b/shardingsphere-governance/shardingsphere-governance-repository/shardingsphere-governance-repository-provider/shardingsphere-governance-repository-etcd/src/main/java/org/apache/shardingsphere/governance/repository/etcd/EtcdRepository.java
index afbf1f1..8508265 100644
--- 
a/shardingsphere-governance/shardingsphere-governance-repository/shardingsphere-governance-repository-provider/shardingsphere-governance-repository-etcd/src/main/java/org/apache/shardingsphere/governance/repository/etcd/EtcdRepository.java
+++ 
b/shardingsphere-governance/shardingsphere-governance-repository/shardingsphere-governance-repository-provider/shardingsphere-governance-repository-etcd/src/main/java/org/apache/shardingsphere/governance/repository/etcd/EtcdRepository.java
@@ -17,7 +17,6 @@
 
 package org.apache.shardingsphere.governance.repository.etcd;
 
-import java.nio.charset.StandardCharsets;
 import com.google.common.base.Splitter;
 import io.etcd.jetcd.ByteSequence;
 import io.etcd.jetcd.Client;
@@ -38,9 +37,11 @@ import 
org.apache.shardingsphere.governance.repository.api.listener.DataChangedE
 import 
org.apache.shardingsphere.governance.repository.api.listener.DataChangedEvent.Type;
 import 
org.apache.shardingsphere.governance.repository.api.listener.DataChangedEventListener;
 
+import java.nio.charset.StandardCharsets;
 import java.util.List;
 import java.util.Properties;
 import java.util.concurrent.ExecutionException;
+import java.util.concurrent.TimeUnit;
 import java.util.stream.Collectors;
 
 /**
@@ -99,6 +100,22 @@ public final class EtcdRepository implements 
ConfigurationRepository, RegistryRe
     }
     
     @Override
+    public void initLock(final String key) {
+        // TODO
+    }
+    
+    @Override
+    public boolean tryLock(final long time, final TimeUnit unit) {
+        // TODO
+        return false;
+    }
+    
+    @Override
+    public void releaseLock() {
+        // TODO
+    }
+    
+    @Override
     public void delete(final String key) {
         client.getKVClient().delete(ByteSequence.from(key, 
StandardCharsets.UTF_8));
     }
diff --git 
a/shardingsphere-governance/shardingsphere-governance-repository/shardingsphere-governance-repository-provider/shardingsphere-governance-repository-zookeeper-curator/src/main/java/org/apache/shardingsphere/governance/repository/zookeeper/CuratorZookeeperRepository.java
 
b/shardingsphere-governance/shardingsphere-governance-repository/shardingsphere-governance-repository-provider/shardingsphere-governance-repository-zookeeper-curator/src/main/java/org/apache/shardingsphere/govern
 [...]
index 228fdb2..ab042d1 100644
--- 
a/shardingsphere-governance/shardingsphere-governance-repository/shardingsphere-governance-repository-provider/shardingsphere-governance-repository-zookeeper-curator/src/main/java/org/apache/shardingsphere/governance/repository/zookeeper/CuratorZookeeperRepository.java
+++ 
b/shardingsphere-governance/shardingsphere-governance-repository/shardingsphere-governance-repository-provider/shardingsphere-governance-repository-zookeeper-curator/src/main/java/org/apache/shardingsphere/governance/repository/zookeeper/CuratorZookeeperRepository.java
@@ -18,16 +18,6 @@
 package org.apache.shardingsphere.governance.repository.zookeeper;
 
 import com.google.common.base.Strings;
-import java.nio.charset.StandardCharsets;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Map.Entry;
-import java.util.Optional;
-import java.util.Properties;
-import java.util.concurrent.TimeUnit;
 import lombok.Getter;
 import lombok.Setter;
 import org.apache.curator.framework.CuratorFramework;
@@ -37,6 +27,8 @@ import 
org.apache.curator.framework.api.transaction.TransactionOp;
 import org.apache.curator.framework.recipes.cache.ChildData;
 import org.apache.curator.framework.recipes.cache.CuratorCache;
 import org.apache.curator.framework.recipes.cache.CuratorCacheListener;
+import org.apache.curator.framework.recipes.locks.InterProcessLock;
+import org.apache.curator.framework.recipes.locks.InterProcessMutex;
 import org.apache.curator.retry.ExponentialBackoffRetry;
 import org.apache.curator.utils.CloseableUtils;
 import 
org.apache.shardingsphere.governance.repository.api.ConfigurationRepository;
@@ -51,6 +43,17 @@ import 
org.apache.zookeeper.KeeperException.OperationTimeoutException;
 import org.apache.zookeeper.ZooDefs;
 import org.apache.zookeeper.data.ACL;
 
+import java.nio.charset.StandardCharsets;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.Optional;
+import java.util.Properties;
+import java.util.concurrent.TimeUnit;
+
 /**
  * Governance repository of ZooKeeper.
  */
@@ -60,6 +63,8 @@ public final class CuratorZookeeperRepository implements 
ConfigurationRepository
     
     private CuratorFramework client;
     
+    private InterProcessLock interProcessLock;
+    
     @Getter
     @Setter
     private Properties props = new Properties();
@@ -213,6 +218,34 @@ public final class CuratorZookeeperRepository implements 
ConfigurationRepository
     }
     
     @Override
+    public void initLock(final String key) {
+        interProcessLock = new InterProcessMutex(client, key);
+    }
+    
+    @Override
+    public boolean tryLock(final long time, final TimeUnit unit) {
+        try {
+            return interProcessLock.acquire(time, unit);
+            // CHECKSTYLE:OFF
+        } catch (final Exception e) {
+            // CHECKSTYLE:ON
+            CuratorZookeeperExceptionHandler.handleException(e);
+            return false;
+        }
+    }
+    
+    @Override
+    public void releaseLock() {
+        try {
+            interProcessLock.release();
+            // CHECKSTYLE:OFF
+        } catch (final Exception e) {
+            // CHECKSTYLE:ON
+            CuratorZookeeperExceptionHandler.handleException(e);
+        }
+    }
+    
+    @Override
     public void delete(final String key) {
         try {
             if (isExisted(key)) {
diff --git 
a/shardingsphere-governance/shardingsphere-governance-repository/shardingsphere-governance-repository-provider/shardingsphere-governance-repository-zookeeper-curator/src/test/java/org/apache/shardingsphere/governance/repository/zookeeper/CuratorZookeeperRepositoryTest.java
 
b/shardingsphere-governance/shardingsphere-governance-repository/shardingsphere-governance-repository-provider/shardingsphere-governance-repository-zookeeper-curator/src/test/java/org/apache/shardingsphere/go
 [...]
index f29c4d4..6b842cf 100644
--- 
a/shardingsphere-governance/shardingsphere-governance-repository/shardingsphere-governance-repository-provider/shardingsphere-governance-repository-zookeeper-curator/src/test/java/org/apache/shardingsphere/governance/repository/zookeeper/CuratorZookeeperRepositoryTest.java
+++ 
b/shardingsphere-governance/shardingsphere-governance-repository/shardingsphere-governance-repository-provider/shardingsphere-governance-repository-zookeeper-curator/src/test/java/org/apache/shardingsphere/governance/repository/zookeeper/CuratorZookeeperRepositoryTest.java
@@ -17,6 +17,7 @@
 
 package org.apache.shardingsphere.governance.repository.zookeeper;
 
+import lombok.SneakyThrows;
 import org.apache.curator.framework.CuratorFramework;
 import 
org.apache.shardingsphere.governance.repository.api.config.GovernanceCenterConfiguration;
 import 
org.apache.shardingsphere.governance.repository.api.exception.GovernanceException;
@@ -28,6 +29,8 @@ import org.junit.Test;
 import java.lang.reflect.Field;
 import java.util.List;
 import java.util.Properties;
+import java.util.concurrent.FutureTask;
+import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicReference;
 
 import static org.hamcrest.CoreMatchers.is;
@@ -48,6 +51,7 @@ public final class CuratorZookeeperRepositoryTest {
         EmbedTestingServer.start();
         serverLists = EmbedTestingServer.getTestingServerConnectionString();
         REPOSITORY.init("governance", new 
GovernanceCenterConfiguration(REPOSITORY.getType(), serverLists, new 
Properties()));
+        REPOSITORY.initLock("/glock");
     }
     
     @Test
@@ -246,4 +250,20 @@ public final class CuratorZookeeperRepositoryTest {
             assertTrue(ex instanceof GovernanceException);
         }
     }
+    
+    @Test
+    public void assertTryLock() {
+        assertThat(REPOSITORY.tryLock(5, TimeUnit.SECONDS), is(true));
+        REPOSITORY.releaseLock();
+    }
+    
+    @Test
+    @SneakyThrows
+    public void assertTryLockFailed() {
+        assertThat(REPOSITORY.tryLock(1, TimeUnit.SECONDS), is(true));
+        FutureTask<Boolean> task = new FutureTask(() -> REPOSITORY.tryLock(1, 
TimeUnit.SECONDS));
+        new Thread(task).start();
+        assertThat(task.get(), is(false));
+        REPOSITORY.releaseLock();
+    }
 }
diff --git 
a/shardingsphere-jdbc/shardingsphere-jdbc-governance/src/test/java/org/apache/shardingsphere/driver/governance/fixture/TestRegistryRepository.java
 
b/shardingsphere-jdbc/shardingsphere-jdbc-governance/src/test/java/org/apache/shardingsphere/driver/governance/fixture/TestRegistryRepository.java
index b58ad06..3fb38b1 100644
--- 
a/shardingsphere-jdbc/shardingsphere-jdbc-governance/src/test/java/org/apache/shardingsphere/driver/governance/fixture/TestRegistryRepository.java
+++ 
b/shardingsphere-jdbc/shardingsphere-jdbc-governance/src/test/java/org/apache/shardingsphere/driver/governance/fixture/TestRegistryRepository.java
@@ -29,6 +29,7 @@ import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Properties;
+import java.util.concurrent.TimeUnit;
 
 @Getter
 @Setter
@@ -63,6 +64,19 @@ public final class TestRegistryRepository implements 
RegistryRepository, Configu
     }
     
     @Override
+    public void initLock(final String key) {
+    }
+    
+    @Override
+    public boolean tryLock(final long time, final TimeUnit unit) {
+        return false;
+    }
+    
+    @Override
+    public void releaseLock() {
+    }
+    
+    @Override
     public void delete(final String key) {
     }
     
diff --git 
a/shardingsphere-jdbc/shardingsphere-jdbc-spring/shardingsphere-jdbc-governance-spring/shardingsphere-jdbc-governance-spring-boot-starter/src/test/java/org/apache/shardingsphere/spring/boot/governance/registry/TestGovernanceRepository.java
 
b/shardingsphere-jdbc/shardingsphere-jdbc-spring/shardingsphere-jdbc-governance-spring/shardingsphere-jdbc-governance-spring-boot-starter/src/test/java/org/apache/shardingsphere/spring/boot/governance/registry/TestGovernanceRepository.java
index 0094220..126154f 100644
--- 
a/shardingsphere-jdbc/shardingsphere-jdbc-spring/shardingsphere-jdbc-governance-spring/shardingsphere-jdbc-governance-spring-boot-starter/src/test/java/org/apache/shardingsphere/spring/boot/governance/registry/TestGovernanceRepository.java
+++ 
b/shardingsphere-jdbc/shardingsphere-jdbc-spring/shardingsphere-jdbc-governance-spring/shardingsphere-jdbc-governance-spring-boot-starter/src/test/java/org/apache/shardingsphere/spring/boot/governance/registry/TestGovernanceRepository.java
@@ -29,6 +29,7 @@ import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Properties;
+import java.util.concurrent.TimeUnit;
 
 @Getter
 @Setter
@@ -63,6 +64,19 @@ public final class TestGovernanceRepository implements 
RegistryRepository, Confi
     }
     
     @Override
+    public void initLock(final String key) {
+    }
+    
+    @Override
+    public boolean tryLock(final long time, final TimeUnit unit) {
+        return false;
+    }
+    
+    @Override
+    public void releaseLock() {
+    }
+    
+    @Override
     public void delete(final String key) {
     }
     
diff --git 
a/shardingsphere-jdbc/shardingsphere-jdbc-spring/shardingsphere-jdbc-governance-spring/shardingsphere-jdbc-governance-spring-namespace/src/test/java/org/apache/shardingsphere/spring/namespace/governance/registry/TestGovernanceRepository.java
 
b/shardingsphere-jdbc/shardingsphere-jdbc-spring/shardingsphere-jdbc-governance-spring/shardingsphere-jdbc-governance-spring-namespace/src/test/java/org/apache/shardingsphere/spring/namespace/governance/registry/TestGovernanceRepository.java
index 1a0747e..564a4f1 100644
--- 
a/shardingsphere-jdbc/shardingsphere-jdbc-spring/shardingsphere-jdbc-governance-spring/shardingsphere-jdbc-governance-spring-namespace/src/test/java/org/apache/shardingsphere/spring/namespace/governance/registry/TestGovernanceRepository.java
+++ 
b/shardingsphere-jdbc/shardingsphere-jdbc-spring/shardingsphere-jdbc-governance-spring/shardingsphere-jdbc-governance-spring-namespace/src/test/java/org/apache/shardingsphere/spring/namespace/governance/registry/TestGovernanceRepository.java
@@ -27,6 +27,7 @@ import 
org.apache.shardingsphere.governance.repository.api.listener.DataChangedE
 import java.util.Collections;
 import java.util.List;
 import java.util.Properties;
+import java.util.concurrent.TimeUnit;
 
 @Getter
 @Setter
@@ -57,6 +58,19 @@ public final class TestGovernanceRepository implements 
RegistryRepository, Confi
     }
     
     @Override
+    public void initLock(final String key) {
+    }
+    
+    @Override
+    public boolean tryLock(final long time, final TimeUnit unit) {
+        return false;
+    }
+    
+    @Override
+    public void releaseLock() {
+    }
+    
+    @Override
     public void delete(final String key) {
     }
     
diff --git 
a/shardingsphere-proxy/shardingsphere-proxy-bootstrap/src/test/java/org/apache/shardingsphere/proxy/fixture/FixtureRegistryRepository.java
 
b/shardingsphere-proxy/shardingsphere-proxy-bootstrap/src/test/java/org/apache/shardingsphere/proxy/fixture/FixtureRegistryRepository.java
index 2f95d7b..b632cda 100644
--- 
a/shardingsphere-proxy/shardingsphere-proxy-bootstrap/src/test/java/org/apache/shardingsphere/proxy/fixture/FixtureRegistryRepository.java
+++ 
b/shardingsphere-proxy/shardingsphere-proxy-bootstrap/src/test/java/org/apache/shardingsphere/proxy/fixture/FixtureRegistryRepository.java
@@ -29,6 +29,7 @@ import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Properties;
+import java.util.concurrent.TimeUnit;
 
 @Getter
 @Setter
@@ -63,6 +64,19 @@ public final class FixtureRegistryRepository implements 
RegistryRepository, Conf
     }
     
     @Override
+    public void initLock(final String key) {
+    }
+    
+    @Override
+    public boolean tryLock(final long time, final TimeUnit unit) {
+        return false;
+    }
+    
+    @Override
+    public void releaseLock() {
+    }
+    
+    @Override
     public void delete(final String key) {
     }
     
diff --git 
a/shardingsphere-scaling/shardingsphere-scaling-core/src/test/java/org/apache/shardingsphere/scaling/core/fixture/FixtureRegistryRepository.java
 
b/shardingsphere-scaling/shardingsphere-scaling-core/src/test/java/org/apache/shardingsphere/scaling/core/fixture/FixtureRegistryRepository.java
index 22a5da1..e583e85 100644
--- 
a/shardingsphere-scaling/shardingsphere-scaling-core/src/test/java/org/apache/shardingsphere/scaling/core/fixture/FixtureRegistryRepository.java
+++ 
b/shardingsphere-scaling/shardingsphere-scaling-core/src/test/java/org/apache/shardingsphere/scaling/core/fixture/FixtureRegistryRepository.java
@@ -30,6 +30,7 @@ import java.util.Collections;
 import java.util.List;
 import java.util.Map;
 import java.util.Properties;
+import java.util.concurrent.TimeUnit;
 
 @Getter
 @Setter
@@ -89,6 +90,19 @@ public final class FixtureRegistryRepository implements 
RegistryRepository, Conf
     }
     
     @Override
+    public void initLock(final String key) {
+    }
+    
+    @Override
+    public boolean tryLock(final long time, final TimeUnit unit) {
+        return false;
+    }
+    
+    @Override
+    public void releaseLock() {
+    }
+    
+    @Override
     public void delete(final String key) {
     }
     

Reply via email to