org.apache.helix.BaseDataAccessor Java Examples

The following examples show how to use org.apache.helix.BaseDataAccessor. You can vote up the ones you like or vote down the ones you don't like, and go to the original project or source file by following the links above each example. You may check out the related API usage on the sidebar.
Example #1
Source File: PropertyStoreAccessor.java    From helix with Apache License 2.0 6 votes vote down vote up
/**
 * Recursively deletes the PropertyStore path. If the node does not exist, it returns OK().
 * @param clusterId
 * @param path
 * @return
 */
@DELETE
@Path("{path: .+}")
public Response deletePropertyByPath(@PathParam("clusterId") String clusterId,
    @PathParam("path") String path) {
  path = "/" + path;
  if (!ZkValidationUtil.isPathValid(path)) {
    LOG.info("The propertyStore path {} is invalid for cluster {}", path, clusterId);
    return badRequest(
        "Invalid path string. Valid path strings use slash as the directory separator and names the location of ZNode");
  }
  final String recordPath = PropertyPathBuilder.propertyStore(clusterId) + path;
  BaseDataAccessor<byte[]> propertyStoreDataAccessor = getByteArrayDataAccessor();
  if (!propertyStoreDataAccessor.remove(recordPath, AccessOption.PERSISTENT)) {
    return serverError("Failed to delete PropertyStore record in path: " + path);
  }
  return OK();
}
 
Example #2
Source File: ZkTestBase.java    From helix with Apache License 2.0 6 votes vote down vote up
@AfterSuite
public void afterSuite() throws IOException {
  // Clean up all JMX objects
  for (ObjectName mbean : _server.queryNames(null, null)) {
    try {
      _server.unregisterMBean(mbean);
    } catch (Exception e) {
      // OK
    }
  }

  // Close all ZK resources
  _baseDataAccessorMap.values().forEach(BaseDataAccessor::close);
  _clusterSetupMap.values().forEach(ClusterSetup::close);
  _helixZkClientMap.values().forEach(HelixZkClient::close);
  _zkServerMap.values().forEach(TestHelper::stopZkServer);
}
 
Example #3
Source File: ZkTestBase.java    From helix with Apache License 2.0 6 votes vote down vote up
/**
 * Starts an additional in-memory ZooKeeper for testing.
 * @param i index to be added to the ZK port to avoid conflicts
 * @throws Exception
 */
private void startZooKeeper(int i)
    throws Exception {
  String zkAddress = ZK_PREFIX + (ZK_START_PORT + i);
  ZkServer zkServer = TestHelper.startZkServer(zkAddress);
  AssertJUnit.assertNotNull(zkServer);
  HelixZkClient.ZkClientConfig clientConfig = new HelixZkClient.ZkClientConfig();
  clientConfig.setZkSerializer(new ZNRecordSerializer());
  HelixZkClient zkClient = DedicatedZkClientFactory.getInstance()
      .buildZkClient(new HelixZkClient.ZkConnectionConfig(zkAddress), clientConfig);
  ClusterSetup gSetupTool = new ClusterSetup(zkClient);
  BaseDataAccessor baseDataAccessor = new ZkBaseDataAccessor<>(zkClient);

  _zkServerMap.put(zkAddress, zkServer);
  _helixZkClientMap.put(zkAddress, zkClient);
  _clusterSetupMap.put(zkAddress, gSetupTool);
  _baseDataAccessorMap.put(zkAddress, baseDataAccessor);
}
 
