public void dropSegment(String from, String segmentName, final LoadPeonCallback callback) { try { final DruidServer fromServer = serverInventoryView.getInventoryValue(from); if (fromServer == null) { throw new IAE("Unable to find server [%s]", from); } final DataSegment segment = fromServer.getSegment(segmentName); if (segment == null) { throw new IAE("Unable to find segment [%s] on server [%s]", segmentName, from); } final LoadQueuePeon dropPeon = loadManagementPeons.get(from); if (dropPeon == null) { throw new IAE("LoadQueuePeon hasn't been created yet for path [%s]", from); } if (!dropPeon.getSegmentsToDrop().contains(segment)) { dropPeon.dropSegment(segment, callback); } } catch (Exception e) { log.makeAlert(e, "Exception dropping segment %s", segmentName).emit(); callback.execute(); } }
@GET @Path("/{serverName}/segments") @Produces(MediaType.APPLICATION_JSON) public Response getServerSegments( @PathParam("serverName") String serverName, @QueryParam("full") String full) { Response.ResponseBuilder builder = Response.status(Response.Status.OK); DruidServer server = serverInventoryView.getInventoryValue(serverName); if (server == null) { return Response.status(Response.Status.NOT_FOUND).build(); } if (full != null) { return builder.entity(server.getSegments().values()).build(); } return builder .entity( Collections2.transform( server.getSegments().values(), new Function<DataSegment, String>() { @Override public String apply(DataSegment segment) { return segment.getIdentifier(); } })) .build(); }
@GET @Path("/{serverName}/segments/{segmentId}") @Produces(MediaType.APPLICATION_JSON) public Response getServerSegment( @PathParam("serverName") String serverName, @PathParam("segmentId") String segmentId) { DruidServer server = serverInventoryView.getInventoryValue(serverName); if (server == null) { return Response.status(Response.Status.NOT_FOUND).build(); } DataSegment segment = server.getSegment(segmentId); if (segment == null) { return Response.status(Response.Status.NOT_FOUND).build(); } return Response.status(Response.Status.OK).entity(segment).build(); }
public Map<String, Double> getLoadStatus() { // find available segments Map<String, Set<DataSegment>> availableSegments = Maps.newHashMap(); for (DataSegment dataSegment : getAvailableDataSegments()) { Set<DataSegment> segments = availableSegments.get(dataSegment.getDataSource()); if (segments == null) { segments = Sets.newHashSet(); availableSegments.put(dataSegment.getDataSource(), segments); } segments.add(dataSegment); } // find segments currently loaded Map<String, Set<DataSegment>> segmentsInCluster = Maps.newHashMap(); for (DruidServer druidServer : serverInventoryView.getInventory()) { for (DruidDataSource druidDataSource : druidServer.getDataSources()) { Set<DataSegment> segments = segmentsInCluster.get(druidDataSource.getName()); if (segments == null) { segments = Sets.newHashSet(); segmentsInCluster.put(druidDataSource.getName(), segments); } segments.addAll(druidDataSource.getSegments()); } } // compare available segments with currently loaded Map<String, Double> loadStatus = Maps.newHashMap(); for (Map.Entry<String, Set<DataSegment>> entry : availableSegments.entrySet()) { String dataSource = entry.getKey(); Set<DataSegment> segmentsAvailable = entry.getValue(); Set<DataSegment> loadedSegments = segmentsInCluster.get(dataSource); if (loadedSegments == null) { loadedSegments = Sets.newHashSet(); } Set<DataSegment> unloadedSegments = Sets.difference(segmentsAvailable, loadedSegments); loadStatus.put( dataSource, 100 * ((double) (segmentsAvailable.size() - unloadedSegments.size()) / (double) segmentsAvailable.size())); } return loadStatus; }
private static Map<String, Object> makeFullServer(DruidServer input) { return new ImmutableMap.Builder<String, Object>() .put("host", input.getHost()) .put("maxSize", input.getMaxSize()) .put("type", input.getType()) .put("tier", input.getTier()) .put("priority", input.getPriority()) .put("segments", input.getSegments()) .put("currSize", input.getCurrSize()) .build(); }
public void moveSegment( String from, String to, String segmentName, final LoadPeonCallback callback) { try { final DruidServer fromServer = serverInventoryView.getInventoryValue(from); if (fromServer == null) { throw new IAE("Unable to find server [%s]", from); } final DruidServer toServer = serverInventoryView.getInventoryValue(to); if (toServer == null) { throw new IAE("Unable to find server [%s]", to); } if (to.equalsIgnoreCase(from)) { throw new IAE( "Redundant command to move segment [%s] from [%s] to [%s]", segmentName, from, to); } final DataSegment segment = fromServer.getSegment(segmentName); if (segment == null) { throw new IAE("Unable to find segment [%s] on server [%s]", segmentName, from); } final LoadQueuePeon loadPeon = loadManagementPeons.get(to); if (loadPeon == null) { throw new IAE("LoadQueuePeon hasn't been created yet for path [%s]", to); } final LoadQueuePeon dropPeon = loadManagementPeons.get(from); if (dropPeon == null) { throw new IAE("LoadQueuePeon hasn't been created yet for path [%s]", from); } final ServerHolder toHolder = new ServerHolder(toServer, loadPeon); if (toHolder.getAvailableSize() < segment.getSize()) { throw new IAE( "Not enough capacity on server [%s] for segment [%s]. Required: %,d, available: %,d.", to, segment, segment.getSize(), toHolder.getAvailableSize()); } final String toLoadQueueSegPath = ZKPaths.makePath(ZKPaths.makePath(zkPaths.getLoadQueuePath(), to), segmentName); final String toServedSegPath = ZKPaths.makePath( ZKPaths.makePath( serverInventoryView.getInventoryManagerConfig().getInventoryPath(), to), segmentName); loadPeon.loadSegment( segment, new LoadPeonCallback() { @Override protected void execute() { try { if (curator.checkExists().forPath(toServedSegPath) != null && curator.checkExists().forPath(toLoadQueueSegPath) == null && !dropPeon.getSegmentsToDrop().contains(segment)) { dropPeon.dropSegment(segment, callback); } else if (callback != null) { callback.execute(); } } catch (Exception e) { throw Throwables.propagate(e); } } }); } catch (Exception e) { log.makeAlert(e, "Exception moving segment %s", segmentName).emit(); callback.execute(); } }