/* * 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.corona; import org.apache.hadoop.net.NetUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.thrift.TException; import org.apache.thrift.protocol.TBinaryProtocol; import org.apache.thrift.transport.TFramedTransport; import org.apache.thrift.transport.TSocket; import java.io.IOException; import java.net.InetSocketAddress; /** * Has helper method(s) related to the availability of the ClusterManager */ public class ClusterManagerAvailabilityChecker { static final Log LOG = LogFactory.getLog(ClusterManagerAvailabilityChecker.class); /** * Used for getting a client to the CoronaProxyJobTracker * @param conf * @return Returns a client to the CPJT * @throws IOException */ public static CoronaProxyJobTrackerService.Client getPJTClient(CoronaConf conf) throws IOException { InetSocketAddress address = NetUtils.createSocketAddr(conf.getProxyJobTrackerThriftAddress()); TFramedTransport transport = new TFramedTransport( new TSocket(address.getHostName(), address.getPort())); CoronaProxyJobTrackerService.Client client = new CoronaProxyJobTrackerService.Client(new TBinaryProtocol(transport)); try { transport.open(); } catch (TException e) { LOG.info("Transport Exception: ", e); } return client; } /** * This helper method simply polls the ProxyJobTracker if and until the * clusterManagerSafeMode flag is set there. * @param conf * @throws IOException */ public static void waitWhileClusterManagerInSafeMode(CoronaConf conf) throws IOException { CoronaProxyJobTrackerService.Client pjtClient = getPJTClient(conf); while (true) { try { // If this condition holds true, then two things can happen: // 1. The CM was never in Safe Mode // 2. CM was in Safe Mode, just before we made this method call, and // came out of Safe Mode before the RPC call. if (!pjtClient.getClusterManagerSafeModeFlag()) { break; } // If the safe mode flag is indeed set LOG.info("Safe mode flag is set on the ProxyJobTracker"); try { Thread.sleep(1000); } catch (InterruptedException e) { throw new IOException(e); } } catch (TException e) { throw new IOException( "Could not check the safe mode flag on the ProxyJobTracker", e); } } } }