/** * Copyright 2010 The Apache Software Foundation * * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF 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.apache.hadoop.hbase; import java.io.DataInput; import java.io.DataOutput; import java.io.IOException; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; import java.util.TreeSet; import org.apache.hadoop.hbase.master.RegionState; /** * The cluster status of a cross site table. */ public class CrossSiteClusterStatus extends ClusterStatus { private static final byte VERSION = 0; private List<ClusterStatus> status; /** * Constructor, for Writable */ public CrossSiteClusterStatus() { super(); } public CrossSiteClusterStatus(List<ClusterStatus> status) { if (status == null) { this.status = Collections.emptyList(); } else { this.status = status; } } /** * {@inheritDoc} */ @Override public Collection<ServerName> getDeadServerNames() { List<ServerName> deadServerNames = new ArrayList<ServerName>(); for (ClusterStatus cs : status) { if (cs.getDeadServerNames() != null) { for (ServerName sn : cs.getDeadServerNames()) { deadServerNames.add(sn); } } } return deadServerNames; } /** * {@inheritDoc} */ @Override public int getServersSize() { int count = 0; for (ClusterStatus cs : status) { count += cs.getServersSize(); } return count; } /** * {@inheritDoc} */ @Override public int getDeadServers() { int count = 0; for (ClusterStatus cs : status) { count += cs.getDeadServers(); } return count; } /** * {@inheritDoc} */ @Override public double getAverageLoad() { int load = getRegionsCount(); return (double) load / (double) getServersSize(); } /** * {@inheritDoc} */ @Override public int getRegionsCount() { int count = 0; for (ClusterStatus cs : status) { count += cs.getRegionsCount(); } return count; } /** * {@inheritDoc} */ @Override public int getRequestsCount() { int count = 0; for (ClusterStatus cs : status) { count += cs.getRequestsCount(); } return count; } /** * {@inheritDoc} */ @Override public String getHBaseVersion() { Set<String> versions = new TreeSet<String>(); for (ClusterStatus cs : status) { versions.add(cs.getHBaseVersion()); } StringBuilder sr = new StringBuilder(); for (String version : versions) { sr.append(version).append(","); } if (sr.length() > 1) { return sr.substring(0, sr.length() - 1); } else { return sr.toString(); } } /** * {@inheritDoc} */ @Override public boolean equals(Object o) { if (this == o) { return true; } if (!(o instanceof CrossSiteClusterStatus)) { return false; } CrossSiteClusterStatus right = (CrossSiteClusterStatus) o; if (this.getClusterStatus().size() != right.getClusterStatus().size()) { return false; } boolean equals = true; for (int i = 0; i < this.getClusterStatus().size(); i++) { if (!this.getClusterStatus().get(i) .equals(right.getClusterStatus().get(i))) { equals = false; break; } } return equals; } /** * {@inheritDoc} */ @Override public int hashCode() { int hashCode = VERSION; for (ClusterStatus cs : status) { hashCode += cs.hashCode(); } return hashCode; } /** * {@inheritDoc} */ @Override public byte getVersion() { return VERSION; } /** * @deprecated Use {@link #getServers()} */ @Override public Collection<ServerName> getServerInfo() { List<ServerName> serverInfos = new ArrayList<ServerName>(); for (ClusterStatus cs : status) { if (cs.getServerInfo() != null) { for (ServerName sn : cs.getServerInfo()) { serverInfos.add(sn); } } } return serverInfos; } /** * {@inheritDoc} */ @Override public Collection<ServerName> getServers() { List<ServerName> servers = new ArrayList<ServerName>(); for (ClusterStatus cs : status) { if (cs.getServers() != null) { for (ServerName sn : cs.getServers()) { servers.add(sn); } } } return servers; } /** * Returns the first HMaster in the collection of the ClusterStatus. */ @Override public ServerName getMaster() { if (status.size() > 1) { return status.get(0).getMaster(); } else { return null; } } /** * {@inheritDoc} */ @Override public int getBackupMastersSize() { int size = 0; for (ClusterStatus cs : status) { size += cs.getBackupMastersSize(); } return size; } /** * {@inheritDoc} */ @Override public Collection<ServerName> getBackupMasters() { List<ServerName> backMasters = new ArrayList<ServerName>(); for (ClusterStatus cs : status) { if (cs.getBackupMasters() != null) { for (ServerName sn : cs.getBackupMasters()) { backMasters.add(sn); } } } return backMasters; } /** * {@inheritDoc} */ @Override public ServerLoad getLoad(ServerName sn) { ServerLoad load = null; for (ClusterStatus cs : status) { load = cs.getLoad(sn); if (load != null) { break; } } return load; } /** * {@inheritDoc} */ @Override public Map<String, RegionState> getRegionsInTransition() { Map<String, RegionState> state = new HashMap<String, RegionState>(); for (ClusterStatus cs : status) { if (cs.getRegionsInTransition() != null) { state.putAll(cs.getRegionsInTransition()); } } return state; } /** * Gets the cluster id. * This id is composed of the ids of all the sub cluster, looks like * id1,id2,id3... */ @Override public String getClusterId() { StringBuilder sr = new StringBuilder(); for (ClusterStatus cs : status) { sr.append(cs.getClusterId()).append(","); } if (sr.length() > 1) { return sr.substring(0, sr.length() - 1); } else { return sr.toString(); } } /** * {@inheritDoc} */ @Override public String[] getMasterCoprocessors() { List<String> masterCoprocessors = new ArrayList<String>(); for (ClusterStatus cs : status) { if (cs.getMasterCoprocessors() != null) { for (String mcr : cs.getMasterCoprocessors()) { masterCoprocessors.add(mcr); } } } return masterCoprocessors.toArray(new String[0]); } /** * Gets the list of the status of all the sub clusters. * * @return */ public List<ClusterStatus> getClusterStatus() { return status; } @Override public void write(DataOutput out) throws IOException { out.writeInt(status.size()); for (ClusterStatus cs : status) { cs.write(out); } } @Override public void readFields(DataInput in) throws IOException { int size = in.readInt(); status = new ArrayList<ClusterStatus>(size); for (int i = 0; i < size; i++) { ClusterStatus cs = new ClusterStatus(); cs.readFields(in); status.add(cs); } } }