[helix] 17/21: Metaclient - Leader election - leader change event notification (#2560)

2023-08-28 Thread jxue
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)

2023-08-28 Thread jxue
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
+++