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);
 

Reply via email to