docs: private ZkDisconfData getDisconfData(String path, String keyName, ZooKeeper zooKeeper)
              throws KeeperException, InterruptedException {
  
          String curPath = path + "/" + keyName;
  
          if (zooKeeper.exists(curPath, false) == null) {
              return null;
          }
  
          ZkDisconfData zkDisconfData = new ZkDisconfData();
          zkDisconfData.setKey(keyName);
  
          List<String> secChiList = zooKeeper.getChildren(curPath, false);
          List<ZkDisconfData.ZkDisconfDataItem> zkDisconfDataItems = new ArrayList<ZkDisconfData.ZkDisconfDataItem>();
  
          // list
          for (String secKey : secChiList) {
  
              // machine
              ZkDisconfData.ZkDisconfDataItem zkDisconfDataItem = new ZkDisconfData.ZkDisconfDataItem();
              zkDisconfDataItem.setMachine(secKey);
  
              String thirdPath = curPath + "/" + secKey;
  
              // value
              byte[] data = zooKeeper.getData(thirdPath, null, null);
              if (data != null) {
                  zkDisconfDataItem.setValue(new String(data, CHARSET));
              }
  
              // add
              zkDisconfDataItems.add(zkDisconfDataItem);
          }
  
          zkDisconfData.setData(zkDisconfDataItems);
  
          return zkDisconfData;
      }