This is an automated email from the ASF dual-hosted git repository.
chengpan pushed a commit to branch branch-0.4
in repository https://gitbox.apache.org/repos/asf/kyuubi-shaded.git
The following commit(s) were added to refs/heads/branch-0.4 by this push:
new 2eb8b09 [KYUUBI #6496] Step 1/2: Port ZOOKEEPER-4377 to Kyuubi shaded
ZooKeeper 3.4 and 3.6
2eb8b09 is described below
commit 2eb8b09657fe6c548bcb25b8115428497efaaf4f
Author: madlnu <[email protected]>
AuthorDate: Tue Jul 16 16:01:16 2024 +0800
[KYUUBI #6496] Step 1/2: Port ZOOKEEPER-4377 to Kyuubi shaded ZooKeeper 3.4
and 3.6
### _Why are the changes needed?_
This PR is to resolve the [Kyuubi
#6496](https://github.com/apache/kyuubi/issues/6496) issue raised. The change
is split into two steps
1. First is to overwrite the KeeperException class, raised in this PR
(KeeperException for zookeeper34 is pulled from
[zookeeper-3.4.14](https://github.com/apache/zookeeper/blob/release-3.4.14/zookeeper-server/src/main/java/org/apache/zookeeper/KeeperException.java)
for zookeeper36 is pulled from
[zookeeper-3.6](https://github.com/apache/zookeeper/blob/branch-3.6/zookeeper-server/src/main/java/org/apache/zookeeper/KeeperException.java)
)
2. Step 2 will be for backporting the ZOOKEEPER-4377 change
### _How was this patch tested?
This was built locally and tested in local using following steps:
1. perform `build/mvn clean package` to generate
`kyuubi-relocated-zookeeper-parent/kyuubi-relocated-zookeeper-34/target/kyuubi-relocated-zookeeper-34-0.5.0-SNAPSHOT.jar`
2. download and install
[apache-kyuubi-1.9.1-bin.tgz](https://dlcdn.apache.org/kyuubi/kyuubi-1.9.1/apache-kyuubi-1.9.1-bin.tgz)
3. replace
`KYUUBI_HOME/jars/kyuubi-relocated-zookeeper-34-0.3.0-SNAPSHOT.jar` with
`kyuubi-relocated-zookeeper-34-0.5.0-SNAPSHOT.jar`
4. perform `bin/kyuubi-zk-cli -server xxxxx:2181` to connect a Zookeeper
cluster
Closes #46 from Madhukar525722/zookeeper-4377.
14252e1 [madlnu] [KYUUBI #6496] Step 1/2: Port ZOOKEEPER-4377 to Kyuubi
shaded ZooKeeper 3.4 and 3.6
Authored-by: madlnu <[email protected]>
Signed-off-by: Cheng Pan <[email protected]>
---
.../java/org/apache/zookeeper/KeeperException.java | 603 ++++++++++++++++
.../kyuubi-relocated-zookeeper-36/pom.xml | 7 +
.../java/org/apache/zookeeper/KeeperException.java | 776 +++++++++++++++++++++
3 files changed, 1386 insertions(+)
diff --git
a/kyuubi-relocated-zookeeper-parent/kyuubi-relocated-zookeeper-34/src/main/java/org/apache/zookeeper/KeeperException.java
b/kyuubi-relocated-zookeeper-parent/kyuubi-relocated-zookeeper-34/src/main/java/org/apache/zookeeper/KeeperException.java
new file mode 100644
index 0000000..0e1106c
--- /dev/null
+++
b/kyuubi-relocated-zookeeper-parent/kyuubi-relocated-zookeeper-34/src/main/java/org/apache/zookeeper/KeeperException.java
@@ -0,0 +1,603 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
contributor license
+ * agreements. See the NOTICE file distributed with this work for additional
information regarding
+ * copyright ownership. The ASF licenses this file to you under the Apache
License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the
License. You may obtain a
+ * copy of the License at
+ *
+ * <p>http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * <p>Unless required by applicable law or agreed to in writing, software
distributed under the
+ * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
CONDITIONS OF ANY KIND, either
+ * express or implied. See the License for the specific language governing
permissions and
+ * limitations under the License.
+ */
+package org.apache.zookeeper;
+
+import java.util.ArrayList;
+import java.util.EnumSet;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import org.apache.yetus.audience.InterfaceAudience;
+
+@SuppressWarnings("serial")
[email protected]
+public abstract class KeeperException extends Exception {
+ /**
+ * All multi-requests that result in an exception retain the results here so
that it is possible
+ * to examine the problems in the catch scope. Non-multi requests will get a
null if they try to
+ * access these results.
+ */
+ private List<OpResult> results;
+
+ /**
+ * All non-specific keeper exceptions should be constructed via this factory
method in order to
+ * guarantee consistency in error codes and such. If you know the error
code, then you should
+ * construct the special purpose exception directly. That will allow you to
have the most specific
+ * possible declarations of what exceptions might actually be thrown.
+ *
+ * @param code The error code.
+ * @param path The ZooKeeper path being operated on.
+ * @return The specialized exception, presumably to be thrown by the caller.
+ */
+ public static KeeperException create(Code code, String path) {
+ KeeperException r = create(code);
+ r.path = path;
+ return r;
+ }
+
+ /** @deprecated deprecated in 3.1.0, use {@link #create(Code, String)}
instead */
+ @Deprecated
+ public static KeeperException create(int code, String path) {
+ KeeperException r = create(Code.get(code));
+ r.path = path;
+ return r;
+ }
+
+ /** @deprecated deprecated in 3.1.0, use {@link #create(Code)} instead */
+ @Deprecated
+ public static KeeperException create(int code) {
+ return create(Code.get(code));
+ }
+
+ /**
+ * All non-specific keeper exceptions should be constructed via this factory
method in order to
+ * guarantee consistency in error codes and such. If you know the error
code, then you should
+ * construct the special purpose exception directly. That will allow you to
have the most specific
+ * possible declarations of what exceptions might actually be thrown.
+ *
+ * @param code The error code of your new exception. This will also
determine the specific type of
+ * the exception that is returned.
+ * @return The specialized exception, presumably to be thrown by the caller.
+ */
+ public static KeeperException create(Code code) {
+ switch (code) {
+ case SYSTEMERROR:
+ return new SystemErrorException();
+ case RUNTIMEINCONSISTENCY:
+ return new RuntimeInconsistencyException();
+ case DATAINCONSISTENCY:
+ return new DataInconsistencyException();
+ case CONNECTIONLOSS:
+ return new ConnectionLossException();
+ case MARSHALLINGERROR:
+ return new MarshallingErrorException();
+ case UNIMPLEMENTED:
+ return new UnimplementedException();
+ case OPERATIONTIMEOUT:
+ return new OperationTimeoutException();
+ case BADARGUMENTS:
+ return new BadArgumentsException();
+ case APIERROR:
+ return new APIErrorException();
+ case NONODE:
+ return new NoNodeException();
+ case NOAUTH:
+ return new NoAuthException();
+ case BADVERSION:
+ return new BadVersionException();
+ case NOCHILDRENFOREPHEMERALS:
+ return new NoChildrenForEphemeralsException();
+ case NODEEXISTS:
+ return new NodeExistsException();
+ case INVALIDACL:
+ return new InvalidACLException();
+ case AUTHFAILED:
+ return new AuthFailedException();
+ case NOTEMPTY:
+ return new NotEmptyException();
+ case SESSIONEXPIRED:
+ return new SessionExpiredException();
+ case INVALIDCALLBACK:
+ return new InvalidCallbackException();
+ case SESSIONMOVED:
+ return new SessionMovedException();
+ case NOTREADONLY:
+ return new NotReadOnlyException();
+
+ case OK:
+ default:
+ throw new IllegalArgumentException("Invalid exception code");
+ }
+ }
+
+ /**
+ * Set the code for this exception
+ *
+ * @param code error code
+ * @deprecated deprecated in 3.1.0, exceptions should be immutable, this
method should not be used
+ */
+ @Deprecated
+ public void setCode(int code) {
+ this.code = Code.get(code);
+ }
+
+ /**
+ * This interface contains the original static final int constants which
have now been replaced
+ * with an enumeration in Code. Do not reference this class directly, if
necessary (legacy code)
+ * continue to access the constants through Code. Note: an interface is used
here due to the fact
+ * that enums cannot reference constants defined within the same enum as
said constants are
+ * considered initialized _after_ the enum itself. By using an interface as
a super type this
+ * allows the deprecated constants to be initialized first and referenced
when constructing the
+ * enums. I didn't want to have constants declared twice. This interface
should be private, but
+ * it's declared public to enable javadoc to include in the user API spec.
+ */
+ @Deprecated
+ @InterfaceAudience.Public
+ public interface CodeDeprecated {
+ /** @deprecated deprecated in 3.1.0, use {@link Code#OK} instead */
+ @Deprecated public static final int Ok = 0;
+
+ /** @deprecated deprecated in 3.1.0, use {@link Code#SYSTEMERROR} instead
*/
+ @Deprecated public static final int SystemError = -1;
+ /** @deprecated deprecated in 3.1.0, use {@link Code#RUNTIMEINCONSISTENCY}
instead */
+ @Deprecated public static final int RuntimeInconsistency = -2;
+ /** @deprecated deprecated in 3.1.0, use {@link Code#DATAINCONSISTENCY}
instead */
+ @Deprecated public static final int DataInconsistency = -3;
+ /** @deprecated deprecated in 3.1.0, use {@link Code#CONNECTIONLOSS}
instead */
+ @Deprecated public static final int ConnectionLoss = -4;
+ /** @deprecated deprecated in 3.1.0, use {@link Code#MARSHALLINGERROR}
instead */
+ @Deprecated public static final int MarshallingError = -5;
+ /** @deprecated deprecated in 3.1.0, use {@link Code#UNIMPLEMENTED}
instead */
+ @Deprecated public static final int Unimplemented = -6;
+ /** @deprecated deprecated in 3.1.0, use {@link Code#OPERATIONTIMEOUT}
instead */
+ @Deprecated public static final int OperationTimeout = -7;
+ /** @deprecated deprecated in 3.1.0, use {@link Code#BADARGUMENTS} instead
*/
+ @Deprecated public static final int BadArguments = -8;
+
+ /** @deprecated deprecated in 3.1.0, use {@link Code#APIERROR} instead */
+ @Deprecated public static final int APIError = -100;
+
+ /** @deprecated deprecated in 3.1.0, use {@link Code#NONODE} instead */
+ @Deprecated public static final int NoNode = -101;
+ /** @deprecated deprecated in 3.1.0, use {@link Code#NOAUTH} instead */
+ @Deprecated public static final int NoAuth = -102;
+ /** @deprecated deprecated in 3.1.0, use {@link Code#BADVERSION} instead */
+ @Deprecated public static final int BadVersion = -103;
+ /** @deprecated deprecated in 3.1.0, use {@link
Code#NOCHILDRENFOREPHEMERALS} instead */
+ @Deprecated public static final int NoChildrenForEphemerals = -108;
+ /** @deprecated deprecated in 3.1.0, use {@link Code#NODEEXISTS} instead */
+ @Deprecated public static final int NodeExists = -110;
+ /** @deprecated deprecated in 3.1.0, use {@link Code#NOTEMPTY} instead */
+ @Deprecated public static final int NotEmpty = -111;
+ /** @deprecated deprecated in 3.1.0, use {@link Code#SESSIONEXPIRED}
instead */
+ @Deprecated public static final int SessionExpired = -112;
+ /** @deprecated deprecated in 3.1.0, use {@link Code#INVALIDCALLBACK}
instead */
+ @Deprecated public static final int InvalidCallback = -113;
+ /** @deprecated deprecated in 3.1.0, use {@link Code#INVALIDACL} instead */
+ @Deprecated public static final int InvalidACL = -114;
+ /** @deprecated deprecated in 3.1.0, use {@link Code#AUTHFAILED} instead */
+ @Deprecated public static final int AuthFailed = -115;
+ /** This value will be used directly in {@link CODE#SESSIONMOVED} */
+ // public static final int SessionMoved = -118;
+ }
+
+ /**
+ * Codes which represent the various KeeperException types. This enum
replaces the deprecated
+ * earlier static final int constants. The old, deprecated, values are in
"camel case" while the
+ * new enum values are in all CAPS.
+ */
+ @InterfaceAudience.Public
+ public static enum Code implements CodeDeprecated {
+ /** Everything is OK */
+ OK(Ok),
+
+ /**
+ * System and server-side errors. This is never thrown by the server, it
shouldn't be used other
+ * than to indicate a range. Specifically error codes greater than this
value, but lesser than
+ * {@link #APIERROR}, are system errors.
+ */
+ SYSTEMERROR(SystemError),
+
+ /** A runtime inconsistency was found */
+ RUNTIMEINCONSISTENCY(RuntimeInconsistency),
+ /** A data inconsistency was found */
+ DATAINCONSISTENCY(DataInconsistency),
+ /** Connection to the server has been lost */
+ CONNECTIONLOSS(ConnectionLoss),
+ /** Error while marshalling or unmarshalling data */
+ MARSHALLINGERROR(MarshallingError),
+ /** Operation is unimplemented */
+ UNIMPLEMENTED(Unimplemented),
+ /** Operation timeout */
+ OPERATIONTIMEOUT(OperationTimeout),
+ /** Invalid arguments */
+ BADARGUMENTS(BadArguments),
+
+ /**
+ * API errors. This is never thrown by the server, it shouldn't be used
other than to indicate a
+ * range. Specifically error codes greater than this value are API errors
(while values less
+ * than this indicate a {@link #SYSTEMERROR}).
+ */
+ APIERROR(APIError),
+
+ /** Node does not exist */
+ NONODE(NoNode),
+ /** Not authenticated */
+ NOAUTH(NoAuth),
+ /** Version conflict */
+ BADVERSION(BadVersion),
+ /** Ephemeral nodes may not have children */
+ NOCHILDRENFOREPHEMERALS(NoChildrenForEphemerals),
+ /** The node already exists */
+ NODEEXISTS(NodeExists),
+ /** The node has children */
+ NOTEMPTY(NotEmpty),
+ /** The session has been expired by the server */
+ SESSIONEXPIRED(SessionExpired),
+ /** Invalid callback specified */
+ INVALIDCALLBACK(InvalidCallback),
+ /** Invalid ACL specified */
+ INVALIDACL(InvalidACL),
+ /** Client authentication failed */
+ AUTHFAILED(AuthFailed),
+ /** Session moved to another server, so operation is ignored */
+ SESSIONMOVED(-118),
+ /** State-changing request is passed to read-only server */
+ NOTREADONLY(-119);
+
+ private static final Map<Integer, Code> lookup = new HashMap<Integer,
Code>();
+
+ static {
+ for (Code c : EnumSet.allOf(Code.class)) lookup.put(c.code, c);
+ }
+
+ private final int code;
+
+ Code(int code) {
+ this.code = code;
+ }
+
+ /**
+ * Get the int value for a particular Code.
+ *
+ * @return error code as integer
+ */
+ public int intValue() {
+ return code;
+ }
+
+ /**
+ * Get the Code value for a particular integer error code
+ *
+ * @param code int error code
+ * @return Code value corresponding to specified int code, or null
+ */
+ public static Code get(int code) {
+ return lookup.get(code);
+ }
+ }
+
+ static String getCodeMessage(Code code) {
+ switch (code) {
+ case OK:
+ return "ok";
+ case SYSTEMERROR:
+ return "SystemError";
+ case RUNTIMEINCONSISTENCY:
+ return "RuntimeInconsistency";
+ case DATAINCONSISTENCY:
+ return "DataInconsistency";
+ case CONNECTIONLOSS:
+ return "ConnectionLoss";
+ case MARSHALLINGERROR:
+ return "MarshallingError";
+ case UNIMPLEMENTED:
+ return "Unimplemented";
+ case OPERATIONTIMEOUT:
+ return "OperationTimeout";
+ case BADARGUMENTS:
+ return "BadArguments";
+ case APIERROR:
+ return "APIError";
+ case NONODE:
+ return "NoNode";
+ case NOAUTH:
+ return "NoAuth";
+ case BADVERSION:
+ return "BadVersion";
+ case NOCHILDRENFOREPHEMERALS:
+ return "NoChildrenForEphemerals";
+ case NODEEXISTS:
+ return "NodeExists";
+ case INVALIDACL:
+ return "InvalidACL";
+ case AUTHFAILED:
+ return "AuthFailed";
+ case NOTEMPTY:
+ return "Directory not empty";
+ case SESSIONEXPIRED:
+ return "Session expired";
+ case INVALIDCALLBACK:
+ return "Invalid callback";
+ case SESSIONMOVED:
+ return "Session moved";
+ case NOTREADONLY:
+ return "Not a read-only call";
+ default:
+ return "Unknown error " + code;
+ }
+ }
+
+ private Code code;
+
+ private String path;
+
+ public KeeperException(Code code) {
+ this.code = code;
+ }
+
+ KeeperException(Code code, String path) {
+ this.code = code;
+ this.path = path;
+ }
+
+ /**
+ * Read the error code for this exception
+ *
+ * @return the error code for this exception
+ * @deprecated deprecated in 3.1.0, use {@link #code()} instead
+ */
+ @Deprecated
+ public int getCode() {
+ return code.code;
+ }
+
+ /**
+ * Read the error Code for this exception
+ *
+ * @return the error Code for this exception
+ */
+ public Code code() {
+ return code;
+ }
+
+ /**
+ * Read the path for this exception
+ *
+ * @return the path associated with this error, null if none
+ */
+ public String getPath() {
+ return path;
+ }
+
+ @Override
+ public String getMessage() {
+ if (path == null) {
+ return "KeeperErrorCode = " + getCodeMessage(code);
+ }
+ return "KeeperErrorCode = " + getCodeMessage(code) + " for " + path;
+ }
+
+ void setMultiResults(List<OpResult> results) {
+ this.results = results;
+ }
+
+ /**
+ * If this exception was thrown by a multi-request then the (partial)
results and error codes can
+ * be retrieved using this getter.
+ *
+ * @return A copy of the list of results from the operations in the
multi-request.
+ * @since 3.4.0
+ */
+ public List<OpResult> getResults() {
+ return results != null ? new ArrayList<OpResult>(results) : null;
+ }
+
+ /** @see Code#APIERROR */
+ @InterfaceAudience.Public
+ public static class APIErrorException extends KeeperException {
+ public APIErrorException() {
+ super(Code.APIERROR);
+ }
+ }
+
+ /** @see Code#AUTHFAILED */
+ @InterfaceAudience.Public
+ public static class AuthFailedException extends KeeperException {
+ public AuthFailedException() {
+ super(Code.AUTHFAILED);
+ }
+ }
+
+ /** @see Code#BADARGUMENTS */
+ @InterfaceAudience.Public
+ public static class BadArgumentsException extends KeeperException {
+ public BadArgumentsException() {
+ super(Code.BADARGUMENTS);
+ }
+
+ public BadArgumentsException(String path) {
+ super(Code.BADARGUMENTS, path);
+ }
+ }
+
+ /** @see Code#BADVERSION */
+ @InterfaceAudience.Public
+ public static class BadVersionException extends KeeperException {
+ public BadVersionException() {
+ super(Code.BADVERSION);
+ }
+
+ public BadVersionException(String path) {
+ super(Code.BADVERSION, path);
+ }
+ }
+
+ /** @see Code#CONNECTIONLOSS */
+ @InterfaceAudience.Public
+ public static class ConnectionLossException extends KeeperException {
+ public ConnectionLossException() {
+ super(Code.CONNECTIONLOSS);
+ }
+ }
+
+ /** @see Code#DATAINCONSISTENCY */
+ @InterfaceAudience.Public
+ public static class DataInconsistencyException extends KeeperException {
+ public DataInconsistencyException() {
+ super(Code.DATAINCONSISTENCY);
+ }
+ }
+
+ /** @see Code#INVALIDACL */
+ @InterfaceAudience.Public
+ public static class InvalidACLException extends KeeperException {
+ public InvalidACLException() {
+ super(Code.INVALIDACL);
+ }
+
+ public InvalidACLException(String path) {
+ super(Code.INVALIDACL, path);
+ }
+ }
+
+ /** @see Code#INVALIDCALLBACK */
+ @InterfaceAudience.Public
+ public static class InvalidCallbackException extends KeeperException {
+ public InvalidCallbackException() {
+ super(Code.INVALIDCALLBACK);
+ }
+ }
+
+ /** @see Code#MARSHALLINGERROR */
+ @InterfaceAudience.Public
+ public static class MarshallingErrorException extends KeeperException {
+ public MarshallingErrorException() {
+ super(Code.MARSHALLINGERROR);
+ }
+ }
+
+ /** @see Code#NOAUTH */
+ @InterfaceAudience.Public
+ public static class NoAuthException extends KeeperException {
+ public NoAuthException() {
+ super(Code.NOAUTH);
+ }
+ }
+
+ /** @see Code#NOCHILDRENFOREPHEMERALS */
+ @InterfaceAudience.Public
+ public static class NoChildrenForEphemeralsException extends KeeperException
{
+ public NoChildrenForEphemeralsException() {
+ super(Code.NOCHILDRENFOREPHEMERALS);
+ }
+
+ public NoChildrenForEphemeralsException(String path) {
+ super(Code.NOCHILDRENFOREPHEMERALS, path);
+ }
+ }
+
+ /** @see Code#NODEEXISTS */
+ @InterfaceAudience.Public
+ public static class NodeExistsException extends KeeperException {
+ public NodeExistsException() {
+ super(Code.NODEEXISTS);
+ }
+
+ public NodeExistsException(String path) {
+ super(Code.NODEEXISTS, path);
+ }
+ }
+
+ /** @see Code#NONODE */
+ @InterfaceAudience.Public
+ public static class NoNodeException extends KeeperException {
+ public NoNodeException() {
+ super(Code.NONODE);
+ }
+
+ public NoNodeException(String path) {
+ super(Code.NONODE, path);
+ }
+ }
+
+ /** @see Code#NOTEMPTY */
+ @InterfaceAudience.Public
+ public static class NotEmptyException extends KeeperException {
+ public NotEmptyException() {
+ super(Code.NOTEMPTY);
+ }
+
+ public NotEmptyException(String path) {
+ super(Code.NOTEMPTY, path);
+ }
+ }
+
+ /** @see Code#OPERATIONTIMEOUT */
+ @InterfaceAudience.Public
+ public static class OperationTimeoutException extends KeeperException {
+ public OperationTimeoutException() {
+ super(Code.OPERATIONTIMEOUT);
+ }
+ }
+
+ /** @see Code#RUNTIMEINCONSISTENCY */
+ @InterfaceAudience.Public
+ public static class RuntimeInconsistencyException extends KeeperException {
+ public RuntimeInconsistencyException() {
+ super(Code.RUNTIMEINCONSISTENCY);
+ }
+ }
+
+ /** @see Code#SESSIONEXPIRED */
+ @InterfaceAudience.Public
+ public static class SessionExpiredException extends KeeperException {
+ public SessionExpiredException() {
+ super(Code.SESSIONEXPIRED);
+ }
+ }
+
+ /** @see Code#SESSIONMOVED */
+ @InterfaceAudience.Public
+ public static class SessionMovedException extends KeeperException {
+ public SessionMovedException() {
+ super(Code.SESSIONMOVED);
+ }
+ }
+
+ /** @see Code#NOTREADONLY */
+ @InterfaceAudience.Public
+ public static class NotReadOnlyException extends KeeperException {
+ public NotReadOnlyException() {
+ super(Code.NOTREADONLY);
+ }
+ }
+
+ /** @see Code#SYSTEMERROR */
+ @InterfaceAudience.Public
+ public static class SystemErrorException extends KeeperException {
+ public SystemErrorException() {
+ super(Code.SYSTEMERROR);
+ }
+ }
+
+ /** @see Code#UNIMPLEMENTED */
+ @InterfaceAudience.Public
+ public static class UnimplementedException extends KeeperException {
+ public UnimplementedException() {
+ super(Code.UNIMPLEMENTED);
+ }
+ }
+}
diff --git
a/kyuubi-relocated-zookeeper-parent/kyuubi-relocated-zookeeper-36/pom.xml
b/kyuubi-relocated-zookeeper-parent/kyuubi-relocated-zookeeper-36/pom.xml
index 093e79f..f16434d 100644
--- a/kyuubi-relocated-zookeeper-parent/kyuubi-relocated-zookeeper-36/pom.xml
+++ b/kyuubi-relocated-zookeeper-parent/kyuubi-relocated-zookeeper-36/pom.xml
@@ -33,6 +33,7 @@ under the License.
<properties>
<slf4j.version>1.7.36</slf4j.version>
+ <yetus.version>0.5.0</yetus.version>
<zookeeper.version>3.6.4</zookeeper.version>
<curator.version>5.4.0</curator.version>
<netty.version>4.1.91.Final</netty.version>
@@ -46,6 +47,12 @@ under the License.
<version>${slf4j.version}</version>
<scope>provided</scope>
</dependency>
+ <dependency>
+ <groupId>org.apache.yetus</groupId>
+ <artifactId>audience-annotations</artifactId>
+ <version>${yetus.version}</version>
+ <scope>provided</scope>
+ </dependency>
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
diff --git
a/kyuubi-relocated-zookeeper-parent/kyuubi-relocated-zookeeper-36/src/main/java/org/apache/zookeeper/KeeperException.java
b/kyuubi-relocated-zookeeper-parent/kyuubi-relocated-zookeeper-36/src/main/java/org/apache/zookeeper/KeeperException.java
new file mode 100644
index 0000000..d61be4a
--- /dev/null
+++
b/kyuubi-relocated-zookeeper-parent/kyuubi-relocated-zookeeper-36/src/main/java/org/apache/zookeeper/KeeperException.java
@@ -0,0 +1,776 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.zookeeper;
+
+import java.util.ArrayList;
+import java.util.EnumSet;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import org.apache.yetus.audience.InterfaceAudience;
+
+@SuppressWarnings("serial")
[email protected]
+public abstract class KeeperException extends Exception {
+
+ /**
+ * All multi-requests that result in an exception retain the results here so
that it is possible
+ * to examine the problems in the catch scope. Non-multi requests will get a
null if they try to
+ * access these results.
+ */
+ private List<OpResult> results;
+
+ /**
+ * All non-specific keeper exceptions should be constructed via this factory
method in order to
+ * guarantee consistency in error codes and such. If you know the error
code, then you should
+ * construct the special purpose exception directly. That will allow you to
have the most specific
+ * possible declarations of what exceptions might actually be thrown.
+ *
+ * @param code The error code.
+ * @param path The ZooKeeper path being operated on.
+ * @return The specialized exception, presumably to be thrown by the caller.
+ */
+ public static KeeperException create(Code code, String path) {
+ KeeperException r = create(code);
+ r.path = path;
+ return r;
+ }
+
+ /** @deprecated deprecated in 3.1.0, use {@link #create(Code, String)}
instead */
+ @Deprecated
+ public static KeeperException create(int code, String path) {
+ KeeperException r = create(Code.get(code));
+ r.path = path;
+ return r;
+ }
+
+ /** @deprecated deprecated in 3.1.0, use {@link #create(Code)} instead */
+ @Deprecated
+ public static KeeperException create(int code) {
+ return create(Code.get(code));
+ }
+
+ /**
+ * All non-specific keeper exceptions should be constructed via this factory
method in order to
+ * guarantee consistency in error codes and such. If you know the error
code, then you should
+ * construct the special purpose exception directly. That will allow you to
have the most specific
+ * possible declarations of what exceptions might actually be thrown.
+ *
+ * @param code The error code of your new exception. This will also
determine the specific type of
+ * the exception that is returned.
+ * @return The specialized exception, presumably to be thrown by the caller.
+ */
+ public static KeeperException create(Code code) {
+ switch (code) {
+ case SYSTEMERROR:
+ return new SystemErrorException();
+ case RUNTIMEINCONSISTENCY:
+ return new RuntimeInconsistencyException();
+ case DATAINCONSISTENCY:
+ return new DataInconsistencyException();
+ case CONNECTIONLOSS:
+ return new ConnectionLossException();
+ case MARSHALLINGERROR:
+ return new MarshallingErrorException();
+ case UNIMPLEMENTED:
+ return new UnimplementedException();
+ case OPERATIONTIMEOUT:
+ return new OperationTimeoutException();
+ case NEWCONFIGNOQUORUM:
+ return new NewConfigNoQuorum();
+ case RECONFIGINPROGRESS:
+ return new ReconfigInProgress();
+ case BADARGUMENTS:
+ return new BadArgumentsException();
+ case APIERROR:
+ return new APIErrorException();
+ case NONODE:
+ return new NoNodeException();
+ case NOAUTH:
+ return new NoAuthException();
+ case BADVERSION:
+ return new BadVersionException();
+ case NOCHILDRENFOREPHEMERALS:
+ return new NoChildrenForEphemeralsException();
+ case NODEEXISTS:
+ return new NodeExistsException();
+ case INVALIDACL:
+ return new InvalidACLException();
+ case AUTHFAILED:
+ return new AuthFailedException();
+ case NOTEMPTY:
+ return new NotEmptyException();
+ case SESSIONEXPIRED:
+ return new SessionExpiredException();
+ case INVALIDCALLBACK:
+ return new InvalidCallbackException();
+ case SESSIONMOVED:
+ return new SessionMovedException();
+ case NOTREADONLY:
+ return new NotReadOnlyException();
+ case EPHEMERALONLOCALSESSION:
+ return new EphemeralOnLocalSessionException();
+ case NOWATCHER:
+ return new NoWatcherException();
+ case RECONFIGDISABLED:
+ return new ReconfigDisabledException();
+ case SESSIONCLOSEDREQUIRESASLAUTH:
+ return new SessionClosedRequireAuthException();
+ case REQUESTTIMEOUT:
+ return new RequestTimeoutException();
+ case OK:
+ default:
+ throw new IllegalArgumentException("Invalid exception code");
+ }
+ }
+
+ /**
+ * Set the code for this exception
+ *
+ * @param code error code
+ * @deprecated deprecated in 3.1.0, exceptions should be immutable, this
method should not be used
+ */
+ @Deprecated
+ public void setCode(int code) {
+ this.code = Code.get(code);
+ }
+
+ /**
+ * This interface contains the original static final int constants which
have now been replaced
+ * with an enumeration in Code. Do not reference this class directly, if
necessary (legacy code)
+ * continue to access the constants through Code. Note: an interface is used
here due to the fact
+ * that enums cannot reference constants defined within the same enum as
said constants are
+ * considered initialized _after_ the enum itself. By using an interface as
a super type this
+ * allows the deprecated constants to be initialized first and referenced
when constructing the
+ * enums. I didn't want to have constants declared twice. This interface
should be private, but
+ * it's declared public to enable javadoc to include in the user API spec.
+ */
+ @Deprecated
+ @InterfaceAudience.Public
+ public interface CodeDeprecated {
+
+ /** @deprecated deprecated in 3.1.0, use {@link Code#OK} instead */
+ @Deprecated int Ok = 0;
+
+ /** @deprecated deprecated in 3.1.0, use {@link Code#SYSTEMERROR} instead
*/
+ @Deprecated int SystemError = -1;
+ /** @deprecated deprecated in 3.1.0, use {@link Code#RUNTIMEINCONSISTENCY}
instead */
+ @Deprecated int RuntimeInconsistency = -2;
+ /** @deprecated deprecated in 3.1.0, use {@link Code#DATAINCONSISTENCY}
instead */
+ @Deprecated int DataInconsistency = -3;
+ /** @deprecated deprecated in 3.1.0, use {@link Code#CONNECTIONLOSS}
instead */
+ @Deprecated int ConnectionLoss = -4;
+ /** @deprecated deprecated in 3.1.0, use {@link Code#MARSHALLINGERROR}
instead */
+ @Deprecated int MarshallingError = -5;
+ /** @deprecated deprecated in 3.1.0, use {@link Code#UNIMPLEMENTED}
instead */
+ @Deprecated int Unimplemented = -6;
+ /** @deprecated deprecated in 3.1.0, use {@link Code#OPERATIONTIMEOUT}
instead */
+ @Deprecated int OperationTimeout = -7;
+ /** @deprecated deprecated in 3.1.0, use {@link Code#BADARGUMENTS} instead
*/
+ @Deprecated int BadArguments = -8;
+
+ @Deprecated int UnknownSession = -12;
+
+ /** @deprecated deprecated in 3.1.0, use {@link Code#NEWCONFIGNOQUORUM}
instead */
+ @Deprecated int NewConfigNoQuorum = -13;
+
+ /** @deprecated deprecated in 3.1.0, use {@link Code#RECONFIGINPROGRESS}
instead */
+ @Deprecated int ReconfigInProgress = -14;
+
+ /** @deprecated deprecated in 3.1.0, use {@link Code#APIERROR} instead */
+ @Deprecated int APIError = -100;
+
+ /** @deprecated deprecated in 3.1.0, use {@link Code#NONODE} instead */
+ @Deprecated int NoNode = -101;
+ /** @deprecated deprecated in 3.1.0, use {@link Code#NOAUTH} instead */
+ @Deprecated int NoAuth = -102;
+ /** @deprecated deprecated in 3.1.0, use {@link Code#BADVERSION} instead */
+ @Deprecated int BadVersion = -103;
+ /** @deprecated deprecated in 3.1.0, use {@link
Code#NOCHILDRENFOREPHEMERALS} instead */
+ @Deprecated int NoChildrenForEphemerals = -108;
+ /** @deprecated deprecated in 3.1.0, use {@link Code#NODEEXISTS} instead */
+ @Deprecated int NodeExists = -110;
+ /** @deprecated deprecated in 3.1.0, use {@link Code#NOTEMPTY} instead */
+ @Deprecated int NotEmpty = -111;
+ /** @deprecated deprecated in 3.1.0, use {@link Code#SESSIONEXPIRED}
instead */
+ @Deprecated int SessionExpired = -112;
+ /** @deprecated deprecated in 3.1.0, use {@link Code#INVALIDCALLBACK}
instead */
+ @Deprecated int InvalidCallback = -113;
+ /** @deprecated deprecated in 3.1.0, use {@link Code#INVALIDACL} instead */
+ @Deprecated int InvalidACL = -114;
+ /** @deprecated deprecated in 3.1.0, use {@link Code#AUTHFAILED} instead */
+ @Deprecated int AuthFailed = -115;
+
+ // This value will be used directly in {@link CODE#SESSIONMOVED}
+ // public static final int SessionMoved = -118;
+
+ @Deprecated int EphemeralOnLocalSession = -120;
+ }
+
+ /**
+ * Codes which represent the various KeeperException types. This enum
replaces the deprecated
+ * earlier static final int constants. The old, deprecated, values are in
"camel case" while the
+ * new enum values are in all CAPS.
+ */
+ @InterfaceAudience.Public
+ public enum Code implements CodeDeprecated {
+ /** Everything is OK */
+ OK(Ok),
+
+ /**
+ * System and server-side errors. This is never thrown by the server, it
shouldn't be used other
+ * than to indicate a range. Specifically error codes greater than this
value, but lesser than
+ * {@link #APIERROR}, are system errors.
+ */
+ SYSTEMERROR(SystemError),
+
+ /** A runtime inconsistency was found */
+ RUNTIMEINCONSISTENCY(RuntimeInconsistency),
+ /** A data inconsistency was found */
+ DATAINCONSISTENCY(DataInconsistency),
+ /** Connection to the server has been lost */
+ CONNECTIONLOSS(ConnectionLoss),
+ /** Error while marshalling or unmarshalling data */
+ MARSHALLINGERROR(MarshallingError),
+ /** Operation is unimplemented */
+ UNIMPLEMENTED(Unimplemented),
+ /** Operation timeout */
+ OPERATIONTIMEOUT(OperationTimeout),
+ /** Invalid arguments */
+ BADARGUMENTS(BadArguments),
+ /**
+ * No quorum of new config is connected and up-to-date with the leader of
last commmitted config
+ * - try invoking reconfiguration after new servers are connected and
synced
+ */
+ NEWCONFIGNOQUORUM(NewConfigNoQuorum),
+ /** Another reconfiguration is in progress -- concurrent reconfigs not
supported (yet) */
+ RECONFIGINPROGRESS(ReconfigInProgress),
+ /** Unknown session (internal server use only) */
+ UNKNOWNSESSION(UnknownSession),
+
+ /**
+ * API errors. This is never thrown by the server, it shouldn't be used
other than to indicate a
+ * range. Specifically error codes greater than this value are API errors
(while values less
+ * than this indicate a {@link #SYSTEMERROR}).
+ */
+ APIERROR(APIError),
+
+ /** Node does not exist */
+ NONODE(NoNode),
+ /** Not authenticated */
+ NOAUTH(NoAuth),
+ /**
+ * Version conflict In case of reconfiguration: reconfig requested from
config version X but
+ * last seen config has a different version Y
+ */
+ BADVERSION(BadVersion),
+ /** Ephemeral nodes may not have children */
+ NOCHILDRENFOREPHEMERALS(NoChildrenForEphemerals),
+ /** The node already exists */
+ NODEEXISTS(NodeExists),
+ /** The node has children */
+ NOTEMPTY(NotEmpty),
+ /** The session has been expired by the server */
+ SESSIONEXPIRED(SessionExpired),
+ /** Invalid callback specified */
+ INVALIDCALLBACK(InvalidCallback),
+ /** Invalid ACL specified */
+ INVALIDACL(InvalidACL),
+ /** Client authentication failed */
+ AUTHFAILED(AuthFailed),
+ /** Session moved to another server, so operation is ignored */
+ SESSIONMOVED(-118),
+ /** State-changing request is passed to read-only server */
+ NOTREADONLY(-119),
+ /** Attempt to create ephemeral node on a local session */
+ EPHEMERALONLOCALSESSION(EphemeralOnLocalSession),
+ /** Attempts to remove a non-existing watcher */
+ NOWATCHER(-121),
+ /** Request not completed within max allowed time. */
+ REQUESTTIMEOUT(-122),
+ /** Attempts to perform a reconfiguration operation when reconfiguration
feature is disabled. */
+ RECONFIGDISABLED(-123),
+ /**
+ * The session has been closed by server because server requires client to
do SASL
+ * authentication, but client is not configured with SASL authentication
or configuted with SASL
+ * but failed (i.e. wrong credential used.).
+ */
+ SESSIONCLOSEDREQUIRESASLAUTH(-124);
+
+ private static final Map<Integer, Code> lookup = new HashMap<Integer,
Code>();
+
+ static {
+ for (Code c : EnumSet.allOf(Code.class)) {
+ lookup.put(c.code, c);
+ }
+ }
+
+ private final int code;
+
+ Code(int code) {
+ this.code = code;
+ }
+
+ /**
+ * Get the int value for a particular Code.
+ *
+ * @return error code as integer
+ */
+ public int intValue() {
+ return code;
+ }
+
+ /**
+ * Get the Code value for a particular integer error code
+ *
+ * @param code int error code
+ * @return Code value corresponding to specified int code, or null
+ */
+ public static Code get(int code) {
+ return lookup.get(code);
+ }
+ }
+
+ static String getCodeMessage(Code code) {
+ switch (code) {
+ case OK:
+ return "ok";
+ case SYSTEMERROR:
+ return "SystemError";
+ case RUNTIMEINCONSISTENCY:
+ return "RuntimeInconsistency";
+ case DATAINCONSISTENCY:
+ return "DataInconsistency";
+ case CONNECTIONLOSS:
+ return "ConnectionLoss";
+ case MARSHALLINGERROR:
+ return "MarshallingError";
+ case NEWCONFIGNOQUORUM:
+ return "NewConfigNoQuorum";
+ case RECONFIGINPROGRESS:
+ return "ReconfigInProgress";
+ case UNIMPLEMENTED:
+ return "Unimplemented";
+ case OPERATIONTIMEOUT:
+ return "OperationTimeout";
+ case BADARGUMENTS:
+ return "BadArguments";
+ case APIERROR:
+ return "APIError";
+ case NONODE:
+ return "NoNode";
+ case NOAUTH:
+ return "NoAuth";
+ case BADVERSION:
+ return "BadVersion";
+ case NOCHILDRENFOREPHEMERALS:
+ return "NoChildrenForEphemerals";
+ case NODEEXISTS:
+ return "NodeExists";
+ case INVALIDACL:
+ return "InvalidACL";
+ case AUTHFAILED:
+ return "AuthFailed";
+ case NOTEMPTY:
+ return "Directory not empty";
+ case SESSIONEXPIRED:
+ return "Session expired";
+ case INVALIDCALLBACK:
+ return "Invalid callback";
+ case SESSIONMOVED:
+ return "Session moved";
+ case NOTREADONLY:
+ return "Not a read-only call";
+ case EPHEMERALONLOCALSESSION:
+ return "Ephemeral node on local session";
+ case NOWATCHER:
+ return "No such watcher";
+ case RECONFIGDISABLED:
+ return "Reconfig is disabled";
+ case SESSIONCLOSEDREQUIRESASLAUTH:
+ return "Session closed because client failed to authenticate";
+ default:
+ return "Unknown error " + code;
+ }
+ }
+
+ private Code code;
+
+ private String path;
+
+ public KeeperException(Code code) {
+ this.code = code;
+ }
+
+ KeeperException(Code code, String path) {
+ this.code = code;
+ this.path = path;
+ }
+
+ /**
+ * Read the error code for this exception
+ *
+ * @return the error code for this exception
+ * @deprecated deprecated in 3.1.0, use {@link #code()} instead
+ */
+ @Deprecated
+ public int getCode() {
+ return code.code;
+ }
+
+ /**
+ * Read the error Code for this exception
+ *
+ * @return the error Code for this exception
+ */
+ public Code code() {
+ return code;
+ }
+
+ /**
+ * Read the path for this exception
+ *
+ * @return the path associated with this error, null if none
+ */
+ public String getPath() {
+ return path;
+ }
+
+ @Override
+ public String getMessage() {
+ if (path == null || path.isEmpty()) {
+ return "KeeperErrorCode = " + getCodeMessage(code);
+ }
+ return "KeeperErrorCode = " + getCodeMessage(code) + " for " + path;
+ }
+
+ void setMultiResults(List<OpResult> results) {
+ this.results = results;
+ }
+
+ /**
+ * If this exception was thrown by a multi-request then the (partial)
results and error codes can
+ * be retrieved using this getter.
+ *
+ * @return A copy of the list of results from the operations in the
multi-request.
+ * @since 3.4.0
+ */
+ public List<OpResult> getResults() {
+ return results != null ? new ArrayList<OpResult>(results) : null;
+ }
+
+ /** @see Code#APIERROR */
+ @InterfaceAudience.Public
+ public static class APIErrorException extends KeeperException {
+
+ public APIErrorException() {
+ super(Code.APIERROR);
+ }
+ }
+
+ /** @see Code#AUTHFAILED */
+ @InterfaceAudience.Public
+ public static class AuthFailedException extends KeeperException {
+
+ public AuthFailedException() {
+ super(Code.AUTHFAILED);
+ }
+ }
+
+ /** @see Code#BADARGUMENTS */
+ @InterfaceAudience.Public
+ public static class BadArgumentsException extends KeeperException {
+
+ public BadArgumentsException() {
+ super(Code.BADARGUMENTS);
+ }
+
+ public BadArgumentsException(String path) {
+ super(Code.BADARGUMENTS, path);
+ }
+ }
+
+ /** @see Code#BADVERSION */
+ @InterfaceAudience.Public
+ public static class BadVersionException extends KeeperException {
+
+ public BadVersionException() {
+ super(Code.BADVERSION);
+ }
+
+ public BadVersionException(String path) {
+ super(Code.BADVERSION, path);
+ }
+ }
+
+ /** @see Code#CONNECTIONLOSS */
+ @InterfaceAudience.Public
+ public static class ConnectionLossException extends KeeperException {
+
+ public ConnectionLossException() {
+ super(Code.CONNECTIONLOSS);
+ }
+ }
+
+ /** @see Code#DATAINCONSISTENCY */
+ @InterfaceAudience.Public
+ public static class DataInconsistencyException extends KeeperException {
+
+ public DataInconsistencyException() {
+ super(Code.DATAINCONSISTENCY);
+ }
+ }
+
+ /** @see Code#INVALIDACL */
+ @InterfaceAudience.Public
+ public static class InvalidACLException extends KeeperException {
+
+ public InvalidACLException() {
+ super(Code.INVALIDACL);
+ }
+
+ public InvalidACLException(String path) {
+ super(Code.INVALIDACL, path);
+ }
+ }
+
+ /** @see Code#INVALIDCALLBACK */
+ @InterfaceAudience.Public
+ public static class InvalidCallbackException extends KeeperException {
+
+ public InvalidCallbackException() {
+ super(Code.INVALIDCALLBACK);
+ }
+ }
+
+ /** @see Code#MARSHALLINGERROR */
+ @InterfaceAudience.Public
+ public static class MarshallingErrorException extends KeeperException {
+
+ public MarshallingErrorException() {
+ super(Code.MARSHALLINGERROR);
+ }
+ }
+
+ /** @see Code#NOAUTH */
+ @InterfaceAudience.Public
+ public static class NoAuthException extends KeeperException {
+
+ public NoAuthException() {
+ super(Code.NOAUTH);
+ }
+ }
+
+ /** @see Code#NEWCONFIGNOQUORUM */
+ @InterfaceAudience.Public
+ public static class NewConfigNoQuorum extends KeeperException {
+
+ public NewConfigNoQuorum() {
+ super(Code.NEWCONFIGNOQUORUM);
+ }
+ }
+
+ /** @see Code#RECONFIGINPROGRESS */
+ @InterfaceAudience.Public
+ public static class ReconfigInProgress extends KeeperException {
+
+ public ReconfigInProgress() {
+ super(Code.RECONFIGINPROGRESS);
+ }
+ }
+
+ /** @see Code#NOCHILDRENFOREPHEMERALS */
+ @InterfaceAudience.Public
+ public static class NoChildrenForEphemeralsException extends KeeperException
{
+
+ public NoChildrenForEphemeralsException() {
+ super(Code.NOCHILDRENFOREPHEMERALS);
+ }
+
+ public NoChildrenForEphemeralsException(String path) {
+ super(Code.NOCHILDRENFOREPHEMERALS, path);
+ }
+ }
+
+ /** @see Code#NODEEXISTS */
+ @InterfaceAudience.Public
+ public static class NodeExistsException extends KeeperException {
+
+ public NodeExistsException() {
+ super(Code.NODEEXISTS);
+ }
+
+ public NodeExistsException(String path) {
+ super(Code.NODEEXISTS, path);
+ }
+ }
+
+ /** @see Code#NONODE */
+ @InterfaceAudience.Public
+ public static class NoNodeException extends KeeperException {
+
+ public NoNodeException() {
+ super(Code.NONODE);
+ }
+
+ public NoNodeException(String path) {
+ super(Code.NONODE, path);
+ }
+ }
+
+ /** @see Code#NOTEMPTY */
+ @InterfaceAudience.Public
+ public static class NotEmptyException extends KeeperException {
+
+ public NotEmptyException() {
+ super(Code.NOTEMPTY);
+ }
+
+ public NotEmptyException(String path) {
+ super(Code.NOTEMPTY, path);
+ }
+ }
+
+ /** @see Code#OPERATIONTIMEOUT */
+ @InterfaceAudience.Public
+ public static class OperationTimeoutException extends KeeperException {
+
+ public OperationTimeoutException() {
+ super(Code.OPERATIONTIMEOUT);
+ }
+ }
+
+ /** @see Code#RUNTIMEINCONSISTENCY */
+ @InterfaceAudience.Public
+ public static class RuntimeInconsistencyException extends KeeperException {
+
+ public RuntimeInconsistencyException() {
+ super(Code.RUNTIMEINCONSISTENCY);
+ }
+ }
+
+ /** @see Code#SESSIONEXPIRED */
+ @InterfaceAudience.Public
+ public static class SessionExpiredException extends KeeperException {
+
+ public SessionExpiredException() {
+ super(Code.SESSIONEXPIRED);
+ }
+ }
+
+ /** @see Code#UNKNOWNSESSION */
+ @InterfaceAudience.Public
+ public static class UnknownSessionException extends KeeperException {
+
+ public UnknownSessionException() {
+ super(Code.UNKNOWNSESSION);
+ }
+ }
+
+ /** @see Code#SESSIONMOVED */
+ @InterfaceAudience.Public
+ public static class SessionMovedException extends KeeperException {
+
+ public SessionMovedException() {
+ super(Code.SESSIONMOVED);
+ }
+ }
+
+ /** @see Code#NOTREADONLY */
+ @InterfaceAudience.Public
+ public static class NotReadOnlyException extends KeeperException {
+
+ public NotReadOnlyException() {
+ super(Code.NOTREADONLY);
+ }
+ }
+
+ /** @see Code#EPHEMERALONLOCALSESSION */
+ @InterfaceAudience.Public
+ public static class EphemeralOnLocalSessionException extends KeeperException
{
+
+ public EphemeralOnLocalSessionException() {
+ super(Code.EPHEMERALONLOCALSESSION);
+ }
+ }
+
+ /** @see Code#SYSTEMERROR */
+ @InterfaceAudience.Public
+ public static class SystemErrorException extends KeeperException {
+
+ public SystemErrorException() {
+ super(Code.SYSTEMERROR);
+ }
+ }
+
+ /** @see Code#UNIMPLEMENTED */
+ @InterfaceAudience.Public
+ public static class UnimplementedException extends KeeperException {
+
+ public UnimplementedException() {
+ super(Code.UNIMPLEMENTED);
+ }
+ }
+
+ /** @see Code#NOWATCHER */
+ @InterfaceAudience.Public
+ public static class NoWatcherException extends KeeperException {
+
+ public NoWatcherException() {
+ super(Code.NOWATCHER);
+ }
+
+ public NoWatcherException(String path) {
+ super(Code.NOWATCHER, path);
+ }
+ }
+
+ /** @see Code#RECONFIGDISABLED */
+ @InterfaceAudience.Public
+ public static class ReconfigDisabledException extends KeeperException {
+
+ public ReconfigDisabledException() {
+ super(Code.RECONFIGDISABLED);
+ }
+
+ public ReconfigDisabledException(String path) {
+ super(Code.RECONFIGDISABLED, path);
+ }
+ }
+
+ /** @see Code#SESSIONCLOSEDREQUIRESASLAUTH */
+ public static class SessionClosedRequireAuthException extends
KeeperException {
+
+ public SessionClosedRequireAuthException() {
+ super(Code.SESSIONCLOSEDREQUIRESASLAUTH);
+ }
+
+ public SessionClosedRequireAuthException(String path) {
+ super(Code.SESSIONCLOSEDREQUIRESASLAUTH, path);
+ }
+ }
+
+ /** @see Code#REQUESTTIMEOUT */
+ public static class RequestTimeoutException extends KeeperException {
+
+ public RequestTimeoutException() {
+ super(Code.REQUESTTIMEOUT);
+ }
+ }
+}