/* * Licensed 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.tez.service.impl; import java.io.IOException; import java.net.InetSocketAddress; import java.util.concurrent.atomic.AtomicReference; import com.google.common.annotations.VisibleForTesting; import com.google.protobuf.BlockingService; import com.google.protobuf.RpcController; import com.google.protobuf.ServiceException; import org.apache.hadoop.classification.InterfaceAudience; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.ipc.ProtobufRpcEngine; import org.apache.hadoop.ipc.RPC; import org.apache.hadoop.net.NetUtils; import org.apache.hadoop.service.AbstractService; import org.apache.tez.dag.api.TezException; import org.apache.tez.service.ContainerRunner; import org.apache.tez.service.TezTestServiceProtocolBlockingPB; import org.apache.tez.test.service.rpc.TezTestServiceProtocolProtos; import org.apache.tez.test.service.rpc.TezTestServiceProtocolProtos.RunContainerRequestProto; import org.apache.tez.test.service.rpc.TezTestServiceProtocolProtos.RunContainerResponseProto; import org.apache.tez.test.service.rpc.TezTestServiceProtocolProtos.SubmitWorkRequestProto; import org.apache.tez.test.service.rpc.TezTestServiceProtocolProtos.SubmitWorkResponseProto; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class TezTestServiceProtocolServerImpl extends AbstractService implements TezTestServiceProtocolBlockingPB { private static final Logger LOG = LoggerFactory.getLogger(TezTestServiceProtocolServerImpl.class); private final ContainerRunner containerRunner; private RPC.Server server; private final AtomicReference<InetSocketAddress> bindAddress; public TezTestServiceProtocolServerImpl(ContainerRunner containerRunner, AtomicReference<InetSocketAddress> address) { super(TezTestServiceProtocolServerImpl.class.getSimpleName()); this.containerRunner = containerRunner; this.bindAddress = address; } @Override public RunContainerResponseProto runContainer(RpcController controller, RunContainerRequestProto request) throws ServiceException { LOG.info("Received request: " + request); try { containerRunner.queueContainer(request); } catch (TezException e) { throw new ServiceException(e); } return RunContainerResponseProto.getDefaultInstance(); } @Override public SubmitWorkResponseProto submitWork(RpcController controller, SubmitWorkRequestProto request) throws ServiceException { LOG.info("Received submitWork request: " + request); try { containerRunner.submitWork(request); } catch (TezException e) { throw new ServiceException(e); } return SubmitWorkResponseProto.getDefaultInstance(); } @Override public void serviceStart() { Configuration conf = getConfig(); int numHandlers = 3; InetSocketAddress addr = new InetSocketAddress(0); try { server = createServer(TezTestServiceProtocolBlockingPB.class, addr, conf, numHandlers, TezTestServiceProtocolProtos.TezTestServiceProtocol.newReflectiveBlockingService(this)); server.start(); } catch (IOException e) { LOG.error("Failed to run RPC Server", e); throw new RuntimeException(e); } InetSocketAddress serverBindAddress = NetUtils.getConnectAddress(server); this.bindAddress.set(NetUtils.createSocketAddrForHost( serverBindAddress.getAddress().getCanonicalHostName(), serverBindAddress.getPort())); LOG.info("Instantiated TestTestServiceListener at " + bindAddress); } @Override public void serviceStop() { if (server != null) { server.stop(); } } @InterfaceAudience.Private @VisibleForTesting InetSocketAddress getBindAddress() { return this.bindAddress.get(); } private RPC.Server createServer(Class<?> pbProtocol, InetSocketAddress addr, Configuration conf, int numHandlers, BlockingService blockingService) throws IOException { RPC.setProtocolEngine(conf, pbProtocol, ProtobufRpcEngine.class); RPC.Server server = new RPC.Builder(conf) .setProtocol(pbProtocol) .setInstance(blockingService) .setBindAddress(addr.getHostName()) .setPort(0) .setNumHandlers(numHandlers) .build(); // TODO Add security. return server; } }