Example #4
Source File: TestZkHelixAdmin.java    From helix with Apache License 2.0 6 votes vote down vote up
@Test
public void testDisableResource() {
  String className = TestHelper.getTestClassName();
  String methodName = TestHelper.getTestMethodName();
  String clusterName = className + "_" + methodName;
  System.out.println("START " + clusterName + " at " + new Date(System.currentTimeMillis()));
  HelixAdmin admin = new ZKHelixAdmin(_gZkClient);
  admin.addCluster(clusterName, true);
  Assert.assertTrue(ZKUtil.isClusterSetup(clusterName, _gZkClient), "Cluster should be setup");
  String resourceName = "TestDB";
  admin.addStateModelDef(clusterName, "MasterSlave",
      new StateModelDefinition(StateModelConfigGenerator.generateConfigForMasterSlave()));
  admin.addResource(clusterName, resourceName, 4, "MasterSlave");
  admin.enableResource(clusterName, resourceName, false);
  BaseDataAccessor<ZNRecord> baseAccessor = new ZkBaseDataAccessor<>(_gZkClient);
  HelixDataAccessor accessor = new ZKHelixDataAccessor(clusterName, baseAccessor);
  PropertyKey.Builder keyBuilder = accessor.keyBuilder();
  IdealState idealState = accessor.getProperty(keyBuilder.idealStates(resourceName));
  Assert.assertFalse(idealState.isEnabled());
  admin.enableResource(clusterName, resourceName, true);
  idealState = accessor.getProperty(keyBuilder.idealStates(resourceName));
  Assert.assertTrue(idealState.isEnabled());

  admin.dropCluster(clusterName);
  System.out.println("END " + clusterName + " at " + new Date(System.currentTimeMillis()));
}
 
Example #5
Source File: TestZkBaseDataAccessor.java    From helix with Apache License 2.0 6 votes vote down vote up
@Test
public void testSyncSet() {
  String className = TestHelper.getTestClassName();
  String methodName = TestHelper.getTestMethodName();
  String testName = className + "_" + methodName;

  System.out.println("START " + testName + " at " + new Date(System.currentTimeMillis()));

  String path = String.format("/%s/%s", _rootPath, "msg_0");
  ZNRecord record = new ZNRecord("msg_0");
  BaseDataAccessor<ZNRecord> accessor = new ZkBaseDataAccessor<ZNRecord>(_gZkClient);

  boolean success = accessor.set(path, record, AccessOption.PERSISTENT);
  Assert.assertTrue(success);
  ZNRecord getRecord = _gZkClient.readData(path);
  Assert.assertNotNull(getRecord);
  Assert.assertEquals(getRecord.getId(), "msg_0");

  System.out.println("END " + testName + " at " + new Date(System.currentTimeMillis()));
}
 
Example #6
Source File: ZkCallbackCache.java    From helix with Apache License 2.0 6 votes vote down vote up
public ZkCallbackCache(BaseDataAccessor<T> accessor, String chrootPath, List<String> paths,
    ZkCacheEventThread eventThread) {
  super();
  _accessor = accessor;
  _chrootPath = chrootPath;

  _listener = new ConcurrentHashMap<>();
  _eventThread = eventThread;

  // init cache
  // System.out.println("init cache: " + paths);
  if (paths != null && !paths.isEmpty()) {
    for (String path : paths) {
      updateRecursive(path);
    }
  }
}
 
Example #7
Source File: ResourceUtil.java    From helix with Apache License 2.0 6 votes vote down vote up
public static Map<String, String> readZkChildrenAsBytesMap(ZkClient zkclient, PropertyKey propertyKey) {
  BaseDataAccessor<byte[]> baseAccessor = new ZkBaseDataAccessor<byte[]>(zkclient);
  String parentPath = propertyKey.getPath();
  List<String> childNames = baseAccessor.getChildNames(parentPath, 0);
  if (childNames == null) {
    return null;
  }
  List<String> paths = new ArrayList<String>();
  for (String childName : childNames) {
    paths.add(parentPath + "/" + childName);
  }
  List<byte[]> values = baseAccessor.get(paths, null, 0);
  Map<String, String> ret = new HashMap<String, String>();
  for (int i = 0; i < childNames.size(); i++) {
    ret.put(childNames.get(i), new String(values.get(i)));
  }
  return ret;
}
 
