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 c8eecda19fa23f6bba4d51db13dcbdd6e206c7bb Author: xyuanlu <[email protected]> AuthorDate: Thu Feb 2 16:10:37 2023 -0800 Add metaclient code and code translator from ZkException code --- .../metaclient/exception/MetaClientException.java | 99 ++++++++++++++++++++++ .../metaclient/impl/zk/util/ZkMetaClientUtil.java | 85 +++++++++++++++++++ 2 files changed, 184 insertions(+) diff --git a/meta-client/src/main/java/org/apache/helix/metaclient/exception/MetaClientException.java b/meta-client/src/main/java/org/apache/helix/metaclient/exception/MetaClientException.java index 6620799ca..3854fadaf 100644 --- a/meta-client/src/main/java/org/apache/helix/metaclient/exception/MetaClientException.java +++ b/meta-client/src/main/java/org/apache/helix/metaclient/exception/MetaClientException.java @@ -36,4 +36,103 @@ public class MetaClientException extends RuntimeException { super(cause); } + public enum ReturnCode { + /** Connection to the server has been lost. */ + CONNECTION_LOSS(-105, "Connection to the server has been lost.") , + + /** Operation is unimplemented. */ + UNIMPLEMENTED(-104, "Operation is unimplemented."), + + /** Operation timeout. */ + OPERATION_TIMEOUT(-103, "Operation timeout.") { + @Override + public MetaClientException createMetaClientException() { + return new MetaClientTimeoutException(); + } + }, + + /** Either a runtime or data inconsistency was found. */ + CONSISTENCY_ERROR(-102, "Inconsistency was found."), + + /** Session is moved or expired or non-exist. */ + SESSION_ERROR(-101, "Session is moved or expired or non-exist."), + + /** Indicates a system and server-side errors not defined by following codes. + * It also indicate a range. Any value smaller or equal than this indicating error from + * server side. + */ + DB_SYSTEM_ERROR(-100, "System and server-side errors."), + + /** The listener does not exists. */ + INVALID_LISTENER(-9, "Listener does not exists."), + + /** Authentication failed. */ + AUTH_FAILED(-8, "authentication failed"), + + /** Invalid arguments. */ + INVALID_ARGUMENTS(-7, "Invalid arguments"), + + /** Version conflict. Return when caller tries to edit an entry with a specific version but + * the actual version of the entry on server is different. */ + BAD_VERSION(-6, "Version conflict.") { + @Override + public MetaClientException createMetaClientException() { + return new MetaClientBadVersionException(); + } + }, + + /** Entry already exists. Return when try to create a duplicated entry. */ + ENTRY_EXISTS(-5, "Entry already exists."), + + /** The client is not Authenticated. */ + NO_AUTH(-4, "Not Authenticated.") , + + /** Entry does not exist. */ + NO_SUCH_ENTRY(-3, "Entry does not exist.") { + @Override + public MetaClientException createMetaClientException() { + return new MetaClientNoNodeException(); + } + }, + + /**The entry has sub entries. Return when operation can only be down at entry with no + * sub entries. (i.e. unrecursively delete an entry . )*/ + NOT_LEAF_ENTRY(-2, "The entry has sub entries."), + + /** Indicates a system and DB client or a usage errors not defined by following codes. + * It also indicate a range. Any value smaller or equal than this and larger than + * DB_SYSTEM_ERROR indicating error from client or caused by wrong usage. + */ + DB_USER_ERROR(-1, "Client or usage error."), + + /** Everything is OK. */ + OK(0, "OK") { + @Override + public MetaClientException createMetaClientException() { + return null; + } + }; + + private final int _intValue; + private final String _message; + + ReturnCode(int codeIntValue, String message) { + _intValue = codeIntValue; + _message = message; + } + + public String getMessage() { + return _message; + } + + public int getIntValue() { + return _intValue; + } + + public MetaClientException createMetaClientException() { + // TODO: add more code translation when new exception class is created. + return new MetaClientException(); + } + } + } diff --git a/meta-client/src/main/java/org/apache/helix/metaclient/impl/zk/util/ZkMetaClientUtil.java b/meta-client/src/main/java/org/apache/helix/metaclient/impl/zk/util/ZkMetaClientUtil.java index dc92e706b..cd625f169 100644 --- a/meta-client/src/main/java/org/apache/helix/metaclient/impl/zk/util/ZkMetaClientUtil.java +++ b/meta-client/src/main/java/org/apache/helix/metaclient/impl/zk/util/ZkMetaClientUtil.java @@ -238,4 +238,89 @@ public class ZkMetaClientUtil { } return new MetaClientException(e); } + + /** + * This function translate and group Zk exception code to metaclient code. + * It currently includes all ZK code on 3.6.3. + */ + public static MetaClientException.ReturnCode translateZooKeeperCodeToMetaClientCode( + KeeperException.Code zkCode) { + // TODO: add log to track ZK origional code. + switch (zkCode) { + case AUTHFAILED: + case SESSIONCLOSEDREQUIRESASLAUTH: + case INVALIDACL: + return MetaClientException.ReturnCode.AUTH_FAILED; + + case CONNECTIONLOSS: + return MetaClientException.ReturnCode.CONNECTION_LOSS; + + case BADARGUMENTS: + return MetaClientException.ReturnCode.INVALID_ARGUMENTS; + + case BADVERSION: + return MetaClientException.ReturnCode.BAD_VERSION; + + case NOAUTH: + return MetaClientException.ReturnCode.NO_AUTH; + + case NOWATCHER: + return MetaClientException.ReturnCode.INVALID_LISTENER; + + case NOTEMPTY: + return MetaClientException.ReturnCode.NOT_LEAF_ENTRY; + + case NODEEXISTS: + return MetaClientException.ReturnCode.ENTRY_EXISTS; + + case SESSIONEXPIRED: + case SESSIONMOVED: + case UNKNOWNSESSION: + return MetaClientException.ReturnCode.SESSION_ERROR; + + case NONODE: + return MetaClientException.ReturnCode.NO_SUCH_ENTRY; + + case OPERATIONTIMEOUT: + return MetaClientException.ReturnCode.OPERATION_TIMEOUT; + + case OK: + return MetaClientException.ReturnCode.OK; + + case UNIMPLEMENTED: + return MetaClientException.ReturnCode.UNIMPLEMENTED; + + case RUNTIMEINCONSISTENCY: + case DATAINCONSISTENCY: + return MetaClientException.ReturnCode.CONSISTENCY_ERROR; + + case SYSTEMERROR: + case MARSHALLINGERROR: + case NEWCONFIGNOQUORUM: + case RECONFIGINPROGRESS: + return MetaClientException.ReturnCode.DB_SYSTEM_ERROR; + + case NOCHILDRENFOREPHEMERALS: + case INVALIDCALLBACK: + case NOTREADONLY: + case EPHEMERALONLOCALSESSION: + case RECONFIGDISABLED: + return MetaClientException.ReturnCode.DB_USER_ERROR; + + /* + * APIERROR is ZooKeeper Code value separator. It is never thrown by ZK server, + * ZK error codes greater than its value are user or client errors and values less than + * this indicate a ZK server. + * Note: there are some mismatch between ZK doc and Zk code intValue define. We are comparing + * ordinal instead of using intValue(). + * https://zookeeper.apache.org/doc/r3.6.2/apidocs/zookeeper-server/index.html?org/apache/zookeeper/KeeperException.Code.html + */ + default: + if (zkCode.ordinal() < KeeperException.Code.APIERROR.ordinal() + && zkCode.ordinal() >= KeeperException.Code.SYSTEMERROR.ordinal()) { + return MetaClientException.ReturnCode.DB_SYSTEM_ERROR; + } + return MetaClientException.ReturnCode.DB_USER_ERROR; + } + } }
