/** * Licensed to Cloudera, Inc. under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. Cloudera, Inc. 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 com.cloudera.flume.master; import java.io.IOException; import java.util.HashMap; import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.Map.Entry; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.cloudera.flume.conf.FlumeConfigData; import com.cloudera.flume.conf.FlumeConfiguration; import com.google.common.base.Preconditions; import com.google.common.collect.Multimap; /** * Implementation of the admin RPC interface. Since the wire protocol is * different for separate RPC implementations, they each run their own stub * servers, then delegate all requests to this common class. */ public class MasterAdminServer { static final Logger LOG = LoggerFactory.getLogger(MasterAdminServer.class); final protected FlumeMaster master; private RPCServer stubServer; public MasterAdminServer(FlumeMaster master, FlumeConfiguration config) throws IOException { Preconditions.checkArgument(master != null, "FlumeConfigMaster is null in MasterAdminServer!"); this.master = master; String rpcType = config.getMasterHeartbeatRPC(); this.stubServer = null; if (FlumeConfiguration.RPC_TYPE_AVRO.equals(rpcType)) { stubServer = new MasterAdminServerAvro(this); } else if (FlumeConfiguration.RPC_TYPE_THRIFT.equals(rpcType)) { stubServer = new MasterAdminServerThrift(this); } else { throw new IOException("No valid RPC framework specified in config"); } } public boolean isFailure(long cmdid) { return master.getCmdMan().isFailure(cmdid); } public boolean isSuccess(long cmdid) { return master.getCmdMan().isSuccess(cmdid); } public long submit(Command command) { return master.submit(command); } public void serve() throws IOException { this.stubServer.serve(); } public void stop() throws IOException { this.stubServer.stop(); } public Map<String, StatusManager.NodeStatus> getNodeStatuses() { Map<String, StatusManager.NodeStatus> statuses = master.getStatMan() .getNodeStatuses(); Map<String, StatusManager.NodeStatus> ret = new HashMap<String, StatusManager.NodeStatus>(); for (Entry<String, StatusManager.NodeStatus> e : statuses.entrySet()) { ret.put(e.getKey(), e.getValue()); } return ret; } public Map<String, FlumeConfigData> getConfigs() { return master.getSpecMan().getAllConfigs(); } /** * Fetch the list of logical to physical mappings and return it as {@link Map} * <{@link String}, {@link List}<String>> where the key is the * physical node name and the value is a list of logical nodes mapped to it. * * @param physicalNode * The physical node for which to fetch mappings or null to fetch * all. * @return the node map */ public Map<String, List<String>> getMappings(String physicalNode) { Map<String, List<String>> resultMap = new HashMap<String, List<String>>(); if (physicalNode != null) { List<String> logicalNodes = master.getSpecMan().getLogicalNode( physicalNode); if (logicalNodes != null && logicalNodes.size() > 0) { resultMap.put(physicalNode, master.getSpecMan().getLogicalNode( physicalNode)); } } else { Multimap<String, String> m = master.getSpecMan().getLogicalNodeMap(); // Transform the multimap into a map of string => list<string>. for (Entry<String, String> entry : m.entries()) { if (!resultMap.containsKey(entry.getKey())) { resultMap.put(entry.getKey(), new LinkedList<String>()); } resultMap.get(entry.getKey()).add(entry.getValue()); } } return resultMap; } /* * Returns true if there is a command in the command manager with the * specified id. */ public boolean hasCmdId(long cmdid) { return master.getCmdMan().getStatus(cmdid) != null; } public CommandStatus getCommandStatus(long cmdId) { return master.getCmdMan().getStatus(cmdId); } }