Example #8
Source File: ZKHelixAdmin.java    From helix with Apache License 2.0 6 votes vote down vote up
private void enableSingleInstance(final String clusterName, final String instanceName,
    final boolean enabled, BaseDataAccessor<ZNRecord> baseAccessor) {
  String path = PropertyPathBuilder.instanceConfig(clusterName, instanceName);

  if (!baseAccessor.exists(path, 0)) {
    throw new HelixException("Cluster " + clusterName + ", instance: " + instanceName
        + ", instance config does not exist");
  }

  baseAccessor.update(path, new DataUpdater<ZNRecord>() {
    @Override
    public ZNRecord update(ZNRecord currentData) {
      if (currentData == null) {
        throw new HelixException("Cluster: " + clusterName + ", instance: " + instanceName
            + ", participant config is null");
      }

      InstanceConfig config = new InstanceConfig(currentData);
      config.setInstanceEnabled(enabled);
      return config.getRecord();
    }
  }, AccessOption.PERSISTENT);
}
 
Example #9
Source File: ZKHelixAdmin.java    From helix with Apache License 2.0 6 votes vote down vote up
@Override
public void setConstraint(String clusterName, final ConstraintType constraintType,
    final String constraintId, final ConstraintItem constraintItem) {
  logger.info("Set constraint type {} with constraint id {} for cluster {}.", constraintType,
      constraintId, clusterName);
  BaseDataAccessor<ZNRecord> baseAccessor = new ZkBaseDataAccessor<ZNRecord>(_zkClient);

  PropertyKey.Builder keyBuilder = new PropertyKey.Builder(clusterName);
  String path = keyBuilder.constraint(constraintType.toString()).getPath();

  baseAccessor.update(path, new DataUpdater<ZNRecord>() {
    @Override
    public ZNRecord update(ZNRecord currentData) {
      ClusterConstraints constraints =
          currentData == null ? new ClusterConstraints(constraintType)
              : new ClusterConstraints(currentData);

      constraints.addConstraintItem(constraintId, constraintItem);
      return constraints.getRecord();
    }
  }, AccessOption.PERSISTENT);
}
 
Example #10
Source File: ZKPathDataDumpTask.java    From helix with Apache License 2.0 6 votes vote down vote up
/**
 * Find paths of all leaf nodes under an ancestor path (exclusive)
 * @param accessor
 * @param ancestorPath
 * @return a list of paths
 */
static List<String> scanPath(BaseDataAccessor<ZNRecord> accessor, String ancestorPath) {
  List<String> queue = Lists.newLinkedList();
  queue.add(ancestorPath);

  // BFS
  List<String> leafPaths = Lists.newArrayList();
  while (!queue.isEmpty()) {
    String path = queue.remove(0);
    List<String> childNames = accessor.getChildNames(path, 0);
    if (childNames == null) {
      // path doesn't exist
      continue;
    }
    if (childNames.isEmpty() && !path.equals(ancestorPath)) {
      // leaf node, excluding ancestorPath
      leafPaths.add(path);
    }
    for (String childName : childNames) {
      String subPath = String.format("%s/%s", path, childName);
      queue.add(subPath);
    }
  }
  return leafPaths;
}
 
Example #11
Source File: ZKHelixAdmin.java    From helix with Apache License 2.0 6 votes vote down vote up
@Override
public void enableInstance(String clusterName, List<String> instances, boolean enabled) {
  // TODO: Reenable this after storage node bug fixed.
  if (true) {
    throw new HelixException("Current batch enable/disable instances are temporarily disabled!");
  }
  logger.info("Batch {} instances {} in cluster {}.", enabled ? "enable" : "disable",
      HelixUtil.serializeByComma(instances), clusterName);
  BaseDataAccessor<ZNRecord> baseAccessor = new ZkBaseDataAccessor<>(_zkClient);
  if (enabled) {
    for (String instance : instances) {
      enableSingleInstance(clusterName, instance, enabled, baseAccessor);
    }
  }
  enableBatchInstances(clusterName, instances, enabled, baseAccessor);
}
 
