Ejemplo n.º 1
0
  @Test
  public void testRpcFailover() throws Exception {
    String appPath = testMeta.dir;
    Configuration conf = new Configuration(false);
    final AtomicBoolean timedout = new AtomicBoolean();

    StreamingContainerUmbilicalProtocol impl =
        MockitoUtil.mockProtocol(StreamingContainerUmbilicalProtocol.class);

    Mockito.doAnswer(
            new org.mockito.stubbing.Answer<Void>() {
              @Override
              public Void answer(InvocationOnMock invocation) {
                LOG.debug("got call: " + invocation.getMethod());
                if (!timedout.get()) {
                  try {
                    timedout.set(true);
                    Thread.sleep(1000);
                  } catch (Exception e) {
                  }
                  // throw new RuntimeException("fail");
                }
                return null;
              }
            })
        .when(impl)
        .log("containerId", "timeout");

    Server server =
        new RPC.Builder(conf)
            .setProtocol(StreamingContainerUmbilicalProtocol.class)
            .setInstance(impl)
            .setBindAddress("0.0.0.0")
            .setPort(0)
            .setNumHandlers(1)
            .setVerbose(false)
            .build();
    server.start();
    InetSocketAddress address = NetUtils.getConnectAddress(server);
    LOG.info("Mock server listening at " + address);

    int rpcTimeoutMillis = 500;
    int retryDelayMillis = 100;
    int retryTimeoutMillis = 500;

    FSRecoveryHandler recoveryHandler = new FSRecoveryHandler(appPath, conf);
    URI uri =
        RecoverableRpcProxy.toConnectURI(
            address, rpcTimeoutMillis, retryDelayMillis, retryTimeoutMillis);
    recoveryHandler.writeConnectUri(uri.toString());

    RecoverableRpcProxy rp = new RecoverableRpcProxy(appPath, conf);
    StreamingContainerUmbilicalProtocol protocolProxy = rp.getProxy();
    protocolProxy.log("containerId", "msg");
    // simulate socket read timeout
    try {
      protocolProxy.log("containerId", "timeout");
      Assert.fail("expected socket timeout");
    } catch (java.net.SocketTimeoutException e) {
      // expected
    }
    Assert.assertTrue("timedout", timedout.get());
    rp.close();

    // test success on retry
    timedout.set(false);
    retryTimeoutMillis = 1500;
    uri =
        RecoverableRpcProxy.toConnectURI(
            address, rpcTimeoutMillis, retryDelayMillis, retryTimeoutMillis);
    recoveryHandler.writeConnectUri(uri.toString());

    protocolProxy.log("containerId", "timeout");
    Assert.assertTrue("timedout", timedout.get());

    rp.close();
    server.stop();
  }
 /** Stop all Collector threads and wait for all to finish. */
 public void stop() {
   running = false;
   if (server != null) server.stop();
   if (aggregateDaemon != null) aggregateDaemon.interrupt();
 }