/* * Licensed to Elasticsearch under one or more contributor * license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright * ownership. Elasticsearch licenses this file to you under * the Apache License, Version 2.0 (the "License"); you may * not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ package org.elasticsearch.cluster; import org.elasticsearch.cluster.routing.ShardRouting; import java.util.Collections; import java.util.Map; /** * ClusterInfo is an object representing a map of nodes to {@link DiskUsage} * and a map of shard ids to shard sizes, see * <code>InternalClusterInfoService.shardIdentifierFromRouting(String)</code> * for the key used in the shardSizes map */ public class ClusterInfo { private final Map<String, DiskUsage> leastAvailableSpaceUsage; private final Map<String, DiskUsage> mostAvailableSpaceUsage; final Map<String, Long> shardSizes; public static final ClusterInfo EMPTY = new ClusterInfo(); private final Map<ShardRouting, String> routingToDataPath; protected ClusterInfo() { this(Collections.EMPTY_MAP, Collections.EMPTY_MAP, Collections.EMPTY_MAP, Collections.EMPTY_MAP); } /** * Creates a new ClusterInfo instance. * * @param leastAvailableSpaceUsage a node id to disk usage mapping for the path that has the least available space on the node. * @param mostAvailableSpaceUsage a node id to disk usage mapping for the path that has the most available space on the node. * @param shardSizes a shardkey to size in bytes mapping per shard. * @param routingToDataPath the shard routing to datapath mapping * @see #shardIdentifierFromRouting */ public ClusterInfo(final Map<String, DiskUsage> leastAvailableSpaceUsage, final Map<String, DiskUsage> mostAvailableSpaceUsage, final Map<String, Long> shardSizes, Map<ShardRouting, String> routingToDataPath) { this.leastAvailableSpaceUsage = leastAvailableSpaceUsage; this.shardSizes = shardSizes; this.mostAvailableSpaceUsage = mostAvailableSpaceUsage; this.routingToDataPath = routingToDataPath; } /** * Returns a node id to disk usage mapping for the path that has the least available space on the node. */ public Map<String, DiskUsage> getNodeLeastAvailableDiskUsages() { return this.leastAvailableSpaceUsage; } /** * Returns a node id to disk usage mapping for the path that has the most available space on the node. */ public Map<String, DiskUsage> getNodeMostAvailableDiskUsages() { return this.mostAvailableSpaceUsage; } /** * Returns the shard size for the given shard routing or <code>null</code> it that metric is not available. */ public Long getShardSize(ShardRouting shardRouting) { return shardSizes.get(shardIdentifierFromRouting(shardRouting)); } /** * Returns the nodes absolute data-path the given shard is allocated on or <code>null</code> if the information is not available. */ public String getDataPath(ShardRouting shardRouting) { return routingToDataPath.get(shardRouting); } /** * Returns the shard size for the given shard routing or <code>defaultValue</code> it that metric is not available. */ public long getShardSize(ShardRouting shardRouting, long defaultValue) { Long shardSize = getShardSize(shardRouting); return shardSize == null ? defaultValue : shardSize; } /** * Method that incorporates the ShardId for the shard into a string that * includes a 'p' or 'r' depending on whether the shard is a primary. */ static String shardIdentifierFromRouting(ShardRouting shardRouting) { return shardRouting.shardId().toString() + "[" + (shardRouting.primary() ? "p" : "r") + "]"; } }