Example #12
Source File: ZKHelixAdmin.java    From helix with Apache License 2.0 6 votes vote down vote up
@Override
public void removeConstraint(String clusterName, final ConstraintType constraintType,
    final String constraintId) {
  logger.info("Remove constraint type {} with constraint id {} for cluster {}.", constraintType,
      constraintId, clusterName);
  BaseDataAccessor<ZNRecord> baseAccessor = new ZkBaseDataAccessor<ZNRecord>(_zkClient);

  PropertyKey.Builder keyBuilder = new PropertyKey.Builder(clusterName);
  String path = keyBuilder.constraint(constraintType.toString()).getPath();

  baseAccessor.update(path, new DataUpdater<ZNRecord>() {
    @Override
    public ZNRecord update(ZNRecord currentData) {
      if (currentData != null) {
        ClusterConstraints constraints = new ClusterConstraints(currentData);

        constraints.removeConstraintItem(constraintId);
        return constraints.getRecord();
      }
      return null;
    }
  }, AccessOption.PERSISTENT);
}
 
Example #13
Source File: ZooKeeperAccessor.java    From helix with Apache License 2.0 5 votes vote down vote up
/**
 * Returns a list of children ZNode names given the path for the parent ZNode.
 * @param zkBaseDataAccessor
 * @param path
 * @return list of child ZNodes
 */
private Response getChildren(BaseDataAccessor<byte[]> zkBaseDataAccessor, String path) {
  if (zkBaseDataAccessor.exists(path, AccessOption.PERSISTENT)) {
    Map<String, List<String>> result = ImmutableMap.of(ZooKeeperCommand.getChildren.name(),
        zkBaseDataAccessor.getChildNames(path, AccessOption.PERSISTENT));
    return JSONRepresentation(result);
  } else {
    throw new WebApplicationException(Response.status(Response.Status.NOT_FOUND)
        .entity(String.format("The ZNode at path %s does not exist", path)).build());
  }
}
 
Example #14
Source File: ZKPathDataDumpTask.java    From helix with Apache License 2.0 5 votes vote down vote up
void dump(BaseDataAccessor<ZNRecord> accessor, String ancestorPath, long threshold,
    int maxLeafCount) {
  List<String> leafPaths = scanPath(accessor, ancestorPath);
  if (leafPaths.isEmpty()) {
    return;
  }

  Stat[] stats = accessor.getStats(leafPaths, 0);
  List<String> dumpPaths = Lists.newArrayList();
  long now = System.currentTimeMillis();
  for (int i = 0; i < stats.length; i++) {
    Stat stat = stats[i];
    if ((stats.length > maxLeafCount) || ((now - stat.getMtime()) > threshold)) {
      dumpPaths.add(leafPaths.get(i));
    }
  }

  if (!dumpPaths.isEmpty()) {
    LOG.info("Dump statusUpdates and errors records for paths: " + dumpPaths);
    // 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)));
      }
    }

    // clean up
    accessor.remove(dumpPaths, 0);
    LOG.info("Remove statusUpdates and errors records for paths: " + dumpPaths);
  }
}
 
Example #15
Source File: ZkTestBase.java    From helix with Apache License 2.0 5 votes vote down vote up
@Override
public boolean verify() {
  BaseDataAccessor<ZNRecord> baseAccessor = new ZkBaseDataAccessor<ZNRecord>(_zkClient);
  HelixDataAccessor accessor = new ZKHelixDataAccessor(_clusterName, baseAccessor);
  PropertyKey.Builder keyBuilder = accessor.keyBuilder();
  ExternalView externalView = accessor.getProperty(keyBuilder.externalView(_resourceName));

  // verify external view empty
  if (externalView != null) {
    for (String partition : externalView.getPartitionSet()) {
      Map<String, String> stateMap = externalView.getStateMap(partition);
      if (stateMap != null && !stateMap.isEmpty()) {
        LOG.error("External view not empty for " + partition);
        return false;
      }
    }
  }

  // verify current state empty
  List<String> liveParticipants = accessor.getChildNames(keyBuilder.liveInstances());
  for (String participant : liveParticipants) {
    List<String> sessionIds = accessor.getChildNames(keyBuilder.sessions(participant));
    for (String sessionId : sessionIds) {
      CurrentState currentState =
          accessor.getProperty(keyBuilder.currentState(participant, sessionId, _resourceName));
      Map<String, String> partitionStateMap = currentState.getPartitionStateMap();
      if (partitionStateMap != null && !partitionStateMap.isEmpty()) {
        LOG.error("Current state not empty for " + participant);
        return false;
      }
    }
  }
  return true;
}
 
