/** * Get the backpressure znode full path. * * @param stormId The topology id * @param shortPath A string in the form of "node-port" * @return The backpressure znode path */ public static String backpressurePath(String stormId, String shortPath) { return backpressureStormRoot(stormId) + ZK_SEPERATOR + shortPath; }
public static String backpressurePath(String stormId, String node, Long port) { return backpressureStormRoot(stormId) + ZK_SEPERATOR + node + "-" + port; }
@Override public void removeBackpressure(String stormId) { try { stateStorage.delete_node(ClusterUtils.backpressureStormRoot(stormId)); } catch (Exception e) { if (Utils.exceptionCauseIsInstanceOf(KeeperException.class, e)) { // do nothing LOG.warn("Could not teardown backpressure node for {}.", stormId); } else { throw e; } } }
@Override public void setupBackpressure(String stormId, Map<String, Object> topoConf) { stateStorage.mkdirs(ClusterUtils.BACKPRESSURE_SUBTREE, defaultAcls); stateStorage.mkdirs(ClusterUtils.backpressureStormRoot(stormId), ClusterUtils.mkTopoReadWriteAcls(topoConf)); }
/** * Check whether a topology is in throttle-on status or not: if the backpresure/storm-id dir is not empty, this topology has * throttle-on, otherwise throttle-off. But if the backpresure/storm-id dir is not empty and has not been updated for more than * timeoutMs, we treat it as throttle-off. This will prevent the spouts from getting stuck indefinitely if something wrong happens. * * @param stormId The topology Id * @param timeoutMs How long until the backpressure znode is invalid. * @param callback The callback function * @return True is backpresure/storm-id dir is not empty and at least one of the backpressure znodes has not timed out; false otherwise. */ @Override public boolean topologyBackpressure(String stormId, long timeoutMs, Runnable callback) { if (callback != null) { backPressureCallback.put(stormId, callback); } String path = ClusterUtils.backpressureStormRoot(stormId); long mostRecentTimestamp = 0; if (stateStorage.node_exists(path, false)) { List<String> children = stateStorage.get_children(path, callback != null); mostRecentTimestamp = children.stream() .map(childPath -> stateStorage.get_data(ClusterUtils.backpressurePath(stormId, childPath), false)) .filter(data -> data != null) .mapToLong(data -> ByteBuffer.wrap(data).getLong()) .max() .orElse(0); } boolean ret = ((System.currentTimeMillis() - mostRecentTimestamp) < timeoutMs); LOG.debug("topology backpressure is {}", ret ? "on" : "off"); return ret; }
public static String backpressurePath(String stormId, String node, Long port) { return backpressureStormRoot(stormId) + ZK_SEPERATOR + node + "-" + port; }
@Override public void removeBackpressure(String stormId) { try { stateStorage.delete_node(ClusterUtils.backpressureStormRoot(stormId)); } catch (Exception e) { if (Utils.exceptionCauseIsInstanceOf(KeeperException.class, e)) { // do nothing LOG.warn("Could not teardown backpressure node for {}.", stormId); } else { throw e; } } }
/** * Check whether a topology is in throttle-on status or not: * if the backpresure/storm-id dir is not empty, this topology has throttle-on, otherwise throttle-off. * * @param stormId * @param callback * @return */ @Override public boolean topologyBackpressure(String stormId, Runnable callback) { if (callback != null) { backPressureCallback.put(stormId, callback); } String path = ClusterUtils.backpressureStormRoot(stormId); List<String> childrens = null; if(stateStorage.node_exists(path, false)) { childrens = stateStorage.get_children(path, callback != null); } else { childrens = new ArrayList<>(); } return childrens.size() > 0; }
@Override public void setupBackpressure(String stormId, Map<String, Object> topoConf) { stateStorage.mkdirs(ClusterUtils.BACKPRESSURE_SUBTREE, acls); stateStorage.mkdirs(ClusterUtils.backpressureStormRoot(stormId), ClusterUtils.mkTopoReadWriteAcls(topoConf)); }