This is an automated email from the ASF dual-hosted git repository. xyuanlu pushed a commit to branch metaclient in repository https://gitbox.apache.org/repos/asf/helix.git
commit 6a5cec01eac34bf640db7459163f5a1e46cdd878 Author: xyuanlu <[email protected]> AuthorDate: Tue Feb 14 14:36:34 2023 -0800 Update async API for MetaClient. Update async API for MetaClient. --- .../org/apache/helix/metaclient/api/AsyncCallback.java | 17 ++++++++--------- .../helix/metaclient/api/MetaClientInterface.java | 4 ++-- .../apache/helix/metaclient/impl/zk/ZkMetaClient.java | 16 +++++++++++----- 3 files changed, 21 insertions(+), 16 deletions(-) diff --git a/meta-client/src/main/java/org/apache/helix/metaclient/api/AsyncCallback.java b/meta-client/src/main/java/org/apache/helix/metaclient/api/AsyncCallback.java index 88ae31623..1e7c1eb75 100644 --- a/meta-client/src/main/java/org/apache/helix/metaclient/api/AsyncCallback.java +++ b/meta-client/src/main/java/org/apache/helix/metaclient/api/AsyncCallback.java @@ -20,6 +20,8 @@ package org.apache.helix.metaclient.api; */ import java.util.List; +import javax.annotation.Nullable; + /** * An asynchronous callback is deferred to invoke after an async CRUD operation finish and return. @@ -34,10 +36,10 @@ public interface AsyncCallback { * Process the result of asynchronous calls that returns a stat object. * @param returnCode The return code of the call. * @param key the key that passed to asynchronous calls. - * @param context context object that passed to asynchronous calls. * @param stat the stats of the entry of the given key, returned from the async call. + * Could be null if the entry did not exist. */ - void processResult(int returnCode, String key, Object context, MetaClientInterface.Stat stat); + void processResult(int returnCode, String key, @Nullable MetaClientInterface.Stat stat); } //This callback is used when data is returned from the operation. @@ -46,11 +48,10 @@ public interface AsyncCallback { * Process the result of asynchronous calls that returns entry data. * @param returnCode The return code of the call. * @param key The key that passed to asynchronous calls. - * @param context context object that passed to asynchronous calls. * @param data returned entry data from the call. - * @param stat the stats of the entry of the given key. + * @param stat the stats of the entry of the given key. Could be null if the entry did not exist. */ - void processResult(int returnCode, String key, Object context, byte[] data, MetaClientInterface.Stat stat); + void processResult(int returnCode, String key, byte[] data, @Nullable MetaClientInterface.Stat stat); } //This callback is used when nothing is returned from the operation. @@ -59,9 +60,8 @@ public interface AsyncCallback { * Process the result of asynchronous calls that has no return value. * @param returnCode The return code of the call. * @param key he key that passed to asynchronous calls. - * @param context context object that passed to asynchronous calls. */ - void processResult(int returnCode, String key, Object context); + void processResult(int returnCode, String key); } //This callback is used to process the list if OpResults from a single transactional call. @@ -70,10 +70,9 @@ public interface AsyncCallback { * Process the result of asynchronous transactional calls. * @param returnCode The return code of the transaction call. * @param keys List of keys passed to the async transactional call. - * @param context context object that passed to asynchronous calls. * @param opResults The list of transactional results. */ - void processResult(int returnCode, List<String> keys, Object context, List<OpResult> opResults); + void processResult(int returnCode, List<String> keys, List<OpResult> opResults); } } \ No newline at end of file diff --git a/meta-client/src/main/java/org/apache/helix/metaclient/api/MetaClientInterface.java b/meta-client/src/main/java/org/apache/helix/metaclient/api/MetaClientInterface.java index 46fb59cb7..dc310b0ef 100644 --- a/meta-client/src/main/java/org/apache/helix/metaclient/api/MetaClientInterface.java +++ b/meta-client/src/main/java/org/apache/helix/metaclient/api/MetaClientInterface.java @@ -223,9 +223,9 @@ public interface MetaClientInterface<T> { * @param data new data of the entry * @param version expected version if the entry. -1 matched any version * @param cb An user defined VoidCallback implementation that will be invoked when async create return. - * @see org.apache.helix.metaclient.api.AsyncCallback.VoidCallback + * @see org.apache.helix.metaclient.api.AsyncCallback.StatCallback */ - void asyncSet(final String key, final T data, final int version, AsyncCallback.VoidCallback cb); + void asyncSet(final String key, final T data, final int version, AsyncCallback.StatCallback cb); /** * The asynchronous version of update. diff --git a/meta-client/src/main/java/org/apache/helix/metaclient/impl/zk/ZkMetaClient.java b/meta-client/src/main/java/org/apache/helix/metaclient/impl/zk/ZkMetaClient.java index fbca7ce5c..fea40bcde 100644 --- a/meta-client/src/main/java/org/apache/helix/metaclient/impl/zk/ZkMetaClient.java +++ b/meta-client/src/main/java/org/apache/helix/metaclient/impl/zk/ZkMetaClient.java @@ -166,10 +166,16 @@ public class ZkMetaClient<T> implements MetaClientInterface<T>, AutoCloseable { return true; } - // Zookeeper execute async callbacks at zookeeper server side. In our first version of - // implementation, we will keep this behavior. - // In later version, we may consider creating a thread pool to execute registered callbacks. - // However, this will change metaclient from stateless to stateful. + // In Current ZkClient, Async CRUD do auto retry when connection lost or session mismatch using + // existing retry handling logic in zkClient. (defined in ZkAsyncCallbacks) + // ZkClient execute async callbacks at zkClient main thead, retry is handles in a separate retry + // thread. In our first version of implementation, we will keep similar behavior and have + // callbacks executed in ZkClient event thread, and reuse zkclient retry logic. + + // It is highly recommended NOT to perform any blocking operation inside the callbacks. + // If you block the thread the meta client won't process other events. + + // corresponding callbacks for each operation are invoked in order. @Override public void setAsyncExecPoolSize(int poolSize) { @@ -181,7 +187,7 @@ public class ZkMetaClient<T> implements MetaClientInterface<T>, AutoCloseable { } @Override - public void asyncSet(String key, T data, int version, AsyncCallback.VoidCallback cb) { + public void asyncSet(String key, T data, int version, AsyncCallback.StatCallback cb) { }