Example #16
Source File: TestClusterSetup.java    From helix with Apache License 2.0 5 votes vote down vote up
@Test
public void testDisableResource() throws Exception {
  String className = TestHelper.getTestClassName();
  String methodName = TestHelper.getTestMethodName();
  String clusterName = className + "_" + methodName;
  System.out.println("START " + clusterName + " at " + new Date(System.currentTimeMillis()));
  TestHelper.setupCluster(clusterName, ZK_ADDR, 12918, // participant port
      "localhost", // participant name prefix
      "TestDB", // resource name prefix
      1, // resources
      10, // partitions per resource
      5, // number of nodes
      3, // replicas
      "MasterSlave", true); // do rebalance
  // disable "TestDB0" resource
  ClusterSetup.processCommandLineArgs(new String[] {
      "--zkSvr", ZK_ADDR, "--enableResource", clusterName, "TestDB0", "false"
  });
  BaseDataAccessor<ZNRecord> baseAccessor = new ZkBaseDataAccessor<ZNRecord>(ZK_ADDR);
  HelixDataAccessor accessor = new ZKHelixDataAccessor(clusterName, baseAccessor);
  PropertyKey.Builder keyBuilder = accessor.keyBuilder();
  IdealState idealState = accessor.getProperty(keyBuilder.idealStates("TestDB0"));
  Assert.assertFalse(idealState.isEnabled());
  // enable "TestDB0" resource
  ClusterSetup.processCommandLineArgs(new String[] {
      "--zkSvr", ZK_ADDR, "--enableResource", clusterName, "TestDB0", "true"
  });
  idealState = accessor.getProperty(keyBuilder.idealStates("TestDB0"));
  Assert.assertTrue(idealState.isEnabled());

  TestHelper.dropCluster(clusterName, _gZkClient);
  System.out.println("END " + clusterName + " at " + new Date(System.currentTimeMillis()));
}
 
Example #17
Source File: ZooKeeperAccessor.java    From helix with Apache License 2.0 5 votes vote down vote up
/**
 * Returns a response containing the binary data and Stat.
 * @param zkBaseDataAccessor
 * @param path
 * @return
 */
private Response getBinaryData(BaseDataAccessor<byte[]> zkBaseDataAccessor, String path) {
  Stat stat = new Stat();
  byte[] bytes = readBinaryDataFromZK(zkBaseDataAccessor, path, stat);
  Map<String, Object> binaryResult = ImmutableMap
      .of(ZooKeeperCommand.getBinaryData.name(), bytes, ZooKeeperCommand.getStat.name(),
          ZKUtil.fromStatToMap(stat));
  // Note: this serialization (using ObjectMapper) will convert this byte[] into
  // a Base64 String! The REST client (user) must convert the resulting String back into
  // a byte[] using Base64.
  return JSONRepresentation(binaryResult);
}
 
Example #18
Source File: WriteThroughCache.java    From helix with Apache License 2.0 5 votes vote down vote up
public WriteThroughCache(BaseDataAccessor<T> accessor, List<String> paths) {
  super();
  _accessor = accessor;

  // init cache
  if (paths != null && !paths.isEmpty()) {
    for (String path : paths) {
      updateRecursive(path);
    }
  }
}
 
