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; } }
/** 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; }