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 6ff99f5 Enforce result check for data accessors batch get calls to
prevent partial batch read. (#974)
6ff99f5 is described below
commit 6ff99f5a181fb5fe91340968f93ca2cd5329a90a
Author: Jiajun Wang <[email protected]>
AuthorDate: Thu May 14 17:34:22 2020 -0700
Enforce result check for data accessors batch get calls to prevent partial
batch read. (#974)
This will help to ensure the main Helix logic does not calculate based on
incomplete input.
---
.../java/org/apache/helix/BaseDataAccessor.java | 2 ++
.../java/org/apache/helix/HelixDataAccessor.java | 4 ++-
.../apache/helix/common/caches/TaskDataCache.java | 6 ++--
.../helix/controller/GenericHelixController.java | 9 +++---
.../apache/helix/manager/zk/CallbackHandler.java | 7 +++--
.../helix/manager/zk/ParticipantManager.java | 9 +++---
.../org/apache/helix/manager/zk/ZKHelixAdmin.java | 14 ++++-----
.../helix/manager/zk/ZKHelixDataAccessor.java | 2 +-
.../helix/manager/zk/ZkBaseDataAccessor.java | 2 ++
.../helix/manager/zk/ZkCacheBaseDataAccessor.java | 21 +++++++++-----
.../apache/helix/messaging/CriteriaEvaluator.java | 11 ++++++--
.../helix/messaging/DefaultMessagingService.java | 5 +++-
.../messaging/handling/HelixTaskExecutor.java | 13 +++++++--
.../helix/monitoring/ZKPathDataDumpTask.java | 3 +-
.../helix/spectator/RoutingTableProvider.java | 4 +--
.../helix/store/zk/AutoFallbackPropertyStore.java | 20 ++++++-------
.../java/org/apache/helix/task/TaskDriver.java | 2 +-
.../org/apache/helix/task/WorkflowDispatcher.java | 2 +-
.../helix/tools/ClusterExternalViewVerifier.java | 2 +-
.../apache/helix/tools/ClusterStateVerifier.java | 17 ++++++-----
.../BestPossibleExternalViewVerifier.java | 6 ++--
.../StrictMatchExternalViewVerifier.java | 3 +-
.../apache/helix/tools/commandtools/ZkCopy.java | 2 +-
.../org/apache/helix/util/StatusUpdateUtil.java | 4 +--
.../test/java/org/apache/helix/MockAccessor.java | 33 ++++++++++++----------
.../java/org/apache/helix/TestRoutingTable.java | 10 +++----
.../controller/stages/TestCustomizedViewStage.java | 6 ++--
.../controller/stages/TestExternalViewStage.java | 6 ++--
.../controller/stages/TestRebalancePipeline.java | 6 ++--
.../TestAddStateModelFactoryAfterConnect.java | 2 +-
.../TestMessagePartitionStateMismatch.java | 2 +-
.../TestNoThrottleDisabledPartitions.java | 11 +++++---
.../apache/helix/integration/TestStatusUpdate.java | 2 +-
.../controller/TestTargetExternalView.java | 9 +++---
.../integration/messaging/TestMessageThrottle.java | 2 +-
.../helix/integration/task/TaskTestUtil.java | 2 +-
.../manager/zk/TestWtCacheAsyncOpSingleThread.java | 4 +--
.../helix/manager/zk/TestZkBaseDataAccessor.java | 2 +-
.../manager/zk/TestZkCacheAsyncOpSingleThread.java | 4 +--
.../messaging/TestDefaultMessagingService.java | 5 ++--
.../messaging/handling/MockHelixTaskExecutor.java | 2 +-
.../messaging/handling/TestHelixTaskExecutor.java | 12 +++++---
.../messaging/p2pMessage/TestP2PMessages.java | 6 ++--
.../apache/helix/mock/MockBaseDataAccessor.java | 14 +++++----
.../apache/helix/mock/MockZkHelixDataAccessor.java | 12 +++-----
.../store/zk/TestAutoFallbackPropertyStore.java | 6 ++--
.../rest/server/service/ClusterServiceImpl.java | 2 +-
.../rest/server/service/InstanceServiceImpl.java | 12 ++++----
.../rest/server/service/TestClusterService.java | 9 ++++--
49 files changed, 202 insertions(+), 149 deletions(-)
diff --git a/helix-core/src/main/java/org/apache/helix/BaseDataAccessor.java
b/helix-core/src/main/java/org/apache/helix/BaseDataAccessor.java
index ba64664..69cad11 100644
--- a/helix-core/src/main/java/org/apache/helix/BaseDataAccessor.java
+++ b/helix-core/src/main/java/org/apache/helix/BaseDataAccessor.java
@@ -139,6 +139,7 @@ public interface BaseDataAccessor<T> {
* @param options Set the type of ZNode see the valid values in {@link
AccessOption}
* @return List of record data stored at each ZNode
*/
+ @Deprecated
List<T> get(List<String> paths, List<Stat> stats, int options);
/**
@@ -166,6 +167,7 @@ public interface BaseDataAccessor<T> {
* @param options Set the type of ZNode see the valid values in {@link
AccessOption}
* @return A list of children of the parent ZNode
*/
+ @Deprecated
List<T> getChildren(String parentPath, List<Stat> stats, int options);
/**
diff --git a/helix-core/src/main/java/org/apache/helix/HelixDataAccessor.java
b/helix-core/src/main/java/org/apache/helix/HelixDataAccessor.java
index 2a763df..cb47b58 100644
--- a/helix-core/src/main/java/org/apache/helix/HelixDataAccessor.java
+++ b/helix-core/src/main/java/org/apache/helix/HelixDataAccessor.java
@@ -90,6 +90,7 @@ public interface HelixDataAccessor {
* @param keys
* @return
*/
+ @Deprecated
<T extends HelixProperty> List<T> getProperty(List<PropertyKey> keys);
/**
@@ -141,6 +142,7 @@ public interface HelixDataAccessor {
* @param key
* @return subPropertyValues
*/
+ @Deprecated
<T extends HelixProperty> List<T> getChildValues(PropertyKey key);
/**
@@ -161,7 +163,7 @@ public interface HelixDataAccessor {
* @param key
* @return a map of property identifiers to typed properties
*/
-
+ @Deprecated
<T extends HelixProperty> Map<String, T> getChildValuesMap(PropertyKey key);
/**
diff --git
a/helix-core/src/main/java/org/apache/helix/common/caches/TaskDataCache.java
b/helix-core/src/main/java/org/apache/helix/common/caches/TaskDataCache.java
index b16e484..6d8100e 100644
--- a/helix-core/src/main/java/org/apache/helix/common/caches/TaskDataCache.java
+++ b/helix-core/src/main/java/org/apache/helix/common/caches/TaskDataCache.java
@@ -30,7 +30,6 @@ import java.util.concurrent.ConcurrentHashMap;
import org.apache.helix.AccessOption;
import org.apache.helix.HelixDataAccessor;
import org.apache.helix.PropertyType;
-import org.apache.helix.zookeeper.datamodel.ZNRecord;
import org.apache.helix.common.controllers.ControlContextProvider;
import org.apache.helix.controller.LogUtil;
import org.apache.helix.model.ResourceAssignment;
@@ -42,6 +41,7 @@ import org.apache.helix.task.RuntimeJobDag;
import org.apache.helix.task.TaskConstants;
import org.apache.helix.task.WorkflowConfig;
import org.apache.helix.task.WorkflowContext;
+import org.apache.helix.zookeeper.datamodel.ZNRecord;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -194,9 +194,9 @@ public class TaskDataCache extends AbstractDataCache {
}
}
- List<ZNRecord> contexts = accessor.getBaseDataAccessor().get(contextPaths,
null, 0);
+ List<ZNRecord> contexts = accessor.getBaseDataAccessor().get(contextPaths,
null, 0, true);
List<ZNRecord> prevAssignments =
- accessor.getBaseDataAccessor().get(prevAssignmentPaths, null, 0);
+ accessor.getBaseDataAccessor().get(prevAssignmentPaths, null, 0, true);
for (int i = 0; i < contexts.size(); i++) {
ZNRecord context = contexts.get(i);
diff --git
a/helix-core/src/main/java/org/apache/helix/controller/GenericHelixController.java
b/helix-core/src/main/java/org/apache/helix/controller/GenericHelixController.java
index 23f5285..b435914 100644
---
a/helix-core/src/main/java/org/apache/helix/controller/GenericHelixController.java
+++
b/helix-core/src/main/java/org/apache/helix/controller/GenericHelixController.java
@@ -287,15 +287,14 @@ public class GenericHelixController implements
IdealStateChangeListener, LiveIns
HelixDataAccessor accessor = _manager.getHelixDataAccessor();
PropertyKey.Builder keyBuilder = accessor.keyBuilder();
- Map<String, LiveInstance> liveInstanceMap =
- accessor.getChildValuesMap(keyBuilder.liveInstances());
+ List<LiveInstance> liveInstances =
+ accessor.getChildValues(keyBuilder.liveInstances(), true);
- if (liveInstanceMap != null && !liveInstanceMap.isEmpty()) {
+ if (liveInstances != null && !liveInstances.isEmpty()) {
NotificationContext changeContext = new
NotificationContext(_manager);
changeContext.setType(NotificationContext.Type.CALLBACK);
synchronized (_manager) {
- checkLiveInstancesObservation(new
ArrayList<>(liveInstanceMap.values()),
- changeContext);
+ checkLiveInstancesObservation(liveInstances, changeContext);
}
}
}
diff --git
a/helix-core/src/main/java/org/apache/helix/manager/zk/CallbackHandler.java
b/helix-core/src/main/java/org/apache/helix/manager/zk/CallbackHandler.java
index 58460a3..2346a05 100644
--- a/helix-core/src/main/java/org/apache/helix/manager/zk/CallbackHandler.java
+++ b/helix-core/src/main/java/org/apache/helix/manager/zk/CallbackHandler.java
@@ -41,6 +41,7 @@ import org.apache.helix.NotificationContext.Type;
import org.apache.helix.PropertyKey;
import org.apache.helix.PropertyPathConfig;
import org.apache.helix.SystemPropertyKeys;
+import org.apache.helix.api.exceptions.HelixMetaDataAccessException;
import org.apache.helix.api.listeners.BatchMode;
import org.apache.helix.api.listeners.ClusterConfigChangeListener;
import org.apache.helix.api.listeners.ConfigChangeListener;
@@ -525,7 +526,7 @@ public class CallbackHandler implements IZkChildListener,
IZkDataListener {
private <T extends HelixProperty> List<T> preFetch(PropertyKey key) {
if (_preFetchEnabled) {
- return _accessor.getChildValues(key);
+ return _accessor.getChildValues(key, true);
} else {
return Collections.emptyList();
}
@@ -600,7 +601,7 @@ public class CallbackHandler implements IZkChildListener,
IZkDataListener {
case TARGET_EXTERNAL_VIEW: {
// check if bucketized
BaseDataAccessor<ZNRecord> baseAccessor = new
ZkBaseDataAccessor<>(_zkClient);
- List<ZNRecord> records = baseAccessor.getChildren(path, null, 0);
+ List<ZNRecord> records = baseAccessor.getChildren(path, null, 0,
0, 0);
for (ZNRecord record : records) {
HelixProperty property = new HelixProperty(record);
String childPath = path + "/" + record.getId();
@@ -637,7 +638,7 @@ public class CallbackHandler implements IZkChildListener,
IZkDataListener {
break;
}
}
- } catch (ZkNoNodeException e) {
+ } catch (ZkNoNodeException | HelixMetaDataAccessException e) {
logger.warn(
"fail to subscribe child/data change. path: " + path + ",
listener: " + _listener, e);
}
diff --git
a/helix-core/src/main/java/org/apache/helix/manager/zk/ParticipantManager.java
b/helix-core/src/main/java/org/apache/helix/manager/zk/ParticipantManager.java
index 8bb54ff..6e9d579 100644
---
a/helix-core/src/main/java/org/apache/helix/manager/zk/ParticipantManager.java
+++
b/helix-core/src/main/java/org/apache/helix/manager/zk/ParticipantManager.java
@@ -53,7 +53,6 @@ import org.apache.helix.model.builder.HelixConfigScopeBuilder;
import org.apache.helix.participant.StateMachineEngine;
import
org.apache.helix.participant.statemachine.ScheduledTaskStateModelFactory;
import org.apache.helix.util.HelixUtil;
-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.ZNRecordBucketizer;
@@ -349,16 +348,18 @@ public class ParticipantManager {
continue;
}
+ // Ignore if any current states in the previous folder cannot be read.
List<CurrentState> lastCurStates =
-
_dataAccessor.getChildValues(_keyBuilder.currentStates(_instanceName, session));
+
_dataAccessor.getChildValues(_keyBuilder.currentStates(_instanceName, session),
false);
for (CurrentState lastCurState : lastCurStates) {
LOG.info("Carrying over old session: " + session + ", resource: " +
lastCurState.getId()
+ " to current session: " + _sessionId);
String stateModelDefRef = lastCurState.getStateModelDefRef();
if (stateModelDefRef == null) {
- LOG.error("skip carry-over because previous current state doesn't
have a state model definition. previous current-state: "
- + lastCurState);
+ LOG.error(
+ "skip carry-over because previous current state doesn't have a
state model definition. previous current-state: "
+ + lastCurState);
continue;
}
StateModelDefinition stateModel =
diff --git
a/helix-core/src/main/java/org/apache/helix/manager/zk/ZKHelixAdmin.java
b/helix-core/src/main/java/org/apache/helix/manager/zk/ZKHelixAdmin.java
index f100fec..1660570 100644
--- a/helix-core/src/main/java/org/apache/helix/manager/zk/ZKHelixAdmin.java
+++ b/helix-core/src/main/java/org/apache/helix/manager/zk/ZKHelixAdmin.java
@@ -626,7 +626,7 @@ public class ZKHelixAdmin implements HelixAdmin {
}
// check there is no pending messages for the partitions exist
- List<Message> messages =
accessor.getChildValues(keyBuilder.messages(instanceName));
+ List<Message> messages =
accessor.getChildValues(keyBuilder.messages(instanceName), true);
for (Message message : messages) {
if
(!MessageType.STATE_TRANSITION.name().equalsIgnoreCase(message.getMsgType()) ||
!sessionId
.equals(message.getTgtSessionId()) ||
!resourceName.equals(message.getResourceName())
@@ -685,9 +685,9 @@ public class ZKHelixAdmin implements HelixAdmin {
logger.info("Reset instances {} in cluster {}.",
instanceNames == null ? "NULL" :
HelixUtil.serializeByComma(instanceNames), clusterName);
HelixDataAccessor accessor =
- new ZKHelixDataAccessor(clusterName, new
ZkBaseDataAccessor<ZNRecord>(_zkClient));
+ new ZKHelixDataAccessor(clusterName, new
ZkBaseDataAccessor<>(_zkClient));
PropertyKey.Builder keyBuilder = accessor.keyBuilder();
- List<ExternalView> extViews =
accessor.getChildValues(keyBuilder.externalViews());
+ List<ExternalView> extViews =
accessor.getChildValues(keyBuilder.externalViews(), true);
Set<String> resetInstanceNames = new HashSet<String>(instanceNames);
for (String instanceName : resetInstanceNames) {
@@ -713,9 +713,9 @@ public class ZKHelixAdmin implements HelixAdmin {
logger.info("Reset resources {} in cluster {}.",
resourceNames == null ? "NULL" :
HelixUtil.serializeByComma(resourceNames), clusterName);
HelixDataAccessor accessor =
- new ZKHelixDataAccessor(clusterName, new
ZkBaseDataAccessor<ZNRecord>(_zkClient));
+ new ZKHelixDataAccessor(clusterName, new
ZkBaseDataAccessor<>(_zkClient));
PropertyKey.Builder keyBuilder = accessor.keyBuilder();
- List<ExternalView> extViews =
accessor.getChildValues(keyBuilder.externalViews());
+ List<ExternalView> extViews =
accessor.getChildValues(keyBuilder.externalViews(), true);
Set<String> resetResourceNames = new HashSet<String>(resourceNames);
for (ExternalView extView : extViews) {
@@ -1761,7 +1761,7 @@ public class ZKHelixAdmin implements HelixAdmin {
List<String> instances = new ArrayList<>();
String path = PropertyPathBuilder.instanceConfig(clusterName);
BaseDataAccessor<ZNRecord> baseAccessor = new
ZkBaseDataAccessor<>(_zkClient);
- List<ZNRecord> znRecords = baseAccessor.getChildren(path, null, 0);
+ List<ZNRecord> znRecords = baseAccessor.getChildren(path, null, 0, 0, 0);
for (ZNRecord record : znRecords) {
if (record != null) {
InstanceConfig instanceConfig = new InstanceConfig(record);
@@ -1840,7 +1840,7 @@ public class ZKHelixAdmin implements HelixAdmin {
HelixDataAccessor accessor =
new ZKHelixDataAccessor(clusterName, new
ZkBaseDataAccessor<>(_zkClient));
PropertyKey.Builder keyBuilder = accessor.keyBuilder();
- List<IdealState> idealStates =
accessor.getChildValues(keyBuilder.idealStates());
+ List<IdealState> idealStates =
accessor.getChildValues(keyBuilder.idealStates(), true);
List<String> nullIdealStates = new ArrayList<>();
for (int i = 0; i < idealStates.size(); i++) {
if (idealStates.get(i) == null) {
diff --git
a/helix-core/src/main/java/org/apache/helix/manager/zk/ZKHelixDataAccessor.java
b/helix-core/src/main/java/org/apache/helix/manager/zk/ZKHelixDataAccessor.java
index 9f9ddc9..daa00f3 100644
---
a/helix-core/src/main/java/org/apache/helix/manager/zk/ZKHelixDataAccessor.java
+++
b/helix-core/src/main/java/org/apache/helix/manager/zk/ZKHelixDataAccessor.java
@@ -313,7 +313,7 @@ public class ZKHelixDataAccessor implements
HelixDataAccessor {
property.getRecord().getMapFields().clear();
property.getRecord().getListFields().clear();
- List<ZNRecord> childRecords = _baseDataAccessor.getChildren(path,
null, options);
+ List<ZNRecord> childRecords = _baseDataAccessor.getChildren(path,
null, options, 0, 0);
ZNRecord assembledRecord = new
ZNRecordAssembler().assemble(childRecords);
// merge with parent node value
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 d5ea20b..3706b2d 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
@@ -482,6 +482,7 @@ public class ZkBaseDataAccessor<T> implements
BaseDataAccessor<T> {
/**
* async get
*/
+ @Deprecated
@Override
public List<T> get(List<String> paths, List<Stat> stats, int options) {
boolean[] needRead = new boolean[paths.size()];
@@ -584,6 +585,7 @@ public class ZkBaseDataAccessor<T> implements
BaseDataAccessor<T> {
* The retryCount and retryInterval will be ignored.
*/
// TODO: Change the behavior of getChildren when Helix starts migrating API.
+ @Deprecated
@Override
public List<T> getChildren(String parentPath, List<Stat> stats, int options)
{
return getChildren(parentPath, stats, options, false);
diff --git
a/helix-core/src/main/java/org/apache/helix/manager/zk/ZkCacheBaseDataAccessor.java
b/helix-core/src/main/java/org/apache/helix/manager/zk/ZkCacheBaseDataAccessor.java
index fdae5dc..78cc9dc 100644
---
a/helix-core/src/main/java/org/apache/helix/manager/zk/ZkCacheBaseDataAccessor.java
+++
b/helix-core/src/main/java/org/apache/helix/manager/zk/ZkCacheBaseDataAccessor.java
@@ -565,6 +565,7 @@ public class ZkCacheBaseDataAccessor<T> implements
HelixPropertyStore<T> {
return _baseAccessor.remove(serverPaths, options);
}
+ @Deprecated
@Override
public List<T> get(List<String> paths, List<Stat> stats, int options) {
return get(paths, stats, options, false);
@@ -675,8 +676,20 @@ public class ZkCacheBaseDataAccessor<T> implements
HelixPropertyStore<T> {
return _baseAccessor.getChildNames(serverParentPath, options);
}
+ @Deprecated
@Override
public List<T> getChildren(String parentPath, List<Stat> stats, int options)
{
+ return getChildren(parentPath, stats, options, false);
+ }
+
+ @Override
+ public List<T> getChildren(String parentPath, List<Stat> stats, int options,
int retryCount,
+ int retryInterval) throws HelixException {
+ // TODO add retry logic according to retryCount and retryInterval input
+ return getChildren(parentPath, stats, options, true);
+ }
+
+ private List<T> getChildren(String parentPath, List<Stat> stats, int
options, boolean throwException) {
List<String> childNames = getChildNames(parentPath, options);
if (childNames == null) {
return null;
@@ -688,13 +701,7 @@ public class ZkCacheBaseDataAccessor<T> implements
HelixPropertyStore<T> {
paths.add(path);
}
- return get(paths, stats, options);
- }
-
- @Override
- public List<T> getChildren(String parentPath, List<Stat> stats, int options,
int retryCount,
- int retryInterval) throws HelixException {
- return getChildren(parentPath, stats, options);
+ return get(paths, stats, options, throwException);
}
@Override
diff --git
a/helix-core/src/main/java/org/apache/helix/messaging/CriteriaEvaluator.java
b/helix-core/src/main/java/org/apache/helix/messaging/CriteriaEvaluator.java
index 32d6894..1499e53 100644
--- a/helix-core/src/main/java/org/apache/helix/messaging/CriteriaEvaluator.java
+++ b/helix-core/src/main/java/org/apache/helix/messaging/CriteriaEvaluator.java
@@ -94,7 +94,11 @@ public class CriteriaEvaluator {
List<ZNRecordRow> allRows =
ZNRecordRow.flatten(HelixProperty.convertToList(properties));
// save the matches
- Set<String> liveParticipants =
accessor.getChildValuesMap(keyBuilder.liveInstances()).keySet();
+ // TODO: Apply strict check on the getChildValuesMap() call.
+ // TODO: For backward compatibility, allow partial read for now. This may
reduce the
+ // TODO: match result eventually.
+ Set<String> liveParticipants =
+ accessor.getChildValuesMap(keyBuilder.liveInstances(), false).keySet();
List<ZNRecordRow> result = Lists.newArrayList();
for (ZNRecordRow row : allRows) {
// The participant instance name is stored in the return value of either
getRecordId() or
@@ -181,7 +185,10 @@ public class CriteriaEvaluator {
PropertyKey propertyKeys, PropertyKey propertyKey, String dataType) {
List<HelixProperty> properties;
if (Strings.isNullOrEmpty(dataSpec) || dataSpec.equals(MATCH_ALL_SYM)) {
- properties = accessor.getChildValues(propertyKeys);
+ // TODO: Apply strict check on the getChildValues() call.
+ // TODO: For backward compatibility, allow partial read for now. This
may reduce the
+ // TODO: matches eventually.
+ properties = accessor.getChildValues(propertyKeys, false);
} else {
HelixProperty data = accessor.getProperty(propertyKey);
if (data == null) {
diff --git
a/helix-core/src/main/java/org/apache/helix/messaging/DefaultMessagingService.java
b/helix-core/src/main/java/org/apache/helix/messaging/DefaultMessagingService.java
index 84aeafb..6785381 100644
---
a/helix-core/src/main/java/org/apache/helix/messaging/DefaultMessagingService.java
+++
b/helix-core/src/main/java/org/apache/helix/messaging/DefaultMessagingService.java
@@ -186,7 +186,10 @@ public class DefaultMessagingService implements
ClusterMessagingService {
Map<String, String> sessionIdMap = new HashMap<String, String>();
if (recipientCriteria.isSessionSpecific()) {
Builder keyBuilder = targetDataAccessor.keyBuilder();
- List<LiveInstance> liveInstances =
targetDataAccessor.getChildValues(keyBuilder.liveInstances());
+ // For backward compatibility, allow partial read for the live
instances.
+ // Note that this may cause the pending message to be sent with null
target session Id.
+ List<LiveInstance> liveInstances =
+ targetDataAccessor.getChildValues(keyBuilder.liveInstances(),
false);
for (LiveInstance liveInstance : liveInstances) {
sessionIdMap.put(liveInstance.getInstanceName(),
liveInstance.getEphemeralOwner());
diff --git
a/helix-core/src/main/java/org/apache/helix/messaging/handling/HelixTaskExecutor.java
b/helix-core/src/main/java/org/apache/helix/messaging/handling/HelixTaskExecutor.java
index d2292e7..dd16e89 100644
---
a/helix-core/src/main/java/org/apache/helix/messaging/handling/HelixTaskExecutor.java
+++
b/helix-core/src/main/java/org/apache/helix/messaging/handling/HelixTaskExecutor.java
@@ -719,7 +719,15 @@ public class HelixTaskExecutor implements MessageListener,
TaskExecutor {
}
}
- List<Message> newMessages = accessor.getProperty(keys);
+ /**
+ * Do not throw exception on partial message read.
+ * 1. There is no way to resolve the error on the participant side. And
once it fails here, we
+ * are running the risk of ignoring the message change event. And the
participant might be stuck.
+ * 2. Even this is a partial read, we have another chance to retry in the
business logic since
+ * as long as the participant processes messages, it will touch the
message folder and triggers
+ * another message event.
+ */
+ List<Message> newMessages = accessor.getProperty(keys, false);
// Message may be removed before get read, clean up null messages.
Iterator<Message> messageIterator = newMessages.iterator();
while(messageIterator.hasNext()) {
@@ -836,7 +844,8 @@ public class HelixTaskExecutor implements MessageListener,
TaskExecutor {
LOG.info(String.format("Controller received
PARTICIPANT_SESSION_CHANGE msg from src: %s",
message.getMsgSrc()));
PropertyKey key = new
Builder(manager.getClusterName()).liveInstances();
- List<LiveInstance> liveInstances =
manager.getHelixDataAccessor().getChildValues(key);
+ List<LiveInstance> liveInstances =
+ manager.getHelixDataAccessor().getChildValues(key, true);
_controller.onLiveInstanceChange(liveInstances, changeContext);
reportAndRemoveMessage(message, accessor, instanceName,
ProcessedMessageState.COMPLETED);
continue;
diff --git
a/helix-core/src/main/java/org/apache/helix/monitoring/ZKPathDataDumpTask.java
b/helix-core/src/main/java/org/apache/helix/monitoring/ZKPathDataDumpTask.java
index 1028b85..8732f2c 100644
---
a/helix-core/src/main/java/org/apache/helix/monitoring/ZKPathDataDumpTask.java
+++
b/helix-core/src/main/java/org/apache/helix/monitoring/ZKPathDataDumpTask.java
@@ -139,7 +139,8 @@ public class ZKPathDataDumpTask extends TimerTask {
if (!dumpPaths.isEmpty()) {
LOG.info("Dump statusUpdates and errors records for paths: " +
dumpPaths);
- List<ZNRecord> dumpRecords = accessor.get(dumpPaths, null, 0);
+ // No need to fail the batch read operation even it is partial result
becuase it is for cleaning up.
+ List<ZNRecord> dumpRecords = accessor.get(dumpPaths, null, 0, false);
for (ZNRecord record : dumpRecords) {
if (record != null) {
LOG.info(new String(_jsonSerializer.serialize(record)));
diff --git
a/helix-core/src/main/java/org/apache/helix/spectator/RoutingTableProvider.java
b/helix-core/src/main/java/org/apache/helix/spectator/RoutingTableProvider.java
index cfd4350..704f4c2 100644
---
a/helix-core/src/main/java/org/apache/helix/spectator/RoutingTableProvider.java
+++
b/helix-core/src/main/java/org/apache/helix/spectator/RoutingTableProvider.java
@@ -623,8 +623,8 @@ public class RoutingTableProvider
String keyReference =
generateReferenceKey(PropertyType.EXTERNALVIEW.name(), DEFAULT_STATE_TYPE);
HelixDataAccessor accessor =
changeContext.getManager().getHelixDataAccessor();
PropertyKey.Builder keyBuilder = accessor.keyBuilder();
- List<InstanceConfig> configList =
accessor.getChildValues(keyBuilder.instanceConfigs());
- List<LiveInstance> liveInstances =
accessor.getChildValues(keyBuilder.liveInstances());
+ List<InstanceConfig> configList =
accessor.getChildValues(keyBuilder.instanceConfigs(), true);
+ List<LiveInstance> liveInstances =
accessor.getChildValues(keyBuilder.liveInstances(), true);
refreshExternalView(externalViewList, configList, liveInstances,
keyReference);
} else {
ClusterEventType eventType;
diff --git
a/helix-core/src/main/java/org/apache/helix/store/zk/AutoFallbackPropertyStore.java
b/helix-core/src/main/java/org/apache/helix/store/zk/AutoFallbackPropertyStore.java
index 47b1dfa..54e6281 100644
---
a/helix-core/src/main/java/org/apache/helix/store/zk/AutoFallbackPropertyStore.java
+++
b/helix-core/src/main/java/org/apache/helix/store/zk/AutoFallbackPropertyStore.java
@@ -142,7 +142,7 @@ public class AutoFallbackPropertyStore<T> extends
ZkHelixPropertyStore<T> {
if (fallbackMap.size() > 0) {
List<String> fallbackPaths = new
ArrayList<String>(fallbackMap.keySet());
- List<T> fallbackValues = _fallbackStore.get(fallbackPaths, null,
options);
+ List<T> fallbackValues = _fallbackStore.get(fallbackPaths, null,
options, true);
boolean createSucceed[] =
super.createChildren(fallbackPaths, fallbackValues,
AccessOption.PERSISTENT);
@@ -217,24 +217,23 @@ public class AutoFallbackPropertyStore<T> extends
ZkHelixPropertyStore<T> {
}
@Override
- public List<T> get(List<String> paths, List<Stat> stats, int options) {
+ public List<T> get(List<String> paths, List<Stat> stats, int options,
boolean throwException) {
if (_fallbackStore == null) {
- return super.get(paths, stats, options);
+ return super.get(paths, stats, options, throwException);
} else {
- List<T> values = super.get(paths, stats, options);
-
- Map<String, Integer> fallbackMap = new HashMap<String, Integer>();
+ List<T> values = super.get(paths, stats, options, throwException);
+ Map<String, Integer> fallbackMap = new HashMap<>();
for (int i = 0; i < paths.size(); i++) {
T value = values.get(i);
if (value == null) {
fallbackMap.put(paths.get(i), i);
}
}
-
if (fallbackMap.size() > 0) {
- List<String> fallbackPaths = new
ArrayList<String>(fallbackMap.keySet());
- List<Stat> fallbackStats = new ArrayList<Stat>();
- List<T> fallbackValues = _fallbackStore.get(fallbackPaths,
fallbackStats, options);
+ List<String> fallbackPaths = new ArrayList<>(fallbackMap.keySet());
+ List<Stat> fallbackStats = new ArrayList<>();
+ List<T> fallbackValues =
+ _fallbackStore.get(fallbackPaths, fallbackStats, options,
throwException);
for (int i = 0; i < fallbackPaths.size(); i++) {
String fallbackPath = fallbackPaths.get(i);
int j = fallbackMap.get(fallbackPath);
@@ -244,7 +243,6 @@ public class AutoFallbackPropertyStore<T> extends
ZkHelixPropertyStore<T> {
}
}
}
-
return values;
}
}
diff --git a/helix-core/src/main/java/org/apache/helix/task/TaskDriver.java
b/helix-core/src/main/java/org/apache/helix/task/TaskDriver.java
index 506a06b..cbcaa70 100644
--- a/helix-core/src/main/java/org/apache/helix/task/TaskDriver.java
+++ b/helix-core/src/main/java/org/apache/helix/task/TaskDriver.java
@@ -854,7 +854,7 @@ public class TaskDriver {
public Map<String, WorkflowConfig> getWorkflows() {
Map<String, WorkflowConfig> workflowConfigMap = new HashMap<>();
Map<String, ResourceConfig> resourceConfigMap =
- _accessor.getChildValuesMap(_accessor.keyBuilder().resourceConfigs());
+ _accessor.getChildValuesMap(_accessor.keyBuilder().resourceConfigs(),
true);
for (Map.Entry<String, ResourceConfig> resource :
resourceConfigMap.entrySet()) {
try {
diff --git
a/helix-core/src/main/java/org/apache/helix/task/WorkflowDispatcher.java
b/helix-core/src/main/java/org/apache/helix/task/WorkflowDispatcher.java
index 11d6687..54a95f2 100644
--- a/helix-core/src/main/java/org/apache/helix/task/WorkflowDispatcher.java
+++ b/helix-core/src/main/java/org/apache/helix/task/WorkflowDispatcher.java
@@ -491,7 +491,7 @@ public class WorkflowDispatcher extends
AbstractTaskDispatcher {
HelixDataAccessor accessor = manager.getHelixDataAccessor();
PropertyKey.Builder keyBuilder = accessor.keyBuilder();
Map<String, HelixProperty> resourceConfigMap =
- accessor.getChildValuesMap(keyBuilder.resourceConfigs());
+ accessor.getChildValuesMap(keyBuilder.resourceConfigs(), true);
if (!resourceConfigMap.containsKey(origWorkflowName)) {
LOG.error("No such workflow named " + origWorkflowName);
return null;
diff --git
a/helix-core/src/main/java/org/apache/helix/tools/ClusterExternalViewVerifier.java
b/helix-core/src/main/java/org/apache/helix/tools/ClusterExternalViewVerifier.java
index d10ba71..6a4c0c9 100644
---
a/helix-core/src/main/java/org/apache/helix/tools/ClusterExternalViewVerifier.java
+++
b/helix-core/src/main/java/org/apache/helix/tools/ClusterExternalViewVerifier.java
@@ -156,7 +156,7 @@ public class ClusterExternalViewVerifier extends
ClusterVerifier {
BestPossibleStateOutput bestPossbileStates =
calculateBestPossibleState(cache);
Map<String, ExternalView> externalViews =
- _accessor.getChildValuesMap(_keyBuilder.externalViews());
+ _accessor.getChildValuesMap(_keyBuilder.externalViews(), true);
// TODO all ideal-states should be included in external-views
diff --git
a/helix-core/src/main/java/org/apache/helix/tools/ClusterStateVerifier.java
b/helix-core/src/main/java/org/apache/helix/tools/ClusterStateVerifier.java
index 80ccb68..5d8d1a0 100644
--- a/helix-core/src/main/java/org/apache/helix/tools/ClusterStateVerifier.java
+++ b/helix-core/src/main/java/org/apache/helix/tools/ClusterStateVerifier.java
@@ -42,8 +42,6 @@ import org.apache.helix.HelixDefinedState;
import org.apache.helix.PropertyKey;
import org.apache.helix.PropertyKey.Builder;
import org.apache.helix.PropertyPathBuilder;
-import org.apache.helix.zookeeper.impl.client.ZkClient;
-import org.apache.helix.zookeeper.datamodel.ZNRecord;
import org.apache.helix.api.listeners.PreFetch;
import
org.apache.helix.controller.dataproviders.ResourceControllerDataProvider;
import org.apache.helix.controller.pipeline.Stage;
@@ -58,13 +56,15 @@ import
org.apache.helix.controller.stages.ResourceComputationStage;
import org.apache.helix.manager.zk.ZKHelixDataAccessor;
import org.apache.helix.manager.zk.ZNRecordSerializer;
import org.apache.helix.manager.zk.ZkBaseDataAccessor;
-import org.apache.helix.zookeeper.impl.factory.DedicatedZkClientFactory;
-import org.apache.helix.zookeeper.api.client.HelixZkClient;
import org.apache.helix.model.ExternalView;
import org.apache.helix.model.IdealState;
import org.apache.helix.model.Partition;
import org.apache.helix.model.Resource;
import org.apache.helix.task.TaskConstants;
+import org.apache.helix.zookeeper.api.client.HelixZkClient;
+import org.apache.helix.zookeeper.datamodel.ZNRecord;
+import org.apache.helix.zookeeper.impl.client.ZkClient;
+import org.apache.helix.zookeeper.impl.factory.DedicatedZkClientFactory;
import org.apache.helix.zookeeper.zkclient.IZkChildListener;
import org.apache.helix.zookeeper.zkclient.IZkDataListener;
import org.apache.helix.zookeeper.zkclient.exception.ZkNodeExistsException;
@@ -212,7 +212,8 @@ public class ClusterStateVerifier {
}
}
- Map<String, ExternalView> extViews =
accessor.getChildValuesMap(keyBuilder.externalViews());
+ Map<String, ExternalView> extViews =
+ accessor.getChildValuesMap(keyBuilder.externalViews(), true);
if (extViews == null) {
extViews = Collections.emptyMap();
}
@@ -470,13 +471,15 @@ public class ClusterStateVerifier {
private boolean verifyMasterNbInExtView(HelixDataAccessor accessor) {
Builder keyBuilder = accessor.keyBuilder();
- Map<String, IdealState> idealStates =
accessor.getChildValuesMap(keyBuilder.idealStates());
+ Map<String, IdealState> idealStates =
+ accessor.getChildValuesMap(keyBuilder.idealStates(), true);
if (idealStates == null || idealStates.size() == 0) {
LOG.info("No resource idealState");
return true;
}
- Map<String, ExternalView> extViews =
accessor.getChildValuesMap(keyBuilder.externalViews());
+ Map<String, ExternalView> extViews =
+ accessor.getChildValuesMap(keyBuilder.externalViews(), true);
if (extViews == null || extViews.size() < idealStates.size()) {
LOG.info("No externalViews | externalView.size() < idealState.size()");
return false;
diff --git
a/helix-core/src/main/java/org/apache/helix/tools/ClusterVerifiers/BestPossibleExternalViewVerifier.java
b/helix-core/src/main/java/org/apache/helix/tools/ClusterVerifiers/BestPossibleExternalViewVerifier.java
index 12cdad4..aa663bc 100644
---
a/helix-core/src/main/java/org/apache/helix/tools/ClusterVerifiers/BestPossibleExternalViewVerifier.java
+++
b/helix-core/src/main/java/org/apache/helix/tools/ClusterVerifiers/BestPossibleExternalViewVerifier.java
@@ -246,12 +246,14 @@ public class BestPossibleExternalViewVerifier extends
ZkHelixClusterVerifier {
if (_expectLiveInstances != null && !_expectLiveInstances.isEmpty()) {
Set<String> actualLiveNodes =
_dataProvider.getLiveInstances().keySet();
if (!_expectLiveInstances.equals(actualLiveNodes)) {
- LOG.warn("Live instances are not as expected. Actual live nodes: " +
actualLiveNodes.toString());
+ LOG.warn("Live instances are not as expected. Actual live nodes: " +
actualLiveNodes
+ .toString());
return false;
}
}
- Map<String, ExternalView> extViews =
_accessor.getChildValuesMap(keyBuilder.externalViews());
+ Map<String, ExternalView> extViews =
+ _accessor.getChildValuesMap(keyBuilder.externalViews(), true);
if (extViews == null) {
extViews = Collections.emptyMap();
}
diff --git
a/helix-core/src/main/java/org/apache/helix/tools/ClusterVerifiers/StrictMatchExternalViewVerifier.java
b/helix-core/src/main/java/org/apache/helix/tools/ClusterVerifiers/StrictMatchExternalViewVerifier.java
index 987599e..7341012 100644
---
a/helix-core/src/main/java/org/apache/helix/tools/ClusterVerifiers/StrictMatchExternalViewVerifier.java
+++
b/helix-core/src/main/java/org/apache/helix/tools/ClusterVerifiers/StrictMatchExternalViewVerifier.java
@@ -227,7 +227,8 @@ public class StrictMatchExternalViewVerifier extends
ZkHelixClusterVerifier {
}
}
- Map<String, ExternalView> extViews =
_accessor.getChildValuesMap(keyBuilder.externalViews());
+ Map<String, ExternalView> extViews =
+ _accessor.getChildValuesMap(keyBuilder.externalViews(), true);
if (extViews == null) {
extViews = Collections.emptyMap();
}
diff --git
a/helix-core/src/main/java/org/apache/helix/tools/commandtools/ZkCopy.java
b/helix-core/src/main/java/org/apache/helix/tools/commandtools/ZkCopy.java
index 2ea48a3..af112a6 100644
--- a/helix-core/src/main/java/org/apache/helix/tools/commandtools/ZkCopy.java
+++ b/helix-core/src/main/java/org/apache/helix/tools/commandtools/ZkCopy.java
@@ -108,7 +108,7 @@ public class ZkCopy {
readPaths.add(concatenate(srcRootPath, path));
}
List<Stat> stats = new ArrayList<Stat>();
- List<Object> readData = srcAccessor.get(readPaths, stats, 0);
+ List<Object> readData = srcAccessor.get(readPaths, stats, 0, true);
List<String> writePaths = new ArrayList<String>();
List<Object> writeData = new ArrayList<Object>();
diff --git
a/helix-core/src/main/java/org/apache/helix/util/StatusUpdateUtil.java
b/helix-core/src/main/java/org/apache/helix/util/StatusUpdateUtil.java
index 7a82347..a7558b6 100644
--- a/helix-core/src/main/java/org/apache/helix/util/StatusUpdateUtil.java
+++ b/helix-core/src/main/java/org/apache/helix/util/StatusUpdateUtil.java
@@ -39,11 +39,11 @@ import org.apache.helix.HelixProperty;
import org.apache.helix.InstanceType;
import org.apache.helix.PropertyKey;
import org.apache.helix.PropertyKey.Builder;
-import org.apache.helix.zookeeper.datamodel.ZNRecord;
import org.apache.helix.model.Error;
import org.apache.helix.model.Message;
import org.apache.helix.model.Message.MessageType;
import org.apache.helix.model.StatusUpdate;
+import org.apache.helix.zookeeper.datamodel.ZNRecord;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -133,7 +133,7 @@ public class StatusUpdateUtil {
Builder keyBuilder = accessor.keyBuilder();
List<ZNRecord> instances =
-
HelixProperty.convertToList(accessor.getChildValues(keyBuilder.instanceConfigs()));
+
HelixProperty.convertToList(accessor.getChildValues(keyBuilder.instanceConfigs(),
true));
List<ZNRecord> partitionRecords = new ArrayList<ZNRecord>();
for (ZNRecord znRecord : instances) {
String instanceName = znRecord.getId();
diff --git a/helix-core/src/test/java/org/apache/helix/MockAccessor.java
b/helix-core/src/test/java/org/apache/helix/MockAccessor.java
index e61bcfa..a6f66d7 100644
--- a/helix-core/src/test/java/org/apache/helix/MockAccessor.java
+++ b/helix-core/src/test/java/org/apache/helix/MockAccessor.java
@@ -30,11 +30,11 @@ import org.apache.helix.model.MaintenanceSignal;
import org.apache.helix.model.Message;
import org.apache.helix.model.PauseSignal;
import org.apache.helix.model.StateModelDefinition;
+import org.apache.helix.zookeeper.datamodel.ZNRecord;
+import org.apache.helix.zookeeper.datamodel.ZNRecordUpdater;
import org.apache.helix.zookeeper.zkclient.DataUpdater;
import org.apache.helix.zookeeper.zkclient.exception.ZkNoNodeException;
import org.apache.zookeeper.data.Stat;
-import org.apache.helix.zookeeper.datamodel.ZNRecordUpdater;
-import org.apache.helix.zookeeper.datamodel.ZNRecord;
public class MockAccessor implements HelixDataAccessor {
@@ -193,28 +193,30 @@ public class MockAccessor implements HelixDataAccessor {
}
@SuppressWarnings("unchecked")
+ @Deprecated
@Override
public <T extends HelixProperty> List<T> getChildValues(PropertyKey
propertyKey) {
- String path = propertyKey.getPath(); // PropertyPathConfig.getPath(type,
- List<ZNRecord> children = _baseDataAccessor.getChildren(path, null, 0);
- return (List<T>)
HelixProperty.convertToTypedList(propertyKey.getTypeClass(), children);
+ return getChildValues(propertyKey, false);
}
@Override
public <T extends HelixProperty> List<T> getChildValues(PropertyKey key,
boolean throwException) {
- return getChildValues(key);
+ String path = key.getPath(); // PropertyPathConfig.getPath(type,
+ List<ZNRecord> children = _baseDataAccessor.getChildren(path, null, 0, 0,
0);
+ return (List<T>) HelixProperty.convertToTypedList(key.getTypeClass(),
children);
}
+ @Deprecated
@Override
public <T extends HelixProperty> Map<String, T>
getChildValuesMap(PropertyKey key) {
- List<T> list = getChildValues(key);
- return HelixProperty.convertListToMap(list);
+ return getChildValuesMap(key, false);
}
@Override
public <T extends HelixProperty> Map<String, T>
getChildValuesMap(PropertyKey key,
boolean throwException) {
- return getChildValuesMap(key);
+ List<T> list = getChildValues(key, throwException);
+ return HelixProperty.convertListToMap(list);
}
@Override
@@ -248,8 +250,15 @@ public class MockAccessor implements HelixDataAccessor {
return _baseDataAccessor.updateChildren(paths, updaters, options);
}
+ @Deprecated
@Override
public <T extends HelixProperty> List<T> getProperty(List<PropertyKey> keys)
{
+ return getProperty(keys, false);
+ }
+
+ @Override
+ public <T extends HelixProperty> List<T> getProperty(List<PropertyKey> keys,
+ boolean throwException) {
List<T> list = new ArrayList<T>();
for (PropertyKey key : keys) {
@SuppressWarnings("unchecked")
@@ -258,10 +267,4 @@ public class MockAccessor implements HelixDataAccessor {
}
return list;
}
-
- @Override
- public <T extends HelixProperty> List<T> getProperty(List<PropertyKey> keys,
- boolean throwException) {
- return getProperty(keys);
- }
}
diff --git a/helix-core/src/test/java/org/apache/helix/TestRoutingTable.java
b/helix-core/src/test/java/org/apache/helix/TestRoutingTable.java
index fdd5e5c..d0a8d53 100644
--- a/helix-core/src/test/java/org/apache/helix/TestRoutingTable.java
+++ b/helix-core/src/test/java/org/apache/helix/TestRoutingTable.java
@@ -62,12 +62,12 @@ public class TestRoutingTable {
_mockAccessor = new MockAccessor() {
@SuppressWarnings("unchecked")
@Override
- public <T extends HelixProperty> List<T>
getChildValues(PropertyKey key)
- {
+ public <T extends HelixProperty> List<T>
getChildValues(PropertyKey key,
+ boolean throwException) {
PropertyType type = key.getType();
String[] keys = key.getParams();
- if (type == PropertyType.CONFIGS && keys != null && keys.length
> 1
- &&
keys[1].equalsIgnoreCase(ConfigScopeProperty.PARTICIPANT.toString())) {
+ if (type == PropertyType.CONFIGS && keys != null && keys.length
> 1 && keys[1]
+
.equalsIgnoreCase(ConfigScopeProperty.PARTICIPANT.toString())) {
List<InstanceConfig> configs = new ArrayList<InstanceConfig>();
for (String instanceName : array) {
InstanceConfig config = new InstanceConfig(instanceName);
@@ -79,7 +79,7 @@ public class TestRoutingTable {
return (List<T>) configs;
}
return Collections.emptyList();
- };
+ }
};
}
return _mockAccessor;
diff --git
a/helix-core/src/test/java/org/apache/helix/controller/stages/TestCustomizedViewStage.java
b/helix-core/src/test/java/org/apache/helix/controller/stages/TestCustomizedViewStage.java
index 5c04daf..3b061f0 100644
---
a/helix-core/src/test/java/org/apache/helix/controller/stages/TestCustomizedViewStage.java
+++
b/helix-core/src/test/java/org/apache/helix/controller/stages/TestCustomizedViewStage.java
@@ -96,10 +96,10 @@ public class TestCustomizedViewStage extends ZkUnitTestBase
{
// Assure there is no customized view got updated when running the stage
again
List<CustomizedView> oldCustomizedViews =
- accessor.getChildValues(accessor.keyBuilder().customizedViews());
+ accessor.getChildValues(accessor.keyBuilder().customizedViews(), true);
runStage(event, customizedViewComputeStage);
List<CustomizedView> newCustomizedViews =
- accessor.getChildValues(accessor.keyBuilder().customizedViews());
+ accessor.getChildValues(accessor.keyBuilder().customizedViews(), true);
Assert.assertEquals(oldCustomizedViews, newCustomizedViews);
for (int i = 0; i < oldCustomizedViews.size(); i++) {
Assert.assertEquals(oldCustomizedViews.get(i).getStat().getVersion(),
@@ -112,4 +112,4 @@ public class TestCustomizedViewStage extends ZkUnitTestBase
{
deleteLiveInstances(clusterName);
deleteCluster(clusterName);
}
-}
\ No newline at end of file
+}
diff --git
a/helix-core/src/test/java/org/apache/helix/controller/stages/TestExternalViewStage.java
b/helix-core/src/test/java/org/apache/helix/controller/stages/TestExternalViewStage.java
index 15df283..b48c866 100644
---
a/helix-core/src/test/java/org/apache/helix/controller/stages/TestExternalViewStage.java
+++
b/helix-core/src/test/java/org/apache/helix/controller/stages/TestExternalViewStage.java
@@ -67,14 +67,14 @@ public class TestExternalViewStage extends ZkUnitTestBase {
runStage(event, new CurrentStateComputationStage());
runStage(event, externalViewComputeStage);
Assert.assertEquals(cache.getExternalViews().values(),
- accessor.getChildValues(accessor.keyBuilder().externalViews()));
+ accessor.getChildValues(accessor.keyBuilder().externalViews(), true));
// Assure there is no external got updated
List<ExternalView> oldExternalViews =
- accessor.getChildValues(accessor.keyBuilder().externalViews());
+ accessor.getChildValues(accessor.keyBuilder().externalViews(), true);
runStage(event, externalViewComputeStage);
List<ExternalView> newExternalViews =
- accessor.getChildValues(accessor.keyBuilder().externalViews());
+ accessor.getChildValues(accessor.keyBuilder().externalViews(), true);
Assert.assertEquals(oldExternalViews, newExternalViews);
for (int i = 0; i < oldExternalViews.size(); i++) {
Assert.assertEquals(oldExternalViews.get(i).getStat().getVersion(),
diff --git
a/helix-core/src/test/java/org/apache/helix/controller/stages/TestRebalancePipeline.java
b/helix-core/src/test/java/org/apache/helix/controller/stages/TestRebalancePipeline.java
index 723185b..04ed5cc 100644
---
a/helix-core/src/test/java/org/apache/helix/controller/stages/TestRebalancePipeline.java
+++
b/helix-core/src/test/java/org/apache/helix/controller/stages/TestRebalancePipeline.java
@@ -203,8 +203,8 @@ public class TestRebalancePipeline extends ZkUnitTestBase {
Assert.assertTrue(TestHelper.verify(() -> {
allMsgs.clear();
for (LiveInstance liveInstance : liveInstances) {
- allMsgs
-
.addAll(accessor.getChildValues(keyBuilder.messages(liveInstance.getInstanceName())));
+
allMsgs.addAll(accessor.getChildValues(keyBuilder.messages(liveInstance.getInstanceName()),
+ true));
}
if (allMsgs.size() != 1 || !allMsgs.get(0).getToState().equals("MASTER")
|| !allMsgs.get(0)
.getFromState().equals("SLAVE")) {
@@ -311,7 +311,7 @@ public class TestRebalancePipeline extends ZkUnitTestBase {
// message, make sure controller should not send O->DROPPED until O->S is
done
HelixAdmin admin = new ZKHelixAdmin(_gZkClient);
admin.dropResource(clusterName, resourceName);
- List<IdealState> idealStates =
accessor.getChildValues(accessor.keyBuilder().idealStates());
+ List<IdealState> idealStates =
accessor.getChildValues(accessor.keyBuilder().idealStates(), true);
cache.setIdealStates(idealStates);
runPipeline(event, dataRefresh);
diff --git
a/helix-core/src/test/java/org/apache/helix/integration/TestAddStateModelFactoryAfterConnect.java
b/helix-core/src/test/java/org/apache/helix/integration/TestAddStateModelFactoryAfterConnect.java
index 9106587..3de3de5 100644
---
a/helix-core/src/test/java/org/apache/helix/integration/TestAddStateModelFactoryAfterConnect.java
+++
b/helix-core/src/test/java/org/apache/helix/integration/TestAddStateModelFactoryAfterConnect.java
@@ -97,7 +97,7 @@ public class TestAddStateModelFactoryAfterConnect extends
ZkTestBase {
totalMsgs = 0;
for (int i = 0; i < n; i++) {
List<Message> msgs =
-
accessor.getChildValues(keyBuilder.messages(participants[i].getInstanceName()));
+
accessor.getChildValues(keyBuilder.messages(participants[i].getInstanceName()),
true);
totalMsgs += msgs.size();
}
diff --git
a/helix-core/src/test/java/org/apache/helix/integration/TestMessagePartitionStateMismatch.java
b/helix-core/src/test/java/org/apache/helix/integration/TestMessagePartitionStateMismatch.java
index f353ca5..895cb87 100644
---
a/helix-core/src/test/java/org/apache/helix/integration/TestMessagePartitionStateMismatch.java
+++
b/helix-core/src/test/java/org/apache/helix/integration/TestMessagePartitionStateMismatch.java
@@ -45,7 +45,7 @@ public class TestMessagePartitionStateMismatch extends
ZkStandAloneCMTestBase {
Builder kb = accessor.keyBuilder();
ExternalView ev = accessor.getProperty(kb.externalView(TEST_DB));
Map<String, LiveInstance> liveinstanceMap =
- accessor.getChildValuesMap(accessor.keyBuilder().liveInstances());
+ accessor.getChildValuesMap(accessor.keyBuilder().liveInstances(),
true);
for (String instanceName : liveinstanceMap.keySet()) {
String sessionid = liveinstanceMap.get(instanceName).getEphemeralOwner();
diff --git
a/helix-core/src/test/java/org/apache/helix/integration/TestNoThrottleDisabledPartitions.java
b/helix-core/src/test/java/org/apache/helix/integration/TestNoThrottleDisabledPartitions.java
index 07eaf4e..249a458 100644
---
a/helix-core/src/test/java/org/apache/helix/integration/TestNoThrottleDisabledPartitions.java
+++
b/helix-core/src/test/java/org/apache/helix/integration/TestNoThrottleDisabledPartitions.java
@@ -26,7 +26,6 @@ import java.util.Map;
import org.apache.helix.HelixDataAccessor;
import org.apache.helix.PropertyKey;
import org.apache.helix.TestHelper;
-import org.apache.helix.zookeeper.datamodel.ZNRecord;
import org.apache.helix.api.config.StateTransitionThrottleConfig;
import org.apache.helix.common.ZkTestBase;
import org.apache.helix.integration.manager.ClusterControllerManager;
@@ -40,6 +39,7 @@ import org.apache.helix.model.InstanceConfig;
import org.apache.helix.model.LiveInstance;
import org.apache.helix.model.builder.FullAutoModeISBuilder;
import
org.apache.helix.tools.ClusterVerifiers.BestPossibleExternalViewVerifier;
+import org.apache.helix.zookeeper.datamodel.ZNRecord;
import org.testng.Assert;
import org.testng.annotations.Test;
@@ -90,7 +90,8 @@ public class TestNoThrottleDisabledPartitions extends
ZkTestBase {
if (liveInstance != null) {
String sessionId = liveInstance.getEphemeralOwner();
List<CurrentState> currentStates = _accessor.getChildValues(
-
_accessor.keyBuilder().currentStates(_participants[0].getInstanceName(),
sessionId));
+
_accessor.keyBuilder().currentStates(_participants[0].getInstanceName(),
sessionId),
+ true);
for (CurrentState currentState : currentStates) {
for (Map.Entry<String, String> partitionState :
currentState.getPartitionStateMap()
.entrySet()) {
@@ -144,7 +145,8 @@ public class TestNoThrottleDisabledPartitions extends
ZkTestBase {
if (liveInstance != null) {
String sessionId = liveInstance.getEphemeralOwner();
List<CurrentState> currentStates = _accessor.getChildValues(
-
_accessor.keyBuilder().currentStates(_participants[0].getInstanceName(),
sessionId));
+
_accessor.keyBuilder().currentStates(_participants[0].getInstanceName(),
sessionId),
+ true);
for (CurrentState currentState : currentStates) {
for (Map.Entry<String, String> partitionState :
currentState.getPartitionStateMap()
.entrySet()) {
@@ -203,7 +205,8 @@ public class TestNoThrottleDisabledPartitions extends
ZkTestBase {
if (liveInstance != null) {
String sessionId = liveInstance.getEphemeralOwner();
List<CurrentState> currentStates = _accessor.getChildValues(
-
_accessor.keyBuilder().currentStates(_participants[0].getInstanceName(),
sessionId));
+
_accessor.keyBuilder().currentStates(_participants[0].getInstanceName(),
sessionId),
+ true);
for (CurrentState currentState : currentStates) {
for (Map.Entry<String, String> partitionState :
currentState.getPartitionStateMap()
.entrySet()) {
diff --git
a/helix-core/src/test/java/org/apache/helix/integration/TestStatusUpdate.java
b/helix-core/src/test/java/org/apache/helix/integration/TestStatusUpdate.java
index 4ee33d4..fbbc320 100644
---
a/helix-core/src/test/java/org/apache/helix/integration/TestStatusUpdate.java
+++
b/helix-core/src/test/java/org/apache/helix/integration/TestStatusUpdate.java
@@ -41,7 +41,7 @@ public class TestStatusUpdate extends ZkStandAloneCMTestBase {
new ZKHelixDataAccessor(CLUSTER_NAME, new
ZkBaseDataAccessor(_gZkClient));
Builder keyBuilder = accessor.keyBuilder();
- List<ExternalView> extViews =
accessor.getChildValues(keyBuilder.externalViews());
+ List<ExternalView> extViews =
accessor.getChildValues(keyBuilder.externalViews(), true);
Assert.assertNotNull(extViews);
for (ExternalView extView : extViews) {
diff --git
a/helix-core/src/test/java/org/apache/helix/integration/controller/TestTargetExternalView.java
b/helix-core/src/test/java/org/apache/helix/integration/controller/TestTargetExternalView.java
index 271682f..591e2d3 100644
---
a/helix-core/src/test/java/org/apache/helix/integration/controller/TestTargetExternalView.java
+++
b/helix-core/src/test/java/org/apache/helix/integration/controller/TestTargetExternalView.java
@@ -68,8 +68,9 @@ public class TestTargetExternalView extends TaskTestBase {
_accessor.getChildNames(_accessor.keyBuilder().targetExternalViews()).size(),
3);
List<ExternalView> targetExternalViews =
- _accessor.getChildValues(_accessor.keyBuilder().externalViews());
- List<IdealState> idealStates =
_accessor.getChildValues(_accessor.keyBuilder().idealStates());
+ _accessor.getChildValues(_accessor.keyBuilder().externalViews(), true);
+ List<IdealState> idealStates =
+ _accessor.getChildValues(_accessor.keyBuilder().idealStates(), true);
for (int i = 0; i < idealStates.size(); i++) {
Assert.assertEquals(targetExternalViews.get(i).getRecord().getMapFields(),
@@ -84,8 +85,8 @@ public class TestTargetExternalView extends TaskTestBase {
Assert.assertTrue(verifier.verifyByPolling());
Thread.sleep(1000);
- targetExternalViews =
_accessor.getChildValues(_accessor.keyBuilder().externalViews());
- idealStates =
_accessor.getChildValues(_accessor.keyBuilder().idealStates());
+ targetExternalViews =
_accessor.getChildValues(_accessor.keyBuilder().externalViews(), true);
+ idealStates =
_accessor.getChildValues(_accessor.keyBuilder().idealStates(), true);
for (int i = 0; i < idealStates.size(); i++) {
Assert.assertEquals(targetExternalViews.get(i).getRecord().getMapFields(),
diff --git
a/helix-core/src/test/java/org/apache/helix/integration/messaging/TestMessageThrottle.java
b/helix-core/src/test/java/org/apache/helix/integration/messaging/TestMessageThrottle.java
index 0e1c9c3..fa31575 100644
---
a/helix-core/src/test/java/org/apache/helix/integration/messaging/TestMessageThrottle.java
+++
b/helix-core/src/test/java/org/apache/helix/integration/messaging/TestMessageThrottle.java
@@ -94,7 +94,7 @@ public class TestMessageThrottle extends ZkTestBase {
throws Exception {
if (currentChilds != null && currentChilds.size() > 1) {
List<ZNRecord> records =
- accessor.getBaseDataAccessor().getChildren(parentPath, null,
0);
+ accessor.getBaseDataAccessor().getChildren(parentPath, null,
0, 0, 0);
int transitionMsgCount = 0;
for (ZNRecord record : records) {
Message msg = new Message(record);
diff --git
a/helix-core/src/test/java/org/apache/helix/integration/task/TaskTestUtil.java
b/helix-core/src/test/java/org/apache/helix/integration/task/TaskTestUtil.java
index 23f99a0..892b7b1 100644
---
a/helix-core/src/test/java/org/apache/helix/integration/task/TaskTestUtil.java
+++
b/helix-core/src/test/java/org/apache/helix/integration/task/TaskTestUtil.java
@@ -343,7 +343,7 @@ public class TaskTestUtil {
long startTime = System.currentTimeMillis();
while (true) {
- List<Message> messages = accessor.getChildValues(propertyKey);
+ List<Message> messages = accessor.getChildValues(propertyKey, true);
if (allTasksBlock(messages, numTask)) {
return true;
} else if (startTime + timeout < System.currentTimeMillis()) {
diff --git
a/helix-core/src/test/java/org/apache/helix/manager/zk/TestWtCacheAsyncOpSingleThread.java
b/helix-core/src/test/java/org/apache/helix/manager/zk/TestWtCacheAsyncOpSingleThread.java
index e84d1b0..1d1d29d 100644
---
a/helix-core/src/test/java/org/apache/helix/manager/zk/TestWtCacheAsyncOpSingleThread.java
+++
b/helix-core/src/test/java/org/apache/helix/manager/zk/TestWtCacheAsyncOpSingleThread.java
@@ -132,14 +132,14 @@ public class TestWtCacheAsyncOpSingleThread extends
ZkUnitTestBase {
paths.add(path);
}
- records = accessor.get(paths, null, 0);
+ records = accessor.get(paths, null, 0, true);
for (int i = 0; i < 10; i++) {
Assert.assertEquals(records.get(i).getId(), "TestDB" + i);
}
// getChildren
records.clear();
- records = accessor.getChildren(extViewPath, null, 0);
+ records = accessor.getChildren(extViewPath, null, 0, 0, 0);
for (int i = 0; i < 10; i++) {
Assert.assertEquals(records.get(i).getId(), "TestDB" + i);
}
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 9e56b6e..3d78c99 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
@@ -567,7 +567,7 @@ public class TestZkBaseDataAccessor extends ZkUnitTestBase {
// test async getChildren
String parentPath = PropertyPathBuilder.instanceMessage(root, "host_1");
- records = accessor.getChildren(parentPath, null, 0);
+ records = accessor.getChildren(parentPath, null, 0, 0, 0);
for (int i = 0; i < 10; i++) {
String msgId = "msg_" + i;
ZNRecord record = records.get(i);
diff --git
a/helix-core/src/test/java/org/apache/helix/manager/zk/TestZkCacheAsyncOpSingleThread.java
b/helix-core/src/test/java/org/apache/helix/manager/zk/TestZkCacheAsyncOpSingleThread.java
index 4531722..142af2f 100644
---
a/helix-core/src/test/java/org/apache/helix/manager/zk/TestZkCacheAsyncOpSingleThread.java
+++
b/helix-core/src/test/java/org/apache/helix/manager/zk/TestZkCacheAsyncOpSingleThread.java
@@ -368,14 +368,14 @@ public class TestZkCacheAsyncOpSingleThread extends
ZkUnitTestBase {
paths.add(path);
}
- records = accessor.get(paths, null, 0);
+ records = accessor.get(paths, null, 0, true);
for (int i = 0; i < 10; i++) {
Assert.assertEquals(records.get(i).getId(), "TestDB" + i);
}
// getChildren
records.clear();
- records = accessor.getChildren(extViewPath, null, 0);
+ records = accessor.getChildren(extViewPath, null, 0, 0, 0);
for (int i = 0; i < 10; i++) {
Assert.assertEquals(records.get(i).getId(), "TestDB" + i);
}
diff --git
a/helix-core/src/test/java/org/apache/helix/messaging/TestDefaultMessagingService.java
b/helix-core/src/test/java/org/apache/helix/messaging/TestDefaultMessagingService.java
index dcd5754..c1f3ee1 100644
---
a/helix-core/src/test/java/org/apache/helix/messaging/TestDefaultMessagingService.java
+++
b/helix-core/src/test/java/org/apache/helix/messaging/TestDefaultMessagingService.java
@@ -34,7 +34,6 @@ import org.apache.helix.MockAccessor;
import org.apache.helix.NotificationContext;
import org.apache.helix.PropertyKey;
import org.apache.helix.PropertyType;
-import org.apache.helix.zookeeper.datamodel.ZNRecord;
import org.apache.helix.messaging.handling.HelixTaskResult;
import org.apache.helix.messaging.handling.MessageHandler;
import org.apache.helix.messaging.handling.MessageHandlerFactory;
@@ -44,6 +43,7 @@ import org.apache.helix.model.ExternalView;
import org.apache.helix.model.LiveInstance.LiveInstanceProperty;
import org.apache.helix.model.Message;
import org.apache.helix.tools.DefaultIdealStateCalculator;
+import org.apache.helix.zookeeper.datamodel.ZNRecord;
import org.testng.Assert;
import org.testng.AssertJUnit;
import org.testng.annotations.Test;
@@ -63,7 +63,8 @@ public class TestDefaultMessagingService {
}
@Override
- public <T extends HelixProperty> List<T> getChildValues(PropertyKey key)
{
+ public <T extends HelixProperty> List<T> getChildValues(PropertyKey key,
+ boolean throwException) {
PropertyType type = key.getType();
List<T> result = new ArrayList<T>();
Class<? extends HelixProperty> clazz = key.getTypeClass();
diff --git
a/helix-core/src/test/java/org/apache/helix/messaging/handling/MockHelixTaskExecutor.java
b/helix-core/src/test/java/org/apache/helix/messaging/handling/MockHelixTaskExecutor.java
index f7934d2..8cb0522 100644
---
a/helix-core/src/test/java/org/apache/helix/messaging/handling/MockHelixTaskExecutor.java
+++
b/helix-core/src/test/java/org/apache/helix/messaging/handling/MockHelixTaskExecutor.java
@@ -56,7 +56,7 @@ public class MockHelixTaskExecutor extends HelixTaskExecutor {
HelixDataAccessor accessor = manager.getHelixDataAccessor();
PropertyKey.Builder keyBuilder = accessor.keyBuilder();
PropertyKey path = keyBuilder.currentStates(manager.getInstanceName(),
manager.getSessionId());
- Map<String, CurrentState> currentStateMap =
accessor.getChildValuesMap(path);
+ Map<String, CurrentState> currentStateMap =
accessor.getChildValuesMap(path, true);
Set<String> seenPartitions = new HashSet<>();
for (Message message : messages) {
diff --git
a/helix-core/src/test/java/org/apache/helix/messaging/handling/TestHelixTaskExecutor.java
b/helix-core/src/test/java/org/apache/helix/messaging/handling/TestHelixTaskExecutor.java
index 55baf07..e80b884 100644
---
a/helix-core/src/test/java/org/apache/helix/messaging/handling/TestHelixTaskExecutor.java
+++
b/helix-core/src/test/java/org/apache/helix/messaging/handling/TestHelixTaskExecutor.java
@@ -348,7 +348,8 @@ public class TestHelixTaskExecutor {
}
AssertJUnit
-
.assertEquals(dataAccessor.getChildValues(keyBuilder.messages(instanceName)).size(),
nMsgs);
+
.assertEquals(dataAccessor.getChildValues(keyBuilder.messages(instanceName),
true).size(),
+ nMsgs);
changeContext.setChangeType(HelixConstants.ChangeType.MESSAGE);
executor.onMessage(instanceName, msgList, changeContext);
@@ -356,7 +357,8 @@ public class TestHelixTaskExecutor {
Thread.sleep(200);
// only 1 message is left over - state transition takes 1sec
-
Assert.assertEquals(dataAccessor.getChildValues(keyBuilder.messages(instanceName)).size(),
1);
+
Assert.assertEquals(dataAccessor.getChildValues(keyBuilder.messages(instanceName),
true).size(),
+ 1);
// While a state transition message is going on, another state transition
message for same
// resource / partition comes in, it should be discarded by message handler
@@ -366,10 +368,12 @@ public class TestHelixTaskExecutor {
dataAccessor.setProperty(msgList.get(2).getKey(keyBuilder, instanceName),
msgList.get(2));
executor.onMessage(instanceName, Arrays.asList(msgList.get(2)),
changeContext);
Thread.sleep(200);
-
Assert.assertEquals(dataAccessor.getChildValues(keyBuilder.messages(instanceName)).size(),
1);
+
Assert.assertEquals(dataAccessor.getChildValues(keyBuilder.messages(instanceName),
true).size(),
+ 1);
Thread.sleep(1000);
-
Assert.assertEquals(dataAccessor.getChildValues(keyBuilder.messages(instanceName)).size(),
0);
+
Assert.assertEquals(dataAccessor.getChildValues(keyBuilder.messages(instanceName),
true).size(),
+ 0);
System.out.println("END TestHelixTaskExecutor.testDuplicatedMessage()");
}
diff --git
a/helix-core/src/test/java/org/apache/helix/messaging/p2pMessage/TestP2PMessages.java
b/helix-core/src/test/java/org/apache/helix/messaging/p2pMessage/TestP2PMessages.java
index f21fb83..99089cd 100644
---
a/helix-core/src/test/java/org/apache/helix/messaging/p2pMessage/TestP2PMessages.java
+++
b/helix-core/src/test/java/org/apache/helix/messaging/p2pMessage/TestP2PMessages.java
@@ -307,7 +307,7 @@ public class TestP2PMessages extends BaseStageTest {
*/
private void handleMessage(String instance, String resource) {
PropertyKey propertyKey = new
PropertyKey.Builder(_clusterName).messages(instance);
- List<Message> messages = accessor.getChildValues(propertyKey);
+ List<Message> messages = accessor.getChildValues(propertyKey, true);
String session =
_dataCache.getLiveInstances().get(instance).getEphemeralOwner();
for (Message m : messages) {
@@ -392,7 +392,7 @@ public class TestP2PMessages extends BaseStageTest {
private void cleanMessages(String instance) {
PropertyKey propertyKey = new
PropertyKey.Builder(_clusterName).messages(instance);
- List<Message> messages = accessor.getChildValues(propertyKey);
+ List<Message> messages = accessor.getChildValues(propertyKey, true);
for (Message m : messages) {
accessor
.removeProperty(new
PropertyKey.Builder(_clusterName).message(instance, m.getMsgId()));
@@ -400,7 +400,7 @@ public class TestP2PMessages extends BaseStageTest {
}
List<Message> getMessages(String instance) {
- return accessor.getChildValues(new
PropertyKey.Builder(_clusterName).messages(instance));
+ return accessor.getChildValues(new
PropertyKey.Builder(_clusterName).messages(instance), true);
}
private String getTopStateInstance(Map<String, String> instanceStateMap,
String topState) {
diff --git
a/helix-core/src/test/java/org/apache/helix/mock/MockBaseDataAccessor.java
b/helix-core/src/test/java/org/apache/helix/mock/MockBaseDataAccessor.java
index f9383b0..4537867 100644
--- a/helix-core/src/test/java/org/apache/helix/mock/MockBaseDataAccessor.java
+++ b/helix-core/src/test/java/org/apache/helix/mock/MockBaseDataAccessor.java
@@ -149,6 +149,7 @@ public class MockBaseDataAccessor implements
BaseDataAccessor<ZNRecord> {
return zNode != null ? zNode.getRecord() : null;
}
+ @Deprecated
@Override
public List<ZNRecord> get(List<String> paths, List<Stat> stats, int options)
{
return get(paths, stats, options, false);
@@ -165,8 +166,15 @@ public class MockBaseDataAccessor implements
BaseDataAccessor<ZNRecord> {
return records;
}
+ @Deprecated
@Override
public List<ZNRecord> getChildren(String parentPath, List<Stat> stats, int
options) {
+ return getChildren(parentPath, stats, options, 0, 0);
+ }
+
+ @Override
+ public List<ZNRecord> getChildren(String parentPath, List<Stat> stats, int
options,
+ int retryCount, int retryInterval) throws HelixException {
List<ZNRecord> children = new ArrayList<>();
for (String key : _recordMap.keySet()) {
if (key.startsWith(parentPath)) {
@@ -188,12 +196,6 @@ public class MockBaseDataAccessor implements
BaseDataAccessor<ZNRecord> {
}
@Override
- public List<ZNRecord> getChildren(String parentPath, List<Stat> stats, int
options,
- int retryCount, int retryInterval) throws HelixException {
- return getChildren(parentPath, stats, options);
- }
-
- @Override
public List<String> getChildNames(String parentPath, int options) {
List<String> child = new ArrayList<>();
for (String key : _recordMap.keySet()) {
diff --git
a/helix-core/src/test/java/org/apache/helix/mock/MockZkHelixDataAccessor.java
b/helix-core/src/test/java/org/apache/helix/mock/MockZkHelixDataAccessor.java
index 480be70..ab11083 100644
---
a/helix-core/src/test/java/org/apache/helix/mock/MockZkHelixDataAccessor.java
+++
b/helix-core/src/test/java/org/apache/helix/mock/MockZkHelixDataAccessor.java
@@ -18,13 +18,10 @@ public class MockZkHelixDataAccessor extends
ZKHelixDataAccessor {
super(clusterName, null, baseDataAccessor);
}
-
+ @Deprecated
@Override
public <T extends HelixProperty> List<T> getProperty(List<PropertyKey> keys)
{
- for (PropertyKey key : keys) {
- addCount(key);
- }
- return super.getProperty(keys);
+ return getProperty(keys, false);
}
@Override
@@ -41,11 +38,10 @@ public class MockZkHelixDataAccessor extends
ZKHelixDataAccessor {
return super.getProperty(key);
}
+ @Deprecated
@Override
public <T extends HelixProperty> Map<String, T>
getChildValuesMap(PropertyKey key) {
- Map<String, T> map = super.getChildValuesMap(key);
- addCount(key, map.keySet().size());
- return map;
+ return getChildValuesMap(key, false);
}
@Override
diff --git
a/helix-core/src/test/java/org/apache/helix/store/zk/TestAutoFallbackPropertyStore.java
b/helix-core/src/test/java/org/apache/helix/store/zk/TestAutoFallbackPropertyStore.java
index f322397..097086a 100644
---
a/helix-core/src/test/java/org/apache/helix/store/zk/TestAutoFallbackPropertyStore.java
+++
b/helix-core/src/test/java/org/apache/helix/store/zk/TestAutoFallbackPropertyStore.java
@@ -447,7 +447,7 @@ public class TestAutoFallbackPropertyStore extends
ZkUnitTestBase {
}
// test multi-get
- List<ZNRecord> records = store.get(paths, null, 0);
+ List<ZNRecord> records = store.get(paths, null, 0, true);
Assert.assertNotNull(records);
Assert.assertEquals(records.size(), 10);
for (int i = 0; i < 10; i++) {
@@ -555,7 +555,7 @@ public class TestAutoFallbackPropertyStore extends
ZkUnitTestBase {
}
// test multi-get
- List<ZNRecord> records = store.get(paths, null, 0);
+ List<ZNRecord> records = store.get(paths, null, 0, true);
Assert.assertNotNull(records);
Assert.assertEquals(records.size(), 20);
for (int i = 0; i < 20; i++) {
@@ -628,7 +628,7 @@ public class TestAutoFallbackPropertyStore extends
ZkUnitTestBase {
Assert.assertTrue(childs.contains(child));
}
- List<ZNRecord> records = store.getChildren("/", null, 0);
+ List<ZNRecord> records = store.getChildren("/", null, 0, 0, 0);
Assert.assertNotNull(records);
Assert.assertEquals(records.size(), 20);
for (int i = 0; i < 20; i++) {
diff --git
a/helix-rest/src/main/java/org/apache/helix/rest/server/service/ClusterServiceImpl.java
b/helix-rest/src/main/java/org/apache/helix/rest/server/service/ClusterServiceImpl.java
index 4575a93..3410d4e 100644
---
a/helix-rest/src/main/java/org/apache/helix/rest/server/service/ClusterServiceImpl.java
+++
b/helix-rest/src/main/java/org/apache/helix/rest/server/service/ClusterServiceImpl.java
@@ -29,7 +29,7 @@ public class ClusterServiceImpl implements ClusterService {
String zoneField =
_configAccessor.getClusterConfig(cluster).getFaultZoneType();
PropertyKey.Builder keyBuilder = _dataAccessor.keyBuilder();
List<InstanceConfig> instanceConfigs =
- _dataAccessor.getChildValues(keyBuilder.instanceConfigs());
+ _dataAccessor.getChildValues(keyBuilder.instanceConfigs(), true);
Map<String, List<ClusterTopology.Instance>> instanceMapByZone = new
HashMap<>();
if (instanceConfigs != null && !instanceConfigs.isEmpty()) {
for (InstanceConfig instanceConfig : instanceConfigs) {
diff --git
a/helix-rest/src/main/java/org/apache/helix/rest/server/service/InstanceServiceImpl.java
b/helix-rest/src/main/java/org/apache/helix/rest/server/service/InstanceServiceImpl.java
index 9311544..25c0abb 100644
---
a/helix-rest/src/main/java/org/apache/helix/rest/server/service/InstanceServiceImpl.java
+++
b/helix-rest/src/main/java/org/apache/helix/rest/server/service/InstanceServiceImpl.java
@@ -241,13 +241,15 @@ public class InstanceServiceImpl implements
InstanceService {
Map<String, Map<String, Boolean>> allPartitionsHealthOnLiveInstance =
_dataAccessor.getAllPartitionsHealthOnLiveInstance(restConfig,
customPayLoads);
List<ExternalView> externalViews =
-
_dataAccessor.getChildValues(_dataAccessor.keyBuilder().externalViews());
+
_dataAccessor.getChildValues(_dataAccessor.keyBuilder().externalViews(), true);
Map<String, StoppableCheck> instanceStoppableChecks = new HashMap<>();
for (String instanceName : instances) {
- List<String> unHealthyPartitions =
InstanceValidationUtil.perPartitionHealthCheck(
- externalViews, allPartitionsHealthOnLiveInstance, instanceName,
_dataAccessor);
- StoppableCheck stoppableCheck = new
StoppableCheck(unHealthyPartitions.isEmpty(),
- unHealthyPartitions, StoppableCheck.Category.CUSTOM_PARTITION_CHECK);
+ List<String> unHealthyPartitions = InstanceValidationUtil
+ .perPartitionHealthCheck(externalViews,
allPartitionsHealthOnLiveInstance, instanceName,
+ _dataAccessor);
+ StoppableCheck stoppableCheck =
+ new StoppableCheck(unHealthyPartitions.isEmpty(),
unHealthyPartitions,
+ StoppableCheck.Category.CUSTOM_PARTITION_CHECK);
instanceStoppableChecks.put(instanceName, stoppableCheck);
}
diff --git
a/helix-rest/src/test/java/org/apache/helix/rest/server/service/TestClusterService.java
b/helix-rest/src/test/java/org/apache/helix/rest/server/service/TestClusterService.java
index cc06cda..8ffd5e1 100644
---
a/helix-rest/src/test/java/org/apache/helix/rest/server/service/TestClusterService.java
+++
b/helix-rest/src/test/java/org/apache/helix/rest/server/service/TestClusterService.java
@@ -13,6 +13,7 @@ import
org.apache.helix.rest.server.json.cluster.ClusterTopology;
import org.testng.Assert;
import org.testng.annotations.Test;
+import static org.mockito.Matchers.anyBoolean;
import static org.mockito.Mockito.any;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
@@ -31,7 +32,7 @@ public class TestClusterService {
Mock mock = new Mock();
when(mock.dataAccessor.keyBuilder()).thenReturn(new
PropertyKey.Builder(TEST_CLUSTER));
-
when(mock.dataAccessor.getChildValues(any(PropertyKey.class))).thenReturn(instanceConfigs);
+ when(mock.dataAccessor.getChildValues(any(PropertyKey.class),
anyBoolean())).thenReturn(instanceConfigs);
ClusterTopology clusterTopology =
mock.clusterService.getClusterTopology(TEST_CLUSTER);
@@ -47,7 +48,8 @@ public class TestClusterService {
Mock mock = new Mock();
when(mock.dataAccessor.keyBuilder()).thenReturn(new
PropertyKey.Builder(TEST_CLUSTER));
-
when(mock.dataAccessor.getChildValues(any(PropertyKey.class))).thenReturn(instanceConfigs);
+ when(mock.dataAccessor.getChildValues(any(PropertyKey.class),
anyBoolean()))
+ .thenReturn(instanceConfigs);
ClusterTopology clusterTopology =
mock.clusterService.getClusterTopology(TEST_CLUSTER);
@@ -65,7 +67,8 @@ public class TestClusterService {
Mock mock = new Mock();
when(mock.dataAccessor.keyBuilder()).thenReturn(new
PropertyKey.Builder(TEST_CLUSTER));
-
when(mock.dataAccessor.getChildValues(any(PropertyKey.class))).thenReturn(instanceConfigs);
+ when(mock.dataAccessor.getChildValues(any(PropertyKey.class),
anyBoolean()))
+ .thenReturn(instanceConfigs);
ClusterTopology clusterTopology =
mock.clusterService.getClusterTopology(TEST_CLUSTER);