Example #19
Source File: ZKPathDataDumpTask.java    From helix with Apache License 2.0 5 votes vote down vote up
@Override
public void run() {
  // For each record in status update and error node
  // TODO: for now the status updates are dumped to cluster manager log4j log.
  // We need to think if we should create per-instance log files that contains
  // per-instance statusUpdates
  // and errors
  LOG.info("Scan statusUpdates and errors for cluster: " + _manager.getClusterName()
      + ", by controller: " + _manager);
  HelixDataAccessor accessor = _manager.getHelixDataAccessor();
  Builder keyBuilder = accessor.keyBuilder();
  BaseDataAccessor<ZNRecord> baseAccessor = accessor.getBaseDataAccessor();

  List<String> instances = accessor.getChildNames(keyBuilder.instanceConfigs());
  for (String instance : instances) {
    // dump participant status updates
    String statusUpdatePath = PropertyPathBuilder.instanceStatusUpdate(_manager.getClusterName(), instance);
    dump(baseAccessor, statusUpdatePath, _thresholdNoChangeMsForStatusUpdates, _maxLeafCount);

    // dump participant errors
    String errorPath = PropertyPathBuilder.instanceError(_manager.getClusterName(), instance);
    dump(baseAccessor, errorPath, _thresholdNoChangeMsForErrors, _maxLeafCount);
  }
  // dump controller status updates
  String controllerStatusUpdatePath = PropertyPathBuilder.controllerStatusUpdate(_manager.getClusterName());
  dump(baseAccessor, controllerStatusUpdatePath, _thresholdNoChangeMsForStatusUpdates, _maxLeafCount);

  // dump controller errors
  String controllerErrorPath = PropertyPathBuilder.controllerError(_manager.getClusterName());
  dump(baseAccessor, controllerErrorPath, _thresholdNoChangeMsForErrors, _maxLeafCount);
}
 
Example #20
Source File: ZooKeeperAccessor.java    From helix with Apache License 2.0 5 votes vote down vote up
/**
 * Returns a response containing the string data and Stat.
 * @param zkBaseDataAccessor
 * @param path
 * @return
 */
private Response getStringData(BaseDataAccessor<byte[]> zkBaseDataAccessor, String path) {
  Stat stat = new Stat();
  byte[] bytes = readBinaryDataFromZK(zkBaseDataAccessor, path, stat);
  Map<String, Object> stringResult = ImmutableMap
      .of(ZooKeeperCommand.getStringData.name(), new String(bytes),
          ZooKeeperCommand.getStat.name(), ZKUtil.fromStatToMap(stat));
  return JSONRepresentation(stringResult);
}
 
Example #21
Source File: ZooKeeperAccessor.java    From helix with Apache License 2.0 5 votes vote down vote up
/**
 * Returns byte[] from ZooKeeper.
 * @param zkBaseDataAccessor
 * @param path
 * @return
 */
private byte[] readBinaryDataFromZK(BaseDataAccessor<byte[]> zkBaseDataAccessor, String path,
    Stat stat) {
  if (zkBaseDataAccessor.exists(path, AccessOption.PERSISTENT)) {
    return zkBaseDataAccessor.get(path, stat, AccessOption.PERSISTENT);
  } else {
    throw new WebApplicationException(Response.status(Response.Status.NOT_FOUND)
        .entity(String.format("The ZNode at path %s does not exist!", path)).build());
  }
}
 
Example #22
Source File: ZKHelixDataAccessor.java    From helix with Apache License 2.0 5 votes vote down vote up
public ZKHelixDataAccessor(String clusterName, InstanceType instanceType,
    BaseDataAccessor<ZNRecord> baseDataAccessor) {
  _clusterName = clusterName;
  _instanceType = instanceType;
  _baseDataAccessor = baseDataAccessor;
  _propertyKeyBuilder = new PropertyKey.Builder(_clusterName);
}
 
Example #23
Source File: TestDisableResource.java    From helix with Apache License 2.0 5 votes vote down vote up
/**
 * Check all partitions are in OFFLINE state
 * @param clusterName
 * @throws Exception
 */
