예제 #1
0
  protected void waitForBridgeView(
      int expected_size, long timeout, long interval, JChannel... channels) {
    long deadline = System.currentTimeMillis() + timeout;

    while (System.currentTimeMillis() < deadline) {
      boolean views_correct = true;
      for (JChannel ch : channels) {
        RELAY2 relay = (RELAY2) ch.getProtocolStack().findProtocol(RELAY2.class);
        View bridge_view = relay.getBridgeView(BRIDGE_CLUSTER);
        if (bridge_view == null || bridge_view.size() != expected_size) {
          views_correct = false;
          break;
        }
      }
      if (views_correct) break;
      Util.sleep(interval);
    }

    System.out.println("Bridge views:\n");
    for (JChannel ch : channels) {
      RELAY2 relay = (RELAY2) ch.getProtocolStack().findProtocol(RELAY2.class);
      View bridge_view = relay.getBridgeView(BRIDGE_CLUSTER);
      System.out.println(ch.getAddress() + ": " + bridge_view);
    }

    for (JChannel ch : channels) {
      RELAY2 relay = (RELAY2) ch.getProtocolStack().findProtocol(RELAY2.class);
      View bridge_view = relay.getBridgeView(BRIDGE_CLUSTER);
      assert bridge_view != null && bridge_view.size() == expected_size
          : ch.getAddress() + ": bridge view=" + bridge_view + ", expected=" + expected_size;
    }
  }
예제 #2
0
  /** Tests that notifications are routed to all sites. */
  public void testNotificationAndRpcRelay2Transit() throws Exception {
    a.connect(LON_CLUSTER);
    b.connect(LON_CLUSTER);
    rpca.start();
    rpcb.start();
    Util.waitUntilAllChannelsHaveSameSize(30000, 500, a, b);

    x.connect(SFO_CLUSTER);
    y.connect(SFO_CLUSTER);
    rpcx.start();
    rpcy.start();
    Util.waitUntilAllChannelsHaveSameSize(30000, 500, x, y);

    assert x.getView().size() == 2;

    RELAY2 ar = (RELAY2) a.getProtocolStack().findProtocol(RELAY2.class);
    RELAY2 xr = (RELAY2) x.getProtocolStack().findProtocol(RELAY2.class);

    assert ar != null && xr != null;

    JChannel a_bridge = null, x_bridge = null;
    for (int i = 0; i < 20; i++) {
      a_bridge = ar.getBridge(SFO);
      x_bridge = xr.getBridge(LON);
      if (a_bridge != null
          && x_bridge != null
          && a_bridge.getView().size() == 2
          && x_bridge.getView().size() == 2) break;
      Util.sleep(500);
    }

    assert a_bridge != null && x_bridge != null;

    System.out.println("A's bridge channel: " + a_bridge.getView());
    System.out.println("X's bridge channel: " + x_bridge.getView());
    assert a_bridge.getView().size() == 2 : "bridge view is " + a_bridge.getView();
    assert x_bridge.getView().size() == 2 : "bridge view is " + x_bridge.getView();

    Relayer.Route route = getRoute(x, LON);
    System.out.println("Route at sfo to lon: " + route);
    assert route != null;

    System.out.println("B: sending message 0 to the site master of SFO");
    Address sm_sfo = new SiteMaster(SFO);
    b.send(sm_sfo, 0);
    checkMsgDelivery(xl);

    System.out.println("B: sending message to all");
    b.send(null, 0);
    checkMsgDelivery(xl, yl, al, bl);

    MethodCall call = new MethodCall(ServerObject.class.getMethod("foo"));

    System.out.println("B: call foo method on A");
    Object rsp =
        rpcb.callRemoteMethod(a.getAddress(), call, new RequestOptions(ResponseMode.GET_ALL, 5000));
    System.out.println("RSP is: " + rsp);

    System.out.println("B: call foo method on SFO master site");
    rsp = rpcb.callRemoteMethod(sm_sfo, call, new RequestOptions(ResponseMode.GET_ALL, 5000));
    System.out.println("RSP is: " + rsp);

    System.out.println("B: call foo method on all members dest = null");
    RspList<Integer> rsps =
        rpcb.callRemoteMethods(null, call, new RequestOptions(ResponseMode.GET_ALL, 5000));
    System.out.println("RSPs are: \n" + rsps);

    View bridge_view = xr.getBridgeView(BRIDGE_CLUSTER);
    System.out.println("bridge_view = " + bridge_view);

    route = getRoute(x, LON);
    System.out.println("Route at sfo to lon: " + route);
    assert route != null;
  }