You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@shardingsphere.apache.org by pa...@apache.org on 2021/01/22 04:37:01 UTC

[shardingsphere] branch master updated: Refactor governance lock api (#9125)

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

panjuan 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 3183934  Refactor governance lock api (#9125)
3183934 is described below

commit 3183934d84177dabccbc649936115a1c16b082ac
Author: Haoran Meng <me...@gmail.com>
AuthorDate: Fri Jan 22 12:36:19 2021 +0800

    Refactor governance lock api (#9125)
---
 .../governance/core/registry/RegistryCenter.java   |  5 ++-
 .../core/facade/fixture/TestAllRepository.java     |  9 ++----
 .../facade/fixture/TestRegistryRepository.java     |  8 ++---
 .../core/registry/RegistryCenterTest.java          |  6 ++--
 .../repository/api/RegistryRepository.java         | 16 ++++------
 .../governance/repository/etcd/EtcdRepository.java |  9 ++----
 .../zookeeper/CuratorZookeeperRepository.java      | 37 ++++++++++++++--------
 .../zookeeper/CuratorZookeeperRepositoryTest.java  | 11 +++----
 .../governance/fixture/TestRegistryRepository.java |  8 ++---
 .../registry/TestGovernanceRepository.java         |  8 ++---
 .../registry/TestGovernanceRepository.java         |  9 ++----
 .../proxy/fixture/FixtureRegistryRepository.java   |  8 ++---
 .../core/fixture/FixtureRegistryRepository.java    |  8 ++---
 13 files changed, 58 insertions(+), 84 deletions(-)

diff --git a/shardingsphere-governance/shardingsphere-governance-core/src/main/java/org/apache/shardingsphere/governance/core/registry/RegistryCenter.java b/shardingsphere-governance/shardingsphere-governance-core/src/main/java/org/apache/shardingsphere/governance/core/registry/RegistryCenter.java
index 0e892bf..173d24f 100644
--- a/shardingsphere-governance/shardingsphere-governance-core/src/main/java/org/apache/shardingsphere/governance/core/registry/RegistryCenter.java
+++ b/shardingsphere-governance/shardingsphere-governance-core/src/main/java/org/apache/shardingsphere/governance/core/registry/RegistryCenter.java
@@ -52,7 +52,6 @@ public final class RegistryCenter {
         repository = registryRepository;
         instance = GovernanceInstance.getInstance();
         lockNode = new LockNode();
-        registryRepository.initLock(lockNode.getGlobalLockNodePath());
         ShardingSphereEventBus.getInstance().register(this);
     }
     
@@ -162,14 +161,14 @@ public final class RegistryCenter {
      * @return true if get the lock, false if not
      */
     public boolean tryGlobalLock(final long timeout, final TimeUnit timeUnit) {
-        return repository.tryLock(timeout, timeUnit) && checkLock();
+        return repository.tryLock(lockNode.getGlobalLockNodePath(), timeout, timeUnit) && checkLock();
     }
     
     /**
      * Release global lock.
      */
     public void releaseGlobalLock() {
-        repository.releaseLock();
+        repository.releaseLock(lockNode.getGlobalLockNodePath());
         repository.delete(lockNode.getGlobalLockNodePath());
     }
     
diff --git a/shardingsphere-governance/shardingsphere-governance-core/src/test/java/org/apache/shardingsphere/governance/core/facade/fixture/TestAllRepository.java b/shardingsphere-governance/shardingsphere-governance-core/src/test/java/org/apache/shardingsphere/governance/core/facade/fixture/TestAllRepository.java
index d22c3bb..9480bc8 100644
--- a/shardingsphere-governance/shardingsphere-governance-core/src/test/java/org/apache/shardingsphere/governance/core/facade/fixture/TestAllRepository.java
+++ b/shardingsphere-governance/shardingsphere-governance-core/src/test/java/org/apache/shardingsphere/governance/core/facade/fixture/TestAllRepository.java
@@ -51,16 +51,13 @@ public final class TestAllRepository implements RegistryRepository, Configuratio
     }
     
     @Override
-    public void initLock(final String key) {
-    }
-    
-    @Override
-    public boolean tryLock(final long time, final TimeUnit unit) {
+    public boolean tryLock(final String key, final long time, final TimeUnit unit) {
         return false;
     }
     
     @Override
-    public void releaseLock() {
+    public void releaseLock(final String key) {
+        
     }
     
     @Override
diff --git a/shardingsphere-governance/shardingsphere-governance-core/src/test/java/org/apache/shardingsphere/governance/core/facade/fixture/TestRegistryRepository.java b/shardingsphere-governance/shardingsphere-governance-core/src/test/java/org/apache/shardingsphere/governance/core/facade/fixture/TestRegistryRepository.java
index 5a06f5b..f903eb7 100644
--- a/shardingsphere-governance/shardingsphere-governance-core/src/test/java/org/apache/shardingsphere/governance/core/facade/fixture/TestRegistryRepository.java
+++ b/shardingsphere-governance/shardingsphere-governance-core/src/test/java/org/apache/shardingsphere/governance/core/facade/fixture/TestRegistryRepository.java
@@ -50,16 +50,12 @@ public final class TestRegistryRepository implements RegistryRepository {
     }
     
     @Override
-    public void initLock(final String key) {
-    }
-    
-    @Override
-    public boolean tryLock(final long time, final TimeUnit unit) {
+    public boolean tryLock(final String key, final long time, final TimeUnit unit) {
         return false;
     }
     
     @Override
-    public void releaseLock() {
+    public void releaseLock(final String key) {
     }
     
     @Override
diff --git a/shardingsphere-governance/shardingsphere-governance-core/src/test/java/org/apache/shardingsphere/governance/core/registry/RegistryCenterTest.java b/shardingsphere-governance/shardingsphere-governance-core/src/test/java/org/apache/shardingsphere/governance/core/registry/RegistryCenterTest.java
index ae9b92f..9bb1714 100644
--- a/shardingsphere-governance/shardingsphere-governance-core/src/test/java/org/apache/shardingsphere/governance/core/registry/RegistryCenterTest.java
+++ b/shardingsphere-governance/shardingsphere-governance-core/src/test/java/org/apache/shardingsphere/governance/core/registry/RegistryCenterTest.java
@@ -17,6 +17,7 @@
 
 package org.apache.shardingsphere.governance.core.registry;
 
+import org.apache.shardingsphere.governance.core.lock.node.LockNode;
 import org.apache.shardingsphere.governance.repository.api.RegistryRepository;
 import org.junit.Before;
 import org.junit.Test;
@@ -86,12 +87,13 @@ public final class RegistryCenterTest {
     @Test
     public void assertTryGlobalLock() {
         registryCenter.tryGlobalLock(50L, TimeUnit.MILLISECONDS);
-        verify(registryRepository).tryLock(eq(50L), eq(TimeUnit.MILLISECONDS));
+        verify(registryRepository).tryLock(eq(new LockNode().getGlobalLockNodePath()), eq(50L), eq(TimeUnit.MILLISECONDS));
     }
     
     @Test
     public void assertReleaseGlobalLock() {
         registryCenter.releaseGlobalLock();
-        verify(registryRepository).releaseLock();
+        verify(registryRepository).releaseLock(eq(new LockNode().getGlobalLockNodePath()));
+        verify(registryRepository).delete(eq(new LockNode().getGlobalLockNodePath()));
     }
 }
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 99fbf4a..dd49657 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
@@ -33,23 +33,19 @@ public interface RegistryRepository extends GovernanceRepository {
     void persistEphemeral(String key, String value);
     
     /**
-     * Initialize lock.
-     * 
-     * @param key the key for lock
-     */
-    void initLock(String key);
-    
-    /**
-     * Try to get lock.
+     * Try to get lock under the lock key.
      * 
+     * @param key lock key
      * @param time time to wait
      * @param unit time unit
      * @return true if get the lock, false if not
      */
-    boolean tryLock(long time, TimeUnit unit);
+    boolean tryLock(String key, long time, TimeUnit unit);
     
     /**
      * Release lock.
+     * 
+     * @param key lock key
      */
-    void releaseLock();
+    void releaseLock(String key);
 }
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 ce31f32..0cbe3d0 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
@@ -100,18 +100,13 @@ 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) {
+    public boolean tryLock(final String key, final long time, final TimeUnit unit) {
         // TODO
         return false;
     }
     
     @Override
-    public void releaseLock() {
+    public void releaseLock(final String key) {
         // TODO
     }
     
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 0bdce67..364a741 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
@@ -47,13 +47,13 @@ import java.nio.charset.StandardCharsets;
 import java.util.Collections;
 import java.util.Comparator;
 import java.util.HashMap;
-import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Map.Entry;
+import java.util.Objects;
 import java.util.Optional;
 import java.util.Properties;
-import java.util.Set;
+import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.TimeUnit;
 
 /**
@@ -63,11 +63,9 @@ public final class CuratorZookeeperRepository implements ConfigurationRepository
     
     private final Map<String, CuratorCache> caches = new HashMap<>();
     
-    private final Set<String> watchedKeys = new HashSet<>();
-    
     private CuratorFramework client;
     
-    private InterProcessLock lock;
+    private final Map<String, InterProcessLock> locks = new ConcurrentHashMap<>();
     
     @Getter
     @Setter
@@ -277,14 +275,9 @@ public final class CuratorZookeeperRepository implements ConfigurationRepository
     }
     
     @Override
-    public void initLock(final String key) {
-        lock = new InterProcessMutex(client, key);
-    }
-    
-    @Override
-    public boolean tryLock(final long time, final TimeUnit unit) {
+    public boolean tryLock(final String key, final long time, final TimeUnit unit) {
         try {
-            return lock.acquire(time, unit);
+            return getLock(key).acquire(time, unit);
             // CHECKSTYLE:OFF
         } catch (final Exception ex) {
             // CHECKSTYLE:ON
@@ -294,9 +287,12 @@ public final class CuratorZookeeperRepository implements ConfigurationRepository
     }
     
     @Override
-    public void releaseLock() {
+    public void releaseLock(final String key) {
         try {
-            lock.release();
+            if (availableLock(key)) {
+                locks.get(key).release();
+                locks.remove(key);
+            }
             // CHECKSTYLE:OFF
         } catch (final Exception ex) {
             // CHECKSTYLE:ON
@@ -304,6 +300,19 @@ public final class CuratorZookeeperRepository implements ConfigurationRepository
         }
     }
     
+    private InterProcessLock getLock(final String key) {
+        if (availableLock(key)) {
+            return locks.get(key);
+        }
+        InterProcessLock lock = new InterProcessMutex(client, key);
+        locks.put(key, lock);
+        return lock;
+    }
+    
+    private boolean availableLock(final String key) {
+        return Objects.nonNull(locks.get(key));
+    }
+    
     @Override
     public void close() {
         caches.values().forEach(CuratorCache::close);
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 23495ec..e755ff3 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
@@ -74,7 +74,6 @@ public final class CuratorZookeeperRepositoryTest {
         EmbedTestingServer.start();
         serverLists = EmbedTestingServer.getTestingServerConnectionString();
         REPOSITORY.init("governance", new GovernanceCenterConfiguration(REPOSITORY.getType(), serverLists, new Properties()));
-        REPOSITORY.initLock("/glock");
     }
     
     @Test
@@ -289,17 +288,17 @@ public final class CuratorZookeeperRepositoryTest {
     
     @Test
     public void assertTryLock() {
-        assertThat(REPOSITORY.tryLock(5, TimeUnit.SECONDS), is(true));
-        REPOSITORY.releaseLock();
+        assertThat(REPOSITORY.tryLock("/lock/glock", 5, TimeUnit.SECONDS), is(true));
+        REPOSITORY.releaseLock("/lock/glock");
     }
     
     @Test
     @SneakyThrows
     public void assertTryLockFailed() {
-        assertThat(REPOSITORY.tryLock(1, TimeUnit.SECONDS), is(true));
-        FutureTask<Boolean> task = new FutureTask(() -> REPOSITORY.tryLock(1, TimeUnit.SECONDS));
+        assertThat(REPOSITORY.tryLock("/lock/glock", 1, TimeUnit.SECONDS), is(true));
+        FutureTask<Boolean> task = new FutureTask(() -> REPOSITORY.tryLock("/lock/glock", 1, TimeUnit.SECONDS));
         new Thread(task).start();
         assertThat(task.get(), is(false));
-        REPOSITORY.releaseLock();
+        REPOSITORY.releaseLock("/lock/glock");
     }
 }
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 c7ed68e..3525dea 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
@@ -57,16 +57,12 @@ public final class TestRegistryRepository implements RegistryRepository, Configu
     }
     
     @Override
-    public void initLock(final String key) {
-    }
-    
-    @Override
-    public boolean tryLock(final long time, final TimeUnit unit) {
+    public boolean tryLock(final String key, final long time, final TimeUnit unit) {
         return false;
     }
     
     @Override
-    public void releaseLock() {
+    public void releaseLock(final String key) {
     }
     
     @Override
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 f175bd7..9e3442d 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
@@ -57,16 +57,12 @@ public final class TestGovernanceRepository implements RegistryRepository, Confi
     }
     
     @Override
-    public void initLock(final String key) {
-    }
-    
-    @Override
-    public boolean tryLock(final long time, final TimeUnit unit) {
+    public boolean tryLock(final String key, final long time, final TimeUnit unit) {
         return false;
     }
     
     @Override
-    public void releaseLock() {
+    public void releaseLock(final String key) {
     }
     
     @Override
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 33a8bc8..c181cf9 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
@@ -51,16 +51,13 @@ public final class TestGovernanceRepository implements RegistryRepository, Confi
     }
     
     @Override
-    public void initLock(final String key) {
-    }
-    
-    @Override
-    public boolean tryLock(final long time, final TimeUnit unit) {
+    public boolean tryLock(final String key, final long time, final TimeUnit unit) {
         return false;
     }
     
     @Override
-    public void releaseLock() {
+    public void releaseLock(final String key) {
+        
     }
     
     @Override
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 a32b848..a19996a 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
@@ -57,16 +57,12 @@ public final class FixtureRegistryRepository implements RegistryRepository, Conf
     }
     
     @Override
-    public void initLock(final String key) {
-    }
-    
-    @Override
-    public boolean tryLock(final long time, final TimeUnit unit) {
+    public boolean tryLock(final String key, final long time, final TimeUnit unit) {
         return false;
     }
     
     @Override
-    public void releaseLock() {
+    public void releaseLock(final String key) {
     }
     
     @Override
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 bd80fa9..bab5023 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
@@ -85,16 +85,12 @@ public final class FixtureRegistryRepository implements RegistryRepository, Conf
     }
     
     @Override
-    public void initLock(final String key) {
-    }
-    
-    @Override
-    public boolean tryLock(final long time, final TimeUnit unit) {
+    public boolean tryLock(final String key, final long time, final TimeUnit unit) {
         return false;
     }
     
     @Override
-    public void releaseLock() {
+    public void releaseLock(final String key) {
     }
     
     @Override