private void checkExternalView(String clusterName) throws Exception {
  BaseDataAccessor<ZNRecord> baseAccessor = new ZkBaseDataAccessor<ZNRecord>(_gZkClient);
  final HelixDataAccessor accessor = new ZKHelixDataAccessor(clusterName, baseAccessor);

  // verify that states of TestDB0 are all OFFLINE
  boolean result = TestHelper.verify(() -> {
    PropertyKey.Builder keyBuilder = accessor.keyBuilder();

    ExternalView extView = accessor.getProperty(keyBuilder.externalView("TestDB0"));
    if (extView == null) {
      return false;
    }
    Set<String> partitionSet = extView.getPartitionSet();
    if (partitionSet == null || partitionSet.size() != PARTITION_NUM) {
      return false;
    }
    for (String partition : partitionSet) {
      Map<String, String> instanceStates = extView.getStateMap(partition);
      for (String state : instanceStates.values()) {
        if (!"OFFLINE".equals(state)) {
          return false;
        }
      }
    }
    return true;
  }, 10 * 1000);
  Assert.assertTrue(result);
}
 
Example #24
Source File: ZooKeeperAccessor.java    From helix with Apache License 2.0 5 votes vote down vote up
/**
 * Returns the ZNode Stat object given the path.
 * @param zkBaseDataAccessor
 * @param path
 * @return
 */
private Response getStat(BaseDataAccessor<byte[]> zkBaseDataAccessor, String path) {
  Stat stat = zkBaseDataAccessor.getStat(path, AccessOption.PERSISTENT);
  if (stat == null) {
    throw new WebApplicationException(Response.status(Response.Status.NOT_FOUND)
        .entity(String.format("The ZNode at path %s does not exist!", path)).build());
  }
  Map<String, String> result = ZKUtil.fromStatToMap(stat);
  result.put("path", path);
  return JSONRepresentation(result);
}
 
Example #25
Source File: PropertyStoreAccessor.java    From helix with Apache License 2.0 5 votes vote down vote up
/**
 * Sample HTTP URLs:
 *  http://<HOST>/clusters/{clusterId}/propertyStore/<PATH>
 * It refers to the /PROPERTYSTORE/<PATH> in Helix metadata store
 * @param clusterId The cluster Id
 * @param path path parameter is like "abc/abc/abc" in the URL
 * @return If the payload is ZNRecord format, return ZnRecord json response;
 *         Otherwise, return json object {<PATH>: raw string}
 */
@GET
@Path("{path: .+}")
public Response getPropertyByPath(@PathParam("clusterId") String clusterId,
    @PathParam("path") String path) {
  path = "/" + path;
  if (!ZkValidationUtil.isPathValid(path)) {
    LOG.info("The propertyStore path {} is invalid for cluster {}", path, clusterId);
    return badRequest(
        "Invalid path string. Valid path strings use slash as the directory separator and names the location of ZNode");
  }
  final String recordPath = PropertyPathBuilder.propertyStore(clusterId) + path;
  BaseDataAccessor<byte[]> propertyStoreDataAccessor = getByteArrayDataAccessor();
  if (propertyStoreDataAccessor.exists(recordPath, AccessOption.PERSISTENT)) {
    byte[] bytes = propertyStoreDataAccessor.get(recordPath, null, AccessOption.PERSISTENT);
    ZNRecord znRecord = (ZNRecord) ZN_RECORD_SERIALIZER.deserialize(bytes);
    // The ZNRecordSerializer returns null when exception occurs in deserialization method
    if (znRecord == null) {
      ObjectNode jsonNode = OBJECT_MAPPER.createObjectNode();
      jsonNode.put(CONTENT_KEY, new String(bytes));
      return JSONRepresentation(jsonNode);
    }
    return JSONRepresentation(znRecord);
  } else {
    throw new WebApplicationException(Response.status(Response.Status.NOT_FOUND)
        .entity(String.format("The property store path %s doesn't exist", recordPath)).build());
  }
}
 
Example #26
Source File: ServerContext.java    From helix with Apache License 2.0 5 votes vote down vote up
/**
 * Returns a lazily-instantiated ZkBaseDataAccessor for the byte array type.
 * @return
 */
public BaseDataAccessor<byte[]> getByteArrayZkBaseDataAccessor() {
  if (_byteArrayZkBaseDataAccessor == null) {
    synchronized (this) {
      if (_byteArrayZkBaseDataAccessor == null) {
        _byteArrayZkBaseDataAccessor =
            new ZkBaseDataAccessor<>(_zkAddr, new ByteArraySerializer());
      }
    }
  }
  return _byteArrayZkBaseDataAccessor;
}
 
Example #27
Source File: ZKHelixAdmin.java    From helix with Apache License 2.0 5 votes vote down vote up
@Override
public void enableInstance(final String clusterName, final String instanceName,
    final boolean enabled) {
  logger.info("{} instance {} in cluster {}.", enabled ? "Enable" : "Disable", instanceName,
      clusterName);
  BaseDataAccessor<ZNRecord> baseAccessor = new ZkBaseDataAccessor<>(_zkClient);
  enableSingleInstance(clusterName, instanceName, enabled, baseAccessor);
  // TODO: Reenable this after storage node bug fixed.
  // enableBatchInstances(clusterName, Collections.singletonList(instanceName), enabled, baseAccessor);

}
 
Example #28
Source File: AbstractHelixResource.java    From helix with Apache License 2.0 4 votes vote down vote up
protected BaseDataAccessor<byte[]> getByteArrayDataAccessor() {
  return getServerContext().getByteArrayZkBaseDataAccessor();
}
 
Example #29
Source File: MockHelixDataAccessor.java    From ambry with Apache License 2.0 4 votes vote down vote up
@Override
public BaseDataAccessor<ZNRecord> getBaseDataAccessor() {
  throw new UnsupportedOperationException("Unsupported in MockHelixDataAccessor");
}
 
Example #30
Source File: TestDisableResource.java    From helix with Apache License 2.0 4 votes vote down vote up
@Test
public void test() throws Exception {
  String className = TestHelper.getTestClassName();
  String methodName = TestHelper.getTestMethodName();
  String clusterName = className + "_" + methodName;
  final int n = 5;

  System.out.println("START " + clusterName + " at " + new Date(System.currentTimeMillis()));

  TestHelper.setupCluster(clusterName, ZK_ADDR, 12918, // participant port
      "localhost", // participant name prefix
      "TestDB", // resource name prefix
      1, // resources
      10, // partitions per resource
      n, // number of nodes
      3, // replicas
      "MasterSlave", true); // do rebalance

  String instanceUrl =
      "http://localhost:" + ADMIN_PORT + "/clusters/" + clusterName + "/resourceGroups/"
          + "TestDB0";

  // Disable TestDB0
  Map<String, String> paramMap = new HashMap<String, String>();
  paramMap.put(JsonParameters.MANAGEMENT_COMMAND, ClusterSetup.enableResource);
  paramMap.put(JsonParameters.ENABLED, Boolean.toString(false));
  TestHelixAdminScenariosRest.assertSuccessPostOperation(instanceUrl, paramMap, false);

  BaseDataAccessor<ZNRecord> baseAccessor = new ZkBaseDataAccessor<ZNRecord>(_gZkClient);
  HelixDataAccessor accessor = new ZKHelixDataAccessor(clusterName, baseAccessor);
  PropertyKey.Builder keyBuilder = accessor.keyBuilder();
  IdealState idealState = accessor.getProperty(keyBuilder.idealStates("TestDB0"));
  Assert.assertFalse(idealState.isEnabled());

  // Re-enable TestDB0
  paramMap.put(JsonParameters.ENABLED, Boolean.toString(true));
  TestHelixAdminScenariosRest.assertSuccessPostOperation(instanceUrl, paramMap, false);

  idealState = accessor.getProperty(keyBuilder.idealStates("TestDB0"));
  Assert.assertTrue(idealState.isEnabled());

  System.out.println("END " + clusterName + " at " + new Date(System.currentTimeMillis()));
}