This is an automated email from the ASF dual-hosted git repository.
jiajunwang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/helix.git
The following commit(s) were added to refs/heads/master by this push:
new 1a37d5c Get rid of non-official ZK error code to avoid NPEs. (#1778)
1a37d5c is described below
commit 1a37d5c692c85db20d0c61e2f72659f3724e125e
Author: Jiajun Wang <[email protected]>
AuthorDate: Wed Jun 2 16:13:22 2021 -0700
Get rid of non-official ZK error code to avoid NPEs. (#1778)
This PR removes the non-official ZK error codes that are returned by the
Helix ZkClient. The original design was made for differentiating the failure
cases. However, that design caused unexpected NPE when most of Helix's logic
relies on the Zookeeper KeeperException.Code class to identify the error types.
---
.../apache/helix/zookeeper/zkclient/ZkClient.java | 22 ++++++---------------
.../zkclient/callback/ZkAsyncCallbacks.java | 13 +-----------
.../zookeeper/impl/client/TestRawZkClient.java | 4 ++--
.../impl/client/TestZkClientAsyncRetry.java | 23 +++++++++++-----------
4 files changed, 20 insertions(+), 42 deletions(-)
diff --git
a/zookeeper-api/src/main/java/org/apache/helix/zookeeper/zkclient/ZkClient.java
b/zookeeper-api/src/main/java/org/apache/helix/zookeeper/zkclient/ZkClient.java
index 8b742da..cbbdbbd 100644
---
a/zookeeper-api/src/main/java/org/apache/helix/zookeeper/zkclient/ZkClient.java
+++
b/zookeeper-api/src/main/java/org/apache/helix/zookeeper/zkclient/ZkClient.java
@@ -1276,7 +1276,7 @@ public class ZkClient implements Watcher {
});
} catch (RuntimeException e) {
// Process callback to release caller from waiting
- cb.processResult(ZkAsyncCallbacks.UNKNOWN_RET_CODE, path,
+ cb.processResult(KeeperException.Code.APIERROR.intValue(), path,
new ZkAsyncCallMonitorContext(_monitor, startT, 0, true));
throw e;
}
@@ -1960,14 +1960,9 @@ public class ZkClient implements Watcher {
});
return null;
});
- } catch (ZkSessionMismatchedException e) {
- // Process callback to release caller from waiting
- cb.processResult(ZkAsyncCallbacks.ZK_SESSION_MISMATCHED_CODE, path,
- new ZkAsyncCallMonitorContext(_monitor, startT, 0, false), null);
- throw e;
} catch (RuntimeException e) {
// Process callback to release caller from waiting
- cb.processResult(ZkAsyncCallbacks.UNKNOWN_RET_CODE, path,
+ cb.processResult(KeeperException.Code.APIERROR.intValue(), path,
new ZkAsyncCallMonitorContext(_monitor, startT, 0, false), null);
throw e;
}
@@ -2003,14 +1998,9 @@ public class ZkClient implements Watcher {
});
return null;
});
- } catch (ZkSessionMismatchedException e) {
- // Process callback to release caller from waiting
- cb.processResult(ZkAsyncCallbacks.ZK_SESSION_MISMATCHED_CODE, path,
- new ZkAsyncCallMonitorContext(_monitor, startT, 0, false), null);
- throw e;
} catch (RuntimeException e) {
// Process callback to release caller from waiting
- cb.processResult(ZkAsyncCallbacks.UNKNOWN_RET_CODE, path,
+ cb.processResult(KeeperException.Code.APIERROR.intValue(), path,
new ZkAsyncCallMonitorContext(_monitor, startT, 0, false), null);
throw e;
}
@@ -2031,7 +2021,7 @@ public class ZkClient implements Watcher {
});
} catch (RuntimeException e) {
// Process callback to release caller from waiting
- cb.processResult(ZkAsyncCallbacks.UNKNOWN_RET_CODE, path,
+ cb.processResult(KeeperException.Code.APIERROR.intValue(), path,
new ZkAsyncCallMonitorContext(_monitor, startT, 0, true), null,
null);
throw e;
}
@@ -2052,7 +2042,7 @@ public class ZkClient implements Watcher {
});
} catch (RuntimeException e) {
// Process callback to release caller from waiting
- cb.processResult(ZkAsyncCallbacks.UNKNOWN_RET_CODE, path,
+ cb.processResult(KeeperException.Code.APIERROR.intValue(), path,
new ZkAsyncCallMonitorContext(_monitor, startT, 0, true), null);
throw e;
}
@@ -2073,7 +2063,7 @@ public class ZkClient implements Watcher {
});
} catch (RuntimeException e) {
// Process callback to release caller from waiting
- cb.processResult(ZkAsyncCallbacks.UNKNOWN_RET_CODE, path,
+ cb.processResult(KeeperException.Code.APIERROR.intValue(), path,
new ZkAsyncCallMonitorContext(_monitor, startT, 0, false));
throw e;
}
diff --git
a/zookeeper-api/src/main/java/org/apache/helix/zookeeper/zkclient/callback/ZkAsyncCallbacks.java
b/zookeeper-api/src/main/java/org/apache/helix/zookeeper/zkclient/callback/ZkAsyncCallbacks.java
index c188e7e..7f662cf 100644
---
a/zookeeper-api/src/main/java/org/apache/helix/zookeeper/zkclient/callback/ZkAsyncCallbacks.java
+++
b/zookeeper-api/src/main/java/org/apache/helix/zookeeper/zkclient/callback/ZkAsyncCallbacks.java
@@ -35,13 +35,6 @@ import org.slf4j.LoggerFactory;
public class ZkAsyncCallbacks {
private static Logger LOG = LoggerFactory.getLogger(ZkAsyncCallbacks.class);
- public static final int UNKNOWN_RET_CODE = 255;
-
- // Whenever there's a mismatch between the expected Zookeeper session ID and
the actual
- // Zookeeper session ID for the async operation, the ZkClient which performs
the async
- // operation passes this return code to the async callback indicate that it
has caught
- // a ZkSessionMismatchedException.
- public static final int ZK_SESSION_MISMATCHED_CODE = 127;
public static class GetDataCallbackHandler extends DefaultCallback
implements DataCallback {
public byte[] _data;
@@ -182,7 +175,7 @@ public class ZkAsyncCallbacks {
*/
public static abstract class DefaultCallback implements
CancellableZkAsyncCallback {
AtomicBoolean _isOperationDone = new AtomicBoolean(false);
- int _rc = UNKNOWN_RET_CODE;
+ int _rc = KeeperException.Code.APIERROR.intValue();
public void callback(int rc, String path, Object ctx) {
if (rc != 0 && LOG.isDebugEnabled()) {
@@ -282,10 +275,6 @@ public class ZkAsyncCallbacks {
* @return true if the error is transient and the operation may succeed
when being retried.
*/
protected boolean needRetry(int rc) {
- if (rc == ZK_SESSION_MISMATCHED_CODE) {
- LOG.error("Actual session ID doesn't match with expected session ID.
Skip retrying.");
- return false;
- }
try {
switch (Code.get(rc)) {
/** Connection to the server has been lost */
diff --git
a/zookeeper-api/src/test/java/org/apache/helix/zookeeper/impl/client/TestRawZkClient.java
b/zookeeper-api/src/test/java/org/apache/helix/zookeeper/impl/client/TestRawZkClient.java
index e078367..79efd12 100644
---
a/zookeeper-api/src/test/java/org/apache/helix/zookeeper/impl/client/TestRawZkClient.java
+++
b/zookeeper-api/src/test/java/org/apache/helix/zookeeper/impl/client/TestRawZkClient.java
@@ -887,7 +887,7 @@ public class TestRawZkClient extends ZkTestBase {
// Ensure the async callback is cancelled because of the exception
Assert.assertTrue(createCallback.waitForSuccess(), "Callback operation
should be done");
- Assert.assertEquals(createCallback.getRc(),
ZkAsyncCallbacks.ZK_SESSION_MISMATCHED_CODE);
+ Assert.assertEquals(createCallback.getRc(),
KeeperException.Code.APIERROR.intValue());
}
Assert.assertFalse(zkClient.exists(path));
@@ -915,7 +915,7 @@ public class TestRawZkClient extends ZkTestBase {
// Ensure the async callback is cancelled because of the exception
Assert.assertTrue(setDataCallback.waitForSuccess(), "Callback operation
should be done");
- Assert.assertEquals(setDataCallback.getRc(),
ZkAsyncCallbacks.ZK_SESSION_MISMATCHED_CODE);
+ Assert.assertEquals(setDataCallback.getRc(),
KeeperException.Code.APIERROR.intValue());
}
TestHelper.verify(() -> zkClient.delete(path), TestHelper.WAIT_DURATION);
diff --git
a/zookeeper-api/src/test/java/org/apache/helix/zookeeper/impl/client/TestZkClientAsyncRetry.java
b/zookeeper-api/src/test/java/org/apache/helix/zookeeper/impl/client/TestZkClientAsyncRetry.java
index 6845aa9..e55f8e6 100644
---
a/zookeeper-api/src/test/java/org/apache/helix/zookeeper/impl/client/TestZkClientAsyncRetry.java
+++
b/zookeeper-api/src/test/java/org/apache/helix/zookeeper/impl/client/TestZkClientAsyncRetry.java
@@ -42,7 +42,6 @@ import org.testng.annotations.AfterClass;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;
-import static
org.apache.helix.zookeeper.zkclient.callback.ZkAsyncCallbacks.UNKNOWN_RET_CODE;
import static org.apache.zookeeper.KeeperException.Code.CONNECTIONLOSS;
/**
@@ -143,7 +142,7 @@ public class TestZkClientAsyncRetry extends ZkTestBase {
}
ZkAsyncCallbacks.CreateCallbackHandler createCallback =
new ZkAsyncCallbacks.CreateCallbackHandler();
- Assert.assertEquals(createCallback.getRc(), UNKNOWN_RET_CODE);
+ Assert.assertEquals(createCallback.getRc(),
KeeperException.Code.APIERROR.intValue());
testZkClient.setAsyncCallRC(code.intValue());
if (code == CONNECTIONLOSS || code ==
KeeperException.Code.SESSIONEXPIRED
|| code == KeeperException.Code.SESSIONMOVED) {
@@ -190,7 +189,7 @@ public class TestZkClientAsyncRetry extends ZkTestBase {
// 1. Test async set retry
ZkAsyncCallbacks.SetDataCallbackHandler setCallback =
new ZkAsyncCallbacks.SetDataCallbackHandler();
- Assert.assertEquals(setCallback.getRc(), UNKNOWN_RET_CODE);
+ Assert.assertEquals(setCallback.getRc(),
KeeperException.Code.APIERROR.intValue());
tmpRecord.setSimpleField("test", "data");
testZkClient.setAsyncCallRC(CONNECTIONLOSS.intValue());
@@ -214,7 +213,7 @@ public class TestZkClientAsyncRetry extends ZkTestBase {
// 2. Test async delete
ZkAsyncCallbacks.DeleteCallbackHandler deleteCallback =
new ZkAsyncCallbacks.DeleteCallbackHandler();
- Assert.assertEquals(deleteCallback.getRc(), UNKNOWN_RET_CODE);
+ Assert.assertEquals(deleteCallback.getRc(),
KeeperException.Code.APIERROR.intValue());
testZkClient.setAsyncCallRC(CONNECTIONLOSS.intValue());
// Async delete will be pending due to the mock error rc is retryable.
@@ -254,7 +253,7 @@ public class TestZkClientAsyncRetry extends ZkTestBase {
// 1. Test async create retry
ZkAsyncCallbacks.CreateCallbackHandler createCallback =
new ZkAsyncCallbacks.CreateCallbackHandler();
- Assert.assertEquals(createCallback.getRc(), UNKNOWN_RET_CODE);
+ Assert.assertEquals(createCallback.getRc(),
KeeperException.Code.APIERROR.intValue());
tmpRecord.setSimpleField("test", "data");
testZkClient.setAsyncCallRC(CONNECTIONLOSS.intValue());
@@ -280,7 +279,7 @@ public class TestZkClientAsyncRetry extends ZkTestBase {
// 1. Test async set retry
ZkAsyncCallbacks.SetDataCallbackHandler setCallback =
new ZkAsyncCallbacks.SetDataCallbackHandler();
- Assert.assertEquals(setCallback.getRc(), UNKNOWN_RET_CODE);
+ Assert.assertEquals(setCallback.getRc(),
KeeperException.Code.APIERROR.intValue());
tmpRecord.setSimpleField("test", "data");
testZkClient.setAsyncCallRC(CONNECTIONLOSS.intValue());
@@ -317,7 +316,7 @@ public class TestZkClientAsyncRetry extends ZkTestBase {
// 1. Test async exist check
ZkAsyncCallbacks.ExistsCallbackHandler existsCallback =
new ZkAsyncCallbacks.ExistsCallbackHandler();
- Assert.assertEquals(existsCallback.getRc(), UNKNOWN_RET_CODE);
+ Assert.assertEquals(existsCallback.getRc(),
KeeperException.Code.APIERROR.intValue());
testZkClient.setAsyncCallRC(CONNECTIONLOSS.intValue());
// Async exist check will be pending due to the mock error rc is
retryable.
@@ -339,7 +338,7 @@ public class TestZkClientAsyncRetry extends ZkTestBase {
// 2. Test async get
ZkAsyncCallbacks.GetDataCallbackHandler getCallback =
new ZkAsyncCallbacks.GetDataCallbackHandler();
- Assert.assertEquals(getCallback.getRc(), UNKNOWN_RET_CODE);
+ Assert.assertEquals(getCallback.getRc(),
KeeperException.Code.APIERROR.intValue());
testZkClient.setAsyncCallRC(CONNECTIONLOSS.intValue());
// Async get will be pending due to the mock error rc is retryable.
@@ -423,7 +422,7 @@ public class TestZkClientAsyncRetry extends ZkTestBase {
// Test asyncGet failure
ZkAsyncCallbacks.GetDataCallbackHandler getCallback =
new ZkAsyncCallbacks.GetDataCallbackHandler();
- Assert.assertEquals(getCallback.getRc(), UNKNOWN_RET_CODE);
+ Assert.assertEquals(getCallback.getRc(),
KeeperException.Code.APIERROR.intValue());
// asyncGet should fail because the return code is APIERROR
testZkClient.setAsyncCallRC(KeeperException.Code.APIERROR.intValue());
testZkClient.asyncGetData(NODE_PATH, getCallback);
@@ -445,7 +444,7 @@ public class TestZkClientAsyncRetry extends ZkTestBase {
// Test asyncExists failure
ZkAsyncCallbacks.ExistsCallbackHandler existsCallback =
new ZkAsyncCallbacks.ExistsCallbackHandler();
- Assert.assertEquals(existsCallback.getRc(), UNKNOWN_RET_CODE);
+ Assert.assertEquals(existsCallback.getRc(),
KeeperException.Code.APIERROR.intValue());
// asyncExists should fail because the return code is APIERROR
testZkClient.setAsyncCallRC(KeeperException.Code.APIERROR.intValue());
testZkClient.asyncExists(NODE_PATH, existsCallback);
@@ -467,7 +466,7 @@ public class TestZkClientAsyncRetry extends ZkTestBase {
// Test asyncSet failure
ZkAsyncCallbacks.SetDataCallbackHandler setCallback =
new ZkAsyncCallbacks.SetDataCallbackHandler();
- Assert.assertEquals(setCallback.getRc(), UNKNOWN_RET_CODE);
+ Assert.assertEquals(setCallback.getRc(),
KeeperException.Code.APIERROR.intValue());
// asyncSet should fail because the return code is APIERROR
testZkClient.setAsyncCallRC(KeeperException.Code.APIERROR.intValue());
testZkClient.asyncSetData(NODE_PATH, tmpRecord, -1, setCallback);
@@ -481,7 +480,7 @@ public class TestZkClientAsyncRetry extends ZkTestBase {
// Test asyncDelete failure
ZkAsyncCallbacks.DeleteCallbackHandler deleteCallback =
new ZkAsyncCallbacks.DeleteCallbackHandler();
- Assert.assertEquals(deleteCallback.getRc(), UNKNOWN_RET_CODE);
+ Assert.assertEquals(deleteCallback.getRc(),
KeeperException.Code.APIERROR.intValue());
// asyncDelete should fail because the return code is APIERROR
testZkClient.setAsyncCallRC(KeeperException.Code.APIERROR.intValue());
testZkClient.asyncDelete(NODE_PATH, deleteCallback);