[helix] 17/21: Metaclient - Leader election - leader change event notification (#2560)
This is an automated email from the ASF dual-hosted git repository. jxue pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/helix.git commit 4eacde3312265e5184708f59641451bccb649ca0 Author: xyuanlu AuthorDate: Sat Jul 22 22:39:37 2023 -0700 Metaclient - Leader election - leader change event notification (#2560) Co-authored-by: Xiaoyuan Lu --- .../impl/zk/adapter/DataListenerAdapter.java | 1 + .../leaderelection/LeaderElectionClient.java | 4 +- .../LeaderElectionListenerInterface.java | 15 ++- .../LeaderElectionListenerInterfaceAdapter.java| 43 +++ .../zk/TestConnectStateChangeListenerAndRetry.java | 3 +- .../recipes/leaderelection/TestLeaderElection.java | 135 - .../helix/zookeeper/zkclient/ZkConnection.java | 1 - 7 files changed, 193 insertions(+), 9 deletions(-) diff --git a/meta-client/src/main/java/org/apache/helix/metaclient/impl/zk/adapter/DataListenerAdapter.java b/meta-client/src/main/java/org/apache/helix/metaclient/impl/zk/adapter/DataListenerAdapter.java index 94ae198ce..748b6ed3f 100644 --- a/meta-client/src/main/java/org/apache/helix/metaclient/impl/zk/adapter/DataListenerAdapter.java +++ b/meta-client/src/main/java/org/apache/helix/metaclient/impl/zk/adapter/DataListenerAdapter.java @@ -21,6 +21,7 @@ package org.apache.helix.metaclient.impl.zk.adapter; import org.apache.helix.metaclient.api.DataChangeListener; import org.apache.helix.zookeeper.zkclient.IZkDataListener; +import org.apache.helix.zookeeper.zkclient.annotation.PreFetchChangedData; import org.apache.zookeeper.Watcher; diff --git a/meta-client/src/main/java/org/apache/helix/metaclient/recipes/leaderelection/LeaderElectionClient.java b/meta-client/src/main/java/org/apache/helix/metaclient/recipes/leaderelection/LeaderElectionClient.java index 39233e979..7b13778c0 100644 --- a/meta-client/src/main/java/org/apache/helix/metaclient/recipes/leaderelection/LeaderElectionClient.java +++ b/meta-client/src/main/java/org/apache/helix/metaclient/recipes/leaderelection/LeaderElectionClient.java @@ -334,7 +334,8 @@ public class LeaderElectionClient implements AutoCloseable { * @return A boolean value indicating if registration is success. */ public boolean subscribeLeadershipChanges(String leaderPath, LeaderElectionListenerInterface listener) { -//TODO: add converter class for LeaderElectionListenerInterface +_metaClient.subscribeDataChange(leaderPath + LEADER_ENTRY_KEY, new LeaderElectionListenerInterfaceAdapter(listener), +false); return false; } @@ -343,6 +344,7 @@ public class LeaderElectionClient implements AutoCloseable { * @param listener An implementation of LeaderElectionListenerInterface */ public void unsubscribeLeadershipChanges(String leaderPath, LeaderElectionListenerInterface listener) { +_metaClient.unsubscribeDataChange(leaderPath + LEADER_ENTRY_KEY, new LeaderElectionListenerInterfaceAdapter(listener)); } @Override diff --git a/meta-client/src/main/java/org/apache/helix/metaclient/recipes/leaderelection/LeaderElectionListenerInterface.java b/meta-client/src/main/java/org/apache/helix/metaclient/recipes/leaderelection/LeaderElectionListenerInterface.java index 0436e1eb0..230fc2af1 100644 --- a/meta-client/src/main/java/org/apache/helix/metaclient/recipes/leaderelection/LeaderElectionListenerInterface.java +++ b/meta-client/src/main/java/org/apache/helix/metaclient/recipes/leaderelection/LeaderElectionListenerInterface.java @@ -24,9 +24,16 @@ package org.apache.helix.metaclient.recipes.leaderelection; * leader node is deleted. */ public interface LeaderElectionListenerInterface { + enum ChangeType { +LEADER_ACQUIRED, +LEADER_LOST + } + // When new leader is elected: - // noLeader (null) ->has leader (new leader name) - // When existing leader not leader anymore: - // has Leader (prevleader name) ->no leader (null) - public void onLeadershipChange(String leaderPath, String prevLeader, String curLeader); + // ChangeType == NEW_LEADER_ELECTED, curLeader is the new leader name + // When no leader anymore: + // ChangeType == LEADER_GONE, curLeader is an empty string + // In ZK implementation, since notification does not include changed data and metaclient fetches + // the entry when event comes, it is possible that + public void onLeadershipChange(String leaderPath, ChangeType type, String curLeader); } \ No newline at end of file diff --git a/meta-client/src/main/java/org/apache/helix/metaclient/recipes/leaderelection/LeaderElectionListenerInterfaceAdapter.java b/meta-client/src/main/java/org/apache/helix/metaclient/recipes/leaderelection/LeaderElectionListenerInterfaceAdapter.java new file mode 100644 index 0..5c64d6790 --- /dev/null +++
[helix] 17/21: Metaclient - Leader election - leader change event notification (#2560)
This is an automated email from the ASF dual-hosted git repository. jxue pushed a commit to branch metaclient in repository https://gitbox.apache.org/repos/asf/helix.git commit dd95ca441faa43ddec07f30ff7c15aea67e3aaa3 Author: xyuanlu AuthorDate: Sat Jul 22 22:39:37 2023 -0700 Metaclient - Leader election - leader change event notification (#2560) Co-authored-by: Xiaoyuan Lu --- .../impl/zk/adapter/DataListenerAdapter.java | 1 + .../leaderelection/LeaderElectionClient.java | 4 +- .../LeaderElectionListenerInterface.java | 15 ++- .../LeaderElectionListenerInterfaceAdapter.java| 43 +++ .../zk/TestConnectStateChangeListenerAndRetry.java | 3 +- .../recipes/leaderelection/TestLeaderElection.java | 135 - .../helix/zookeeper/zkclient/ZkConnection.java | 1 - 7 files changed, 193 insertions(+), 9 deletions(-) diff --git a/meta-client/src/main/java/org/apache/helix/metaclient/impl/zk/adapter/DataListenerAdapter.java b/meta-client/src/main/java/org/apache/helix/metaclient/impl/zk/adapter/DataListenerAdapter.java index 94ae198ce..748b6ed3f 100644 --- a/meta-client/src/main/java/org/apache/helix/metaclient/impl/zk/adapter/DataListenerAdapter.java +++ b/meta-client/src/main/java/org/apache/helix/metaclient/impl/zk/adapter/DataListenerAdapter.java @@ -21,6 +21,7 @@ package org.apache.helix.metaclient.impl.zk.adapter; import org.apache.helix.metaclient.api.DataChangeListener; import org.apache.helix.zookeeper.zkclient.IZkDataListener; +import org.apache.helix.zookeeper.zkclient.annotation.PreFetchChangedData; import org.apache.zookeeper.Watcher; diff --git a/meta-client/src/main/java/org/apache/helix/metaclient/recipes/leaderelection/LeaderElectionClient.java b/meta-client/src/main/java/org/apache/helix/metaclient/recipes/leaderelection/LeaderElectionClient.java index 39233e979..7b13778c0 100644 --- a/meta-client/src/main/java/org/apache/helix/metaclient/recipes/leaderelection/LeaderElectionClient.java +++ b/meta-client/src/main/java/org/apache/helix/metaclient/recipes/leaderelection/LeaderElectionClient.java @@ -334,7 +334,8 @@ public class LeaderElectionClient implements AutoCloseable { * @return A boolean value indicating if registration is success. */ public boolean subscribeLeadershipChanges(String leaderPath, LeaderElectionListenerInterface listener) { -//TODO: add converter class for LeaderElectionListenerInterface +_metaClient.subscribeDataChange(leaderPath + LEADER_ENTRY_KEY, new LeaderElectionListenerInterfaceAdapter(listener), +false); return false; } @@ -343,6 +344,7 @@ public class LeaderElectionClient implements AutoCloseable { * @param listener An implementation of LeaderElectionListenerInterface */ public void unsubscribeLeadershipChanges(String leaderPath, LeaderElectionListenerInterface listener) { +_metaClient.unsubscribeDataChange(leaderPath + LEADER_ENTRY_KEY, new LeaderElectionListenerInterfaceAdapter(listener)); } @Override diff --git a/meta-client/src/main/java/org/apache/helix/metaclient/recipes/leaderelection/LeaderElectionListenerInterface.java b/meta-client/src/main/java/org/apache/helix/metaclient/recipes/leaderelection/LeaderElectionListenerInterface.java index 0436e1eb0..230fc2af1 100644 --- a/meta-client/src/main/java/org/apache/helix/metaclient/recipes/leaderelection/LeaderElectionListenerInterface.java +++ b/meta-client/src/main/java/org/apache/helix/metaclient/recipes/leaderelection/LeaderElectionListenerInterface.java @@ -24,9 +24,16 @@ package org.apache.helix.metaclient.recipes.leaderelection; * leader node is deleted. */ public interface LeaderElectionListenerInterface { + enum ChangeType { +LEADER_ACQUIRED, +LEADER_LOST + } + // When new leader is elected: - // noLeader (null) ->has leader (new leader name) - // When existing leader not leader anymore: - // has Leader (prevleader name) ->no leader (null) - public void onLeadershipChange(String leaderPath, String prevLeader, String curLeader); + // ChangeType == NEW_LEADER_ELECTED, curLeader is the new leader name + // When no leader anymore: + // ChangeType == LEADER_GONE, curLeader is an empty string + // In ZK implementation, since notification does not include changed data and metaclient fetches + // the entry when event comes, it is possible that + public void onLeadershipChange(String leaderPath, ChangeType type, String curLeader); } \ No newline at end of file diff --git a/meta-client/src/main/java/org/apache/helix/metaclient/recipes/leaderelection/LeaderElectionListenerInterfaceAdapter.java b/meta-client/src/main/java/org/apache/helix/metaclient/recipes/leaderelection/LeaderElectionListenerInterfaceAdapter.java new file mode 100644 index 0..5c64d6790 --- /dev/null +++