This is an automated email from the ASF dual-hosted git repository.
xyuanlu 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 c9402ea1e Fix the 'BadVersion' exception handling in doSet() code
path. (#2614)
c9402ea1e is described below
commit c9402ea1e1c50796ef58df0e96648e818088ee58
Author: Komal Desai <[email protected]>
AuthorDate: Tue Sep 12 09:50:01 2023 -0700
Fix the 'BadVersion' exception handling in doSet() code path. (#2614)
---
.../helix/manager/zk/ZkBaseDataAccessor.java | 3 +++
.../helix/manager/zk/TestZkBaseDataAccessor.java | 31 ++++++++++++++++++++++
2 files changed, 34 insertions(+)
diff --git
a/helix-core/src/main/java/org/apache/helix/manager/zk/ZkBaseDataAccessor.java
b/helix-core/src/main/java/org/apache/helix/manager/zk/ZkBaseDataAccessor.java
index e95fe3463..0c7a94f1b 100644
---
a/helix-core/src/main/java/org/apache/helix/manager/zk/ZkBaseDataAccessor.java
+++
b/helix-core/src/main/java/org/apache/helix/manager/zk/ZkBaseDataAccessor.java
@@ -393,6 +393,9 @@ public class ZkBaseDataAccessor<T> implements
BaseDataAccessor<T> {
result._retCode = RetCode.ERROR;
return result;
}
+ } catch (ZkBadVersionException e) {
+ LOG.debug("Exception while setting path: " + path, e);
+ throw e;
} catch (Exception e) {
LOG.error("Exception while setting path: " + path, e);
result._retCode = RetCode.ERROR;
diff --git
a/helix-core/src/test/java/org/apache/helix/manager/zk/TestZkBaseDataAccessor.java
b/helix-core/src/test/java/org/apache/helix/manager/zk/TestZkBaseDataAccessor.java
index 40abb2aee..8d9cd29d9 100644
---
a/helix-core/src/test/java/org/apache/helix/manager/zk/TestZkBaseDataAccessor.java
+++
b/helix-core/src/test/java/org/apache/helix/manager/zk/TestZkBaseDataAccessor.java
@@ -30,6 +30,7 @@ import org.apache.helix.AccessOption;
import org.apache.helix.BaseDataAccessor;
import org.apache.helix.PropertyPathBuilder;
import org.apache.helix.TestHelper;
+import org.apache.helix.zookeeper.api.client.HelixZkClient;
import org.apache.helix.zookeeper.api.client.RealmAwareZkClient;
import org.apache.helix.zookeeper.datamodel.ZNRecord;
import org.apache.helix.zookeeper.datamodel.ZNRecordUpdater;
@@ -38,6 +39,7 @@ import
org.apache.helix.manager.zk.ZkBaseDataAccessor.AccessResult;
import org.apache.helix.manager.zk.ZkBaseDataAccessor.RetCode;
import org.apache.helix.zookeeper.exception.ZkClientException;
import org.apache.helix.zookeeper.zkclient.DataUpdater;
+import org.apache.helix.zookeeper.zkclient.exception.ZkBadVersionException;
import org.apache.helix.zookeeper.zkclient.exception.ZkException;
import org.apache.helix.zookeeper.zkclient.exception.ZkMarshallingError;
import org.apache.helix.zookeeper.zkclient.serialize.ZkSerializer;
@@ -182,6 +184,35 @@ public class TestZkBaseDataAccessor extends ZkUnitTestBase
{
System.out.println("END " + testName + " at " + new
Date(System.currentTimeMillis()));
}
+ @Test
+ public void testDoSetWithException() {
+ String className = TestHelper.getTestClassName();
+ String methodName = TestHelper.getTestMethodName();
+ String testName = className + "_" + methodName;
+
+ System.out.println("START " + testName + " at " + new
Date(System.currentTimeMillis()));
+
+ String path = String.format("/%s/%s/%s", _rootPath, "msg_0", "submsg_0");
+ ZNRecord record = new ZNRecord("submsg_0");
+ ZkBaseDataAccessor<ZNRecord> accessor = new
ZkBaseDataAccessor<ZNRecord>(_gZkClient);
+ AccessResult result = accessor.doSet(path, record, -1,
AccessOption.PERSISTENT);
+ ZNRecord getRecord = _gZkClient.readData(path);
+
+ // create mock spy for _gZkClient
+ HelixZkClient mockZkClient = Mockito.spy(_gZkClient);
+
+ // mock so that _gZkClient throws ZkBadVersionException
+ Mockito.doThrow(new ZkBadVersionException(""))
+ .when(mockZkClient).writeDataGetStat(Mockito.anyString(),
Mockito.any(), Mockito.anyInt());
+
+ try {
+ accessor.doSet(path, record, getRecord.getVersion(),
AccessOption.PERSISTENT);
+ } catch (ZkBadVersionException e) {
+ // OK
+ }
+ System.out.println("END " + testName + " at " + new
Date(System.currentTimeMillis()));
+ }
+
@Test
public void testSyncCreate() {
String className = TestHelper.getTestClassName();