Java tutorial
/* * Druid - a distributed column store. * Copyright (C) 2012 Metamarkets Group Inc. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ package com.metamx.druid.master; import com.google.common.collect.HashBasedTable; import com.google.common.collect.Maps; import com.google.common.collect.MinMaxPriorityQueue; import com.google.common.collect.Table; import com.metamx.druid.client.DataSegment; import com.metamx.druid.client.DruidServer; import java.util.Map; /** * A lookup for the number of replicants of a given segment for a certain tier. */ public class SegmentReplicantLookup { public static SegmentReplicantLookup make(DruidCluster cluster) { final Table<String, String, Integer> segmentsInCluster = HashBasedTable.create(); final Table<String, String, Integer> loadingSegments = HashBasedTable.create(); for (MinMaxPriorityQueue<ServerHolder> serversByType : cluster.getSortedServersByTier()) { for (ServerHolder serverHolder : serversByType) { DruidServer server = serverHolder.getServer(); for (DataSegment segment : server.getSegments().values()) { Integer numReplicants = segmentsInCluster.get(segment.getIdentifier(), server.getTier()); if (numReplicants == null) { numReplicants = 0; } segmentsInCluster.put(segment.getIdentifier(), server.getTier(), ++numReplicants); } // Also account for queued segments for (DataSegment segment : serverHolder.getPeon().getSegmentsToLoad()) { Integer numReplicants = loadingSegments.get(segment.getIdentifier(), server.getTier()); if (numReplicants == null) { numReplicants = 0; } loadingSegments.put(segment.getIdentifier(), server.getTier(), ++numReplicants); } } } return new SegmentReplicantLookup(segmentsInCluster, loadingSegments); } private final Table<String, String, Integer> segmentsInCluster; private final Table<String, String, Integer> loadingSegments; private SegmentReplicantLookup(Table<String, String, Integer> segmentsInCluster, Table<String, String, Integer> loadingSegments) { this.segmentsInCluster = segmentsInCluster; this.loadingSegments = loadingSegments; } public Map<String, Integer> getClusterTiers(String segmentId) { Map<String, Integer> retVal = segmentsInCluster.row(segmentId); return (retVal == null) ? Maps.<String, Integer>newHashMap() : retVal; } public Map<String, Integer> getLoadingTiers(String segmentId) { Map<String, Integer> retVal = loadingSegments.row(segmentId); return (retVal == null) ? Maps.<String, Integer>newHashMap() : retVal; } public int getClusterReplicants(String segmentId, String tier) { Integer retVal = segmentsInCluster.get(segmentId, tier); return (retVal == null) ? 0 : retVal; } public int getLoadingReplicants(String segmentId, String tier) { Integer retVal = loadingSegments.get(segmentId, tier); return (retVal == null) ? 0 : retVal; } public int getTotalReplicants(String segmentId, String tier) { return getClusterReplicants(segmentId, tier) + getLoadingReplicants(segmentId, tier); } }