| /*========================================================================= |
| * Copyright (c) 2010-2014 Pivotal Software, Inc. All Rights Reserved. |
| * This product is protected by U.S. and international copyright |
| * and intellectual property laws. Pivotal products are covered by |
| * one or more patents listed at http://www.pivotal.io/patents. |
| *========================================================================= |
| */ |
| package com.gemstone.gemfire.management; |
| |
| import java.io.IOException; |
| import java.util.Collections; |
| import java.util.HashSet; |
| import java.util.List; |
| import java.util.Properties; |
| import java.util.Set; |
| |
| import com.gemstone.gemfire.InternalGemFireException; |
| import com.gemstone.gemfire.LogWriter; |
| import com.gemstone.gemfire.cache.AttributesFactory; |
| import com.gemstone.gemfire.cache.CacheException; |
| import com.gemstone.gemfire.cache.Region; |
| import com.gemstone.gemfire.cache.Scope; |
| import com.gemstone.gemfire.cache.client.PoolManager; |
| import com.gemstone.gemfire.cache.client.ServerConnectivityException; |
| import com.gemstone.gemfire.cache.client.internal.PoolImpl; |
| import com.gemstone.gemfire.cache30.BridgeTestCase; |
| import com.gemstone.gemfire.cache30.CacheSerializableRunnable; |
| import com.gemstone.gemfire.distributed.DistributedMember; |
| import com.gemstone.gemfire.distributed.DurableClientAttributes; |
| import com.gemstone.gemfire.distributed.internal.DistributionConfig; |
| import com.gemstone.gemfire.internal.AvailablePort; |
| import com.gemstone.gemfire.internal.cache.GemFireCacheImpl; |
| import com.gemstone.gemfire.internal.cache.tier.InternalBridgeMembership; |
| import com.gemstone.gemfire.internal.cache.tier.sockets.ServerConnection; |
| import com.gemstone.gemfire.internal.logging.InternalLogWriter; |
| import com.gemstone.gemfire.internal.logging.LocalLogWriter; |
| import com.gemstone.gemfire.management.membership.ClientMembership; |
| import com.gemstone.gemfire.management.membership.ClientMembershipEvent; |
| import com.gemstone.gemfire.management.membership.ClientMembershipListener; |
| import com.gemstone.gemfire.management.membership.MembershipEvent; |
| import com.gemstone.gemfire.management.membership.MembershipListener; |
| import com.gemstone.gemfire.management.membership.UniversalMembershipListenerAdapter; |
| |
| import dunit.Host; |
| import dunit.SerializableRunnable; |
| import dunit.VM; |
| |
| /** |
| * Tests the UniversalMembershipListenerAdapter. |
| * |
| * @author Kirk Lund |
| * @since 4.2.1 |
| */ |
| |
| public class UniversalMembershipListenerAdapterDUnitTest extends BridgeTestCase { |
| protected static final boolean CLIENT = true; |
| protected static final boolean SERVER = false; |
| |
| protected static final int JOINED = 0; |
| protected static final int LEFT = 1; |
| protected static final int CRASHED = 2; |
| |
| /** Brief pause for basic testing of asynchronous event notification */ |
| private static final int BRIEF_PAUSE_MILLIS = 2000; |
| /** Maximum millis allowed for bridge client to fully connect before test fails */ |
| private static final int JOIN_FAIL_MILLIS = 120000; |
| |
| // the following wait millis are max wait time until notify occurs |
| |
| /** Millis to wait for connection to AdminDS */ |
| private static final int CONNECT_WAIT_MILLIS = 5000; |
| /** Millis to wait for basic synchronous listener to be notified */ |
| private static final int SYNC_ASYNC_EVENT_WAIT_MILLIS = 2000; |
| /** Millis to wait for all three event listeners to be notified */ |
| private static final int ASYNC_EVENT_WAIT_MILLIS = 120000; // use Integer.MAX_VALUE for debugging |
| |
| public UniversalMembershipListenerAdapterDUnitTest(String name) { |
| super(name); |
| } |
| |
| @Override |
| public void tearDown2() throws Exception { |
| super.tearDown2(); |
| InternalBridgeMembership.unregisterAllListeners(); |
| } |
| |
| /** |
| * Tests wrapping of BridgeMembershipEvent fired as MembershipEvent. |
| */ |
| public void testAdaptedBridgeEvents() throws Exception { |
| getSystem(); |
| |
| final boolean[] fired = new boolean[1]; |
| final DistributedMember[] member = new DistributedMember[1]; |
| final String[] memberId = new String[1]; |
| |
| UniversalMembershipListenerAdapter listener = |
| new UniversalMembershipListenerAdapter() { |
| @Override |
| public synchronized void memberJoined(MembershipEvent event) { |
| assertFalse(fired[0]); // assures no dupes |
| assertNull(member[0]); |
| assertNull(memberId[0]); |
| fired[0] = true; |
| member[0] = event.getDistributedMember(); |
| memberId[0] = event.getMemberId(); |
| notify(); |
| } |
| @Override |
| public void memberLeft(MembershipEvent event) { |
| } |
| @Override |
| public void memberCrashed(MembershipEvent event) { |
| } |
| }; |
| |
| DistributedMember clientJoined = new TestDistributedMember("clientJoined"); |
| InternalBridgeMembership.notifyJoined(clientJoined, true); |
| synchronized(listener) { |
| if (!fired[0]) { |
| listener.wait(SYNC_ASYNC_EVENT_WAIT_MILLIS); |
| } |
| } |
| assertTrue(fired[0]); |
| assertEquals(clientJoined, member[0]); |
| assertEquals(clientJoined.getId(), memberId[0]); |
| } |
| |
| /** |
| * Tests use of history to prevent duplicate events. |
| */ |
| public void testNoDuplicates() throws Exception { |
| getSystem(); |
| |
| final boolean[] fired = new boolean[3]; |
| final DistributedMember[] member = new DistributedMember[3]; |
| final String[] memberId = new String[3]; |
| |
| UniversalMembershipListenerAdapter listener = |
| new UniversalMembershipListenerAdapter() { |
| @Override |
| public synchronized void memberJoined(MembershipEvent event) { |
| assertFalse(fired[JOINED]); |
| assertNull(member[JOINED]); |
| assertNull(memberId[JOINED]); |
| fired[JOINED] = true; |
| member[JOINED] = event.getDistributedMember(); |
| memberId[JOINED] = event.getMemberId(); |
| notify(); |
| } |
| @Override |
| public synchronized void memberLeft(MembershipEvent event) { |
| assertFalse(fired[LEFT]); |
| assertNull(member[LEFT]); |
| assertNull(memberId[LEFT]); |
| fired[LEFT] = true; |
| member[LEFT] = event.getDistributedMember(); |
| memberId[LEFT] = event.getMemberId(); |
| notify(); |
| } |
| @Override |
| public synchronized void memberCrashed(MembershipEvent event) { |
| assertFalse(fired[CRASHED]); // assures no dupes |
| assertNull(member[CRASHED]); |
| assertNull(memberId[CRASHED]); |
| fired[CRASHED] = true; |
| member[CRASHED] = event.getDistributedMember(); |
| memberId[CRASHED] = event.getMemberId(); |
| notify(); |
| } |
| }; |
| |
| DistributedMember memberA = new TestDistributedMember("memberA"); |
| |
| // first join |
| InternalBridgeMembership.notifyJoined(memberA, true); |
| synchronized(listener) { |
| if (!fired[JOINED]) { |
| listener.wait(SYNC_ASYNC_EVENT_WAIT_MILLIS); |
| } |
| } |
| assertTrue(fired[JOINED]); |
| assertEquals(memberA, member[JOINED]); |
| assertEquals(memberA.getId(), memberId[JOINED]); |
| fired[JOINED] = false; |
| member[JOINED] = null; |
| memberId[JOINED] = null; |
| |
| // duplicate join |
| InternalBridgeMembership.notifyJoined(memberA, true); |
| pause(BRIEF_PAUSE_MILLIS); |
| assertFalse(fired[JOINED]); |
| assertNull(member[JOINED]); |
| assertNull(memberId[JOINED]); |
| |
| // first left |
| InternalBridgeMembership.notifyLeft(memberA, true); |
| synchronized(listener) { |
| if (!fired[LEFT]) { |
| listener.wait(SYNC_ASYNC_EVENT_WAIT_MILLIS); |
| } |
| } |
| assertTrue(fired[LEFT]); |
| assertEquals(memberA, member[LEFT]); |
| assertEquals(memberA.getId(), memberId[LEFT]); |
| fired[LEFT] = false; |
| member[LEFT] = null; |
| memberId[LEFT] = null; |
| |
| // duplicate left |
| InternalBridgeMembership.notifyLeft(memberA, true); |
| pause(BRIEF_PAUSE_MILLIS); |
| assertFalse(fired[LEFT]); |
| assertNull(member[LEFT]); |
| assertNull(memberId[LEFT]); |
| |
| // rejoin |
| InternalBridgeMembership.notifyJoined(memberA, true); |
| synchronized(listener) { |
| if (!fired[JOINED]) { |
| listener.wait(SYNC_ASYNC_EVENT_WAIT_MILLIS); |
| } |
| } |
| assertTrue(fired[JOINED]); |
| assertEquals(memberA, member[JOINED]); |
| assertEquals(memberA.getId(), memberId[JOINED]); |
| } |
| |
| /** |
| * Tests notification of events for loner bridge clients in server process. |
| */ |
| public void testLonerClientEventsInServer() throws Exception { |
| try { |
| doTestLonerClientEventsInServer(); |
| } |
| finally { |
| disconnectAllFromDS(); |
| } |
| } |
| private void doTestLonerClientEventsInServer() throws Exception { |
| final boolean[] firedSystem = new boolean[3]; |
| final DistributedMember[] memberSystem = new DistributedMember[3]; |
| final String[] memberIdSystem = new String[3]; |
| final boolean[] isClientSystem = new boolean[3]; |
| |
| final boolean[] firedAdapter = new boolean[3]; |
| final DistributedMember[] memberAdapter = new DistributedMember[3]; |
| final String[] memberIdAdapter = new String[3]; |
| final boolean[] isClientAdapter = new boolean[3]; |
| |
| final boolean[] firedBridge = new boolean[3]; |
| final DistributedMember[] memberBridge = new DistributedMember[3]; |
| final String[] memberIdBridge = new String[3]; |
| final boolean[] isClientBridge = new boolean[3]; |
| |
| MembershipListener systemListener = new MembershipListener() { |
| public synchronized void memberJoined(MembershipEvent event) { |
| assertFalse(firedSystem[JOINED]); |
| assertNull(memberSystem[JOINED]); |
| assertNull(memberIdSystem[JOINED]); |
| firedSystem[JOINED] = true; |
| memberSystem[JOINED] = event.getDistributedMember(); |
| memberIdSystem[JOINED] = event.getMemberId(); |
| notify(); |
| } |
| public synchronized void memberLeft(MembershipEvent event) { |
| assertFalse(firedSystem[LEFT]); |
| assertNull(memberSystem[LEFT]); |
| assertNull(memberIdSystem[LEFT]); |
| firedSystem[LEFT] = true; |
| memberSystem[LEFT] = event.getDistributedMember(); |
| memberIdSystem[LEFT] = event.getMemberId(); |
| notify(); |
| } |
| public synchronized void memberCrashed(MembershipEvent event) { |
| assertFalse(firedSystem[CRASHED]); |
| assertNull(memberSystem[CRASHED]); |
| assertNull(memberIdSystem[CRASHED]); |
| firedSystem[CRASHED] = true; |
| memberSystem[CRASHED] = event.getDistributedMember(); |
| memberIdSystem[CRASHED] = event.getMemberId(); |
| notify(); |
| } |
| }; |
| |
| UniversalMembershipListenerAdapter adapter = |
| new UniversalMembershipListenerAdapter() { |
| @Override |
| public synchronized void memberJoined(MembershipEvent event) { |
| assertFalse(firedAdapter[JOINED]); |
| assertNull(memberAdapter[JOINED]); |
| assertNull(memberIdAdapter[JOINED]); |
| assertFalse(isClientAdapter[JOINED]); |
| firedAdapter[JOINED] = true; |
| memberAdapter[JOINED] = event.getDistributedMember(); |
| memberIdAdapter[JOINED] = event.getMemberId(); |
| isClientAdapter[JOINED] = ((UniversalMembershipListenerAdapter. |
| AdaptedMembershipEvent)event).isClient(); |
| notify(); |
| } |
| @Override |
| public synchronized void memberLeft(MembershipEvent event) { |
| assertFalse(firedAdapter[LEFT]); |
| assertNull(memberAdapter[LEFT]); |
| assertNull(memberIdAdapter[LEFT]); |
| assertFalse(isClientAdapter[LEFT]); |
| firedAdapter[LEFT] = true; |
| memberAdapter[LEFT] = event.getDistributedMember(); |
| memberIdAdapter[LEFT] = event.getMemberId(); |
| isClientAdapter[LEFT] = ((UniversalMembershipListenerAdapter. |
| AdaptedMembershipEvent)event).isClient(); |
| notify(); |
| } |
| @Override |
| public synchronized void memberCrashed(MembershipEvent event) { |
| assertFalse(firedAdapter[CRASHED]); |
| assertNull(memberAdapter[CRASHED]); |
| assertNull(memberIdAdapter[CRASHED]); |
| assertFalse(isClientAdapter[CRASHED]); |
| firedAdapter[CRASHED] = true; |
| memberAdapter[CRASHED] = event.getDistributedMember(); |
| memberIdAdapter[CRASHED] = event.getMemberId(); |
| isClientAdapter[CRASHED] = ((UniversalMembershipListenerAdapter. |
| AdaptedMembershipEvent)event).isClient(); |
| notify(); |
| } |
| }; |
| |
| ClientMembershipListener bridgeListener = new ClientMembershipListener() { |
| public synchronized void memberJoined(ClientMembershipEvent event) { |
| assertFalse(firedBridge[JOINED]); |
| assertNull(memberBridge[JOINED]); |
| assertNull(memberIdBridge[JOINED]); |
| assertFalse(isClientBridge[JOINED]); |
| firedBridge[JOINED] = true; |
| memberBridge[JOINED] = event.getMember(); |
| memberIdBridge[JOINED] = event.getMemberId(); |
| isClientBridge[JOINED] = event.isClient(); |
| notify(); |
| } |
| public synchronized void memberLeft(ClientMembershipEvent event) { |
| assertFalse(firedBridge[LEFT]); |
| assertNull(memberBridge[LEFT]); |
| assertNull(memberIdBridge[LEFT]); |
| assertFalse(isClientBridge[LEFT]); |
| firedBridge[LEFT] = true; |
| memberBridge[LEFT] = event.getMember(); |
| memberIdBridge[LEFT] = event.getMemberId(); |
| isClientBridge[LEFT] = event.isClient(); |
| notify(); |
| } |
| public synchronized void memberCrashed(ClientMembershipEvent event) { |
| assertFalse(firedBridge[CRASHED]); |
| assertNull(memberBridge[CRASHED]); |
| assertNull(memberIdBridge[CRASHED]); |
| assertFalse(isClientBridge[CRASHED]); |
| firedBridge[CRASHED] = true; |
| memberBridge[CRASHED] = event.getMember(); |
| memberIdBridge[CRASHED] = event.getMemberId(); |
| isClientBridge[CRASHED] = event.isClient(); |
| notify(); |
| } |
| }; |
| |
| final Host host = Host.getHost(0); |
| final VM vm0 = host.getVM(0); |
| final String name = this.getUniqueName(); |
| final int[] ports = new int[1]; |
| |
| // create BridgeServer in controller vm... |
| getLogWriter().info("[testLonerClientEventsInServer] Create BridgeServer"); |
| getSystem(); |
| AttributesFactory factory = new AttributesFactory(); |
| factory.setScope(Scope.LOCAL); |
| Region region = createRegion(name, factory.create()); |
| assertNotNull(region); |
| assertNotNull(getRootRegion().getSubregion(name)); |
| |
| ports[0] = startBridgeServer(0); |
| assertTrue(ports[0] != 0); |
| final String serverMemberId = getMemberId(); |
| final DistributedMember serverMember = getDistributedMember(); |
| final Properties serverProperties = getSystem().getProperties(); |
| |
| getLogWriter().info("[testLonerClientEventsInServer] ports[0]=" + ports[0]); |
| getLogWriter().info("[testLonerClientEventsInServer] serverMemberId=" + serverMemberId); |
| getLogWriter().info("[testLonerClientEventsInServer] serverMember=" + serverMember); |
| |
| // register the bridge listener |
| ClientMembership.registerClientMembershipListener(bridgeListener); |
| |
| GemFireCacheImpl cache = GemFireCacheImpl.getExisting(); |
| assertNotNull(cache); |
| ManagementService service = ManagementService.getExistingManagementService(cache); |
| // register the system listener |
| service.addMembershipListener(systemListener); |
| |
| // register the universal adapter. Not required as this test is only for BridgeClient test |
| adapter.registerMembershipListener(service); |
| |
| |
| SerializableRunnable createBridgeClient = |
| new CacheSerializableRunnable("Create bridge client") { |
| @Override |
| public void run2() throws CacheException { |
| getLogWriter().info("[testLonerClientEventsInServer] create bridge client"); |
| Properties config = new Properties(); |
| config.setProperty(DistributionConfig.MCAST_PORT_NAME, "0"); |
| config.setProperty(DistributionConfig.LOCATORS_NAME, ""); |
| getSystem(config); |
| AttributesFactory factory = new AttributesFactory(); |
| factory.setScope(Scope.LOCAL); |
| BridgeTestCase.configureConnectionPool(factory, getServerHostName(host), ports, false, -1, -1, null); |
| createRegion(name, factory.create()); |
| assertNotNull(getRootRegion().getSubregion(name)); |
| } |
| }; |
| |
| |
| // create bridge client in vm0... |
| vm0.invoke(createBridgeClient); |
| String clientMemberId = (String) vm0.invoke( |
| UniversalMembershipListenerAdapterDUnitTest.class, "getMemberId"); |
| DistributedMember clientMember = (DistributedMember) vm0.invoke( |
| UniversalMembershipListenerAdapterDUnitTest.class, "getDistributedMember"); |
| |
| // should trigger both adapter and bridge listener but not system listener |
| synchronized(adapter) { |
| if (!firedAdapter[JOINED]) { |
| adapter.wait(ASYNC_EVENT_WAIT_MILLIS); |
| } |
| } |
| synchronized(bridgeListener) { |
| if (!firedBridge[JOINED]) { |
| bridgeListener.wait(ASYNC_EVENT_WAIT_MILLIS); |
| } |
| } |
| |
| getLogWriter().info("[testLonerClientEventsInServer] assert server detected client join"); |
| assertTrue(firedBridge[JOINED]); |
| assertEquals(clientMember, memberBridge[JOINED]); |
| //as of 6.1 the id can change when a bridge is created or a connection pool is created |
| //assertEquals(clientMemberId, memberIdBridge[JOINED]); |
| assertTrue(isClientBridge[JOINED]); |
| assertFalse(firedBridge[LEFT]); |
| assertNull(memberBridge[LEFT]); |
| assertNull(memberIdBridge[LEFT]); |
| assertFalse(isClientBridge[LEFT]); |
| assertFalse(firedBridge[CRASHED]); |
| assertNull(memberBridge[CRASHED]); |
| assertNull(memberIdBridge[CRASHED]); |
| assertFalse(isClientBridge[CRASHED]); |
| resetArraysForTesting(firedBridge, memberBridge, memberIdBridge, isClientBridge); |
| |
| assertFalse(firedSystem[JOINED]); |
| assertNull(memberSystem[JOINED]); |
| assertNull(memberIdSystem[JOINED]); |
| assertFalse(isClientSystem[JOINED]); |
| assertFalse(firedSystem[LEFT]); |
| assertNull(memberSystem[LEFT]); |
| assertNull(memberIdSystem[LEFT]); |
| assertFalse(isClientSystem[LEFT]); |
| assertFalse(firedSystem[CRASHED]); |
| assertNull(memberSystem[CRASHED]); |
| assertNull(memberIdSystem[CRASHED]); |
| assertFalse(isClientSystem[CRASHED]); |
| resetArraysForTesting(firedSystem, memberSystem, memberIdSystem, isClientSystem); |
| |
| assertTrue(firedAdapter[JOINED]); |
| assertEquals(clientMember, memberAdapter[JOINED]); |
| assertEquals(clientMemberId, memberIdAdapter[JOINED]); |
| assertTrue(isClientAdapter[JOINED]); |
| assertFalse(firedAdapter[LEFT]); |
| assertNull(memberAdapter[LEFT]); |
| assertNull(memberIdAdapter[LEFT]); |
| assertFalse(isClientAdapter[LEFT]); |
| assertFalse(firedAdapter[CRASHED]); |
| assertNull(memberAdapter[CRASHED]); |
| assertNull(memberIdAdapter[CRASHED]); |
| assertFalse(isClientAdapter[CRASHED]); |
| resetArraysForTesting(firedAdapter, memberAdapter, memberIdAdapter, isClientAdapter); |
| |
| vm0.invoke(new SerializableRunnable("Wait for client to fully connect") { |
| public void run() { |
| getLogWriter().info("[testLonerClientEventsInServer] wait for client to fully connect"); |
| final String pl = |
| getRootRegion().getSubregion(name).getAttributes().getPoolName(); |
| PoolImpl pi = (PoolImpl)PoolManager.find(pl); |
| waitForClientToFullyConnect(pi); |
| } |
| }); |
| |
| vm0.invoke(new SerializableRunnable("Close bridge client region") { |
| public void run() { |
| getLogWriter().info("[testLonerClientEventsInServer] close bridge client region"); |
| getRootRegion().getSubregion(name).close(); |
| PoolManager.close(); |
| } |
| }); |
| |
| synchronized(adapter) { |
| if (!firedAdapter[LEFT]) { |
| adapter.wait(ASYNC_EVENT_WAIT_MILLIS); |
| } |
| } |
| synchronized(bridgeListener) { |
| if (!firedBridge[LEFT]) { |
| bridgeListener.wait(ASYNC_EVENT_WAIT_MILLIS); |
| } |
| } |
| |
| getLogWriter().info("[testLonerClientEventsInServer] assert server detected client left"); |
| |
| assertFalse(firedBridge[JOINED]); |
| assertNull(memberIdBridge[JOINED]); |
| assertNull(memberBridge[JOINED]); |
| assertFalse(isClientBridge[JOINED]); |
| assertTrue(firedBridge[LEFT]); |
| assertEquals(clientMember, memberBridge[LEFT]); |
| assertEquals(clientMemberId, memberIdBridge[LEFT]); |
| assertTrue(isClientBridge[LEFT]); |
| assertFalse(firedBridge[CRASHED]); |
| assertNull(memberBridge[CRASHED]); |
| assertNull(memberIdBridge[CRASHED]); |
| assertFalse(isClientBridge[CRASHED]); |
| resetArraysForTesting(firedBridge, memberBridge, memberIdBridge, isClientBridge); |
| |
| assertFalse(firedSystem[JOINED]); |
| assertNull(memberSystem[JOINED]); |
| assertNull(memberIdSystem[JOINED]); |
| assertFalse(isClientSystem[JOINED]); |
| assertFalse(firedSystem[LEFT]); |
| assertNull(memberSystem[LEFT]); |
| assertNull(memberIdSystem[LEFT]); |
| assertFalse(isClientSystem[LEFT]); |
| assertFalse(firedSystem[CRASHED]); |
| assertNull(memberSystem[CRASHED]); |
| assertNull(memberIdSystem[CRASHED]); |
| assertFalse(isClientSystem[CRASHED]); |
| resetArraysForTesting(firedSystem, memberSystem, memberIdSystem, isClientSystem); |
| |
| assertFalse(firedAdapter[JOINED]); |
| assertNull(memberAdapter[JOINED]); |
| assertNull(memberIdAdapter[JOINED]); |
| assertFalse(isClientAdapter[JOINED]); |
| assertTrue(firedAdapter[LEFT]); |
| assertEquals(clientMember, memberAdapter[LEFT]); |
| assertEquals(clientMemberId, memberIdAdapter[LEFT]); |
| assertTrue(isClientAdapter[LEFT]); |
| assertFalse(firedAdapter[CRASHED]); |
| assertNull(memberAdapter[CRASHED]); |
| assertNull(memberIdAdapter[CRASHED]); |
| assertFalse(isClientAdapter[CRASHED]); |
| resetArraysForTesting(firedAdapter, memberAdapter, memberIdAdapter, isClientAdapter); |
| |
| // reconnect bridge client to test for crashed event |
| vm0.invoke(createBridgeClient); |
| clientMemberId = (String) vm0.invoke( |
| UniversalMembershipListenerAdapterDUnitTest.class, "getMemberId"); |
| clientMember = (DistributedMember) vm0.invoke( |
| UniversalMembershipListenerAdapterDUnitTest.class, "getDistributedMember"); |
| |
| synchronized(adapter) { |
| if (!firedAdapter[JOINED]) { |
| adapter.wait(ASYNC_EVENT_WAIT_MILLIS); |
| } |
| } |
| synchronized(bridgeListener) { |
| if (!firedBridge[JOINED]) { |
| bridgeListener.wait(ASYNC_EVENT_WAIT_MILLIS); |
| } |
| } |
| |
| getLogWriter().info("[testLonerClientEventsInServer] assert server detected client re-join"); |
| assertTrue(firedBridge[JOINED]); |
| assertEquals(clientMember, memberBridge[JOINED]); |
| assertEquals(clientMemberId, memberIdBridge[JOINED]); |
| assertTrue(isClientBridge[JOINED]); |
| assertFalse(firedBridge[LEFT]); |
| assertNull(memberBridge[LEFT]); |
| assertNull(memberIdBridge[LEFT]); |
| assertFalse(isClientBridge[LEFT]); |
| assertFalse(firedBridge[CRASHED]); |
| assertNull(memberBridge[CRASHED]); |
| assertNull(memberIdBridge[CRASHED]); |
| assertFalse(isClientBridge[CRASHED]); |
| resetArraysForTesting(firedBridge, memberBridge, memberIdBridge, isClientBridge); |
| |
| assertFalse(firedSystem[JOINED]); |
| assertNull(memberSystem[JOINED]); |
| assertNull(memberIdSystem[JOINED]); |
| assertFalse(isClientSystem[JOINED]); |
| assertFalse(firedSystem[LEFT]); |
| assertNull(memberSystem[LEFT]); |
| assertNull(memberIdSystem[LEFT]); |
| assertFalse(isClientSystem[LEFT]); |
| assertFalse(firedSystem[CRASHED]); |
| assertNull(memberSystem[CRASHED]); |
| assertNull(memberIdSystem[CRASHED]); |
| assertFalse(isClientSystem[CRASHED]); |
| resetArraysForTesting(firedSystem, memberSystem, memberIdSystem, isClientSystem); |
| |
| assertTrue(firedAdapter[JOINED]); |
| assertEquals(clientMember, memberAdapter[JOINED]); |
| assertEquals(clientMemberId, memberIdAdapter[JOINED]); |
| assertTrue(isClientAdapter[JOINED]); |
| assertFalse(firedAdapter[LEFT]); |
| assertNull(memberAdapter[LEFT]); |
| assertNull(memberIdAdapter[LEFT]); |
| assertFalse(isClientAdapter[LEFT]); |
| assertFalse(firedAdapter[CRASHED]); |
| assertNull(memberAdapter[CRASHED]); |
| assertNull(memberIdAdapter[CRASHED]); |
| assertFalse(isClientAdapter[CRASHED]); |
| resetArraysForTesting(firedAdapter, memberAdapter, memberIdAdapter, isClientAdapter); |
| |
| vm0.invoke(new SerializableRunnable("Wait for client to fully connect") { |
| public void run() { |
| getLogWriter().info("[testLonerClientEventsInServer] wait for client to fully connect"); |
| final String pl = |
| getRootRegion().getSubregion(name).getAttributes().getPoolName(); |
| PoolImpl pi = (PoolImpl)PoolManager.find(pl); |
| waitForClientToFullyConnect(pi); |
| } |
| }); |
| |
| ServerConnection.setForceClientCrashEvent(true); |
| try { |
| vm0.invoke(new SerializableRunnable("Stop bridge client") { |
| public void run() { |
| getLogWriter().info("[testLonerClientEventsInServer] Stop bridge client"); |
| getRootRegion().getSubregion(name).close(); |
| PoolManager.close(); |
| } |
| }); |
| |
| synchronized(adapter) { |
| if (!firedAdapter[CRASHED]) { |
| adapter.wait(ASYNC_EVENT_WAIT_MILLIS); |
| } |
| } |
| synchronized(bridgeListener) { |
| if (!firedBridge[CRASHED]) { |
| bridgeListener.wait(ASYNC_EVENT_WAIT_MILLIS); |
| } |
| } |
| |
| getLogWriter().info("[testLonerClientEventsInServer] assert server detected client crashed"); |
| assertFalse(firedBridge[JOINED]); |
| assertNull(memberIdBridge[JOINED]); |
| assertNull(memberBridge[JOINED]); |
| assertFalse(isClientBridge[JOINED]); |
| assertFalse(firedBridge[LEFT]); |
| assertNull(memberIdBridge[LEFT]); |
| assertNull(memberBridge[LEFT]); |
| assertFalse(isClientBridge[LEFT]); |
| assertTrue(firedBridge[CRASHED]); |
| assertEquals(clientMember, memberBridge[CRASHED]); |
| assertEquals(clientMemberId, memberIdBridge[CRASHED]); |
| assertTrue(isClientBridge[CRASHED]); |
| // resetArraysForTesting(firedBridge, memberIdBridge, isClientBridge); |
| |
| assertFalse(firedSystem[JOINED]); |
| assertNull(memberSystem[JOINED]); |
| assertNull(memberIdSystem[JOINED]); |
| assertFalse(isClientSystem[JOINED]); |
| assertFalse(firedSystem[LEFT]); |
| assertNull(memberSystem[LEFT]); |
| assertNull(memberIdSystem[LEFT]); |
| assertFalse(isClientSystem[LEFT]); |
| assertFalse(firedSystem[CRASHED]); |
| assertNull(memberSystem[CRASHED]); |
| assertNull(memberIdSystem[CRASHED]); |
| assertFalse(isClientSystem[CRASHED]); |
| // resetArraysForTesting(firedSystem, memberIdSystem, isClientSystem); |
| |
| assertFalse(firedAdapter[JOINED]); |
| assertNull(memberAdapter[JOINED]); |
| assertNull(memberIdAdapter[JOINED]); |
| assertFalse(isClientAdapter[JOINED]); |
| assertFalse(firedAdapter[LEFT]); |
| assertNull(memberAdapter[LEFT]); |
| assertNull(memberIdAdapter[LEFT]); |
| assertFalse(isClientAdapter[LEFT]); |
| assertTrue(firedAdapter[CRASHED]); |
| assertEquals(clientMember, memberAdapter[CRASHED]); |
| assertEquals(clientMemberId, memberIdAdapter[CRASHED]); |
| assertTrue(isClientAdapter[CRASHED]); |
| // resetArraysForTesting(firedAdapter, memberIdAdapter, isClientAdapter); |
| } |
| finally { |
| ServerConnection.setForceClientCrashEvent(false); |
| } |
| } |
| |
| /** |
| * Tests notification of events for loner bridge clients in server process. |
| */ |
| public void testSystemClientEventsInServer() throws Exception { |
| try { |
| doTestSystemClientEventsInServer(); |
| } |
| finally { |
| disconnectAllFromDS(); |
| } |
| } |
| private void doTestSystemClientEventsInServer() throws Exception { |
| final boolean[] firedSystem = new boolean[3]; |
| final DistributedMember[] memberSystem = new DistributedMember[3]; |
| final String[] memberIdSystem = new String[3]; |
| final boolean[] isClientSystem = new boolean[3]; |
| |
| final boolean[] firedAdapter = new boolean[3]; |
| final DistributedMember[] memberAdapter = new DistributedMember[3]; |
| final String[] memberIdAdapter = new String[3]; |
| final boolean[] isClientAdapter = new boolean[3]; |
| |
| final boolean[] firedBridge = new boolean[3]; |
| final DistributedMember[] memberBridge = new DistributedMember[3]; |
| final String[] memberIdBridge = new String[3]; |
| final boolean[] isClientBridge = new boolean[3]; |
| |
| final boolean[] firedSystemDuplicate = new boolean[3]; |
| final boolean[] firedAdapterDuplicate = new boolean[3]; |
| final boolean[] firedBridgeDuplicate = new boolean[3]; |
| |
| MembershipListener systemListener = new MembershipListener() { |
| public synchronized void memberJoined(MembershipEvent event) { |
| firedSystemDuplicate[JOINED] = firedSystem[JOINED]; |
| firedSystem[JOINED] = true; |
| memberSystem[JOINED] = event.getDistributedMember(); |
| memberIdSystem[JOINED] = event.getMemberId(); |
| notify(); |
| } |
| public synchronized void memberLeft(MembershipEvent event) { |
| firedSystemDuplicate[LEFT] = firedSystem[LEFT]; |
| firedSystem[LEFT] = true; |
| memberSystem[LEFT] = event.getDistributedMember(); |
| memberIdSystem[LEFT] = event.getMemberId(); |
| notify(); |
| } |
| public synchronized void memberCrashed(MembershipEvent event) { |
| firedSystemDuplicate[CRASHED] = firedSystem[CRASHED]; |
| firedSystem[CRASHED] = true; |
| memberSystem[CRASHED] = event.getDistributedMember(); |
| memberIdSystem[CRASHED] = event.getMemberId(); |
| notify(); |
| } |
| }; |
| |
| UniversalMembershipListenerAdapter adapter = |
| new UniversalMembershipListenerAdapter() { |
| @Override |
| public synchronized void memberJoined(MembershipEvent event) { |
| getLogWriter().info("[doTestSystemClientEventsInServer] memberJoined >" + event.getMemberId() + "<"); |
| firedAdapterDuplicate[JOINED] = firedAdapter[JOINED]; |
| firedAdapter[JOINED] = true; |
| memberAdapter[JOINED] = event.getDistributedMember(); |
| memberIdAdapter[JOINED] = event.getMemberId(); |
| if (event instanceof UniversalMembershipListenerAdapter.AdaptedMembershipEvent) { |
| isClientAdapter[JOINED] = |
| ((UniversalMembershipListenerAdapter.AdaptedMembershipEvent)event).isClient(); |
| } |
| notify(); |
| } |
| @Override |
| public synchronized void memberLeft(MembershipEvent event) { |
| getLogWriter().info("[doTestSystemClientEventsInServer] memberLeft >" + event.getMemberId() + "<"); |
| firedAdapterDuplicate[LEFT] = firedAdapter[LEFT]; |
| firedAdapter[LEFT] = true; |
| memberAdapter[LEFT] = event.getDistributedMember(); |
| memberIdAdapter[LEFT] = event.getMemberId(); |
| if (event instanceof UniversalMembershipListenerAdapter.AdaptedMembershipEvent) { |
| isClientAdapter[LEFT] = |
| ((UniversalMembershipListenerAdapter.AdaptedMembershipEvent)event).isClient(); |
| } |
| notify(); |
| } |
| @Override |
| public synchronized void memberCrashed(MembershipEvent event) { |
| getLogWriter().info("[doTestSystemClientEventsInServer] memberCrashed >" + event.getMemberId() + "<"); |
| firedAdapterDuplicate[CRASHED] = firedAdapter[CRASHED]; |
| firedAdapter[CRASHED] = true; |
| memberAdapter[CRASHED] = event.getDistributedMember(); |
| memberIdAdapter[CRASHED] = event.getMemberId(); |
| if (event instanceof UniversalMembershipListenerAdapter.AdaptedMembershipEvent) { |
| isClientAdapter[CRASHED] = |
| ((UniversalMembershipListenerAdapter.AdaptedMembershipEvent)event).isClient(); |
| } |
| notify(); |
| } |
| }; |
| |
| ClientMembershipListener bridgeListener = new ClientMembershipListener() { |
| public synchronized void memberJoined(ClientMembershipEvent event) { |
| firedBridgeDuplicate[JOINED] = firedBridge[JOINED]; |
| firedBridge[JOINED] = true; |
| memberBridge[JOINED] = event.getMember(); |
| memberIdBridge[JOINED] = event.getMemberId(); |
| isClientBridge[JOINED] = event.isClient(); |
| notify(); |
| } |
| public synchronized void memberLeft(ClientMembershipEvent event) { |
| firedBridgeDuplicate[LEFT] = firedBridge[LEFT]; |
| firedBridge[LEFT] = true; |
| memberBridge[LEFT] = event.getMember(); |
| memberIdBridge[LEFT] = event.getMemberId(); |
| isClientBridge[LEFT] = event.isClient(); |
| notify(); |
| } |
| public synchronized void memberCrashed(ClientMembershipEvent event) { |
| firedBridgeDuplicate[CRASHED] = firedBridge[CRASHED]; |
| firedBridge[CRASHED] = true; |
| memberBridge[CRASHED] = event.getMember(); |
| memberIdBridge[CRASHED] = event.getMemberId(); |
| isClientBridge[CRASHED] = event.isClient(); |
| notify(); |
| } |
| }; |
| |
| final Host host = Host.getHost(0); |
| final VM vm0 = host.getVM(0); |
| final String name = this.getUniqueName(); |
| final int[] ports = new int[1]; |
| |
| // create BridgeServer in controller vm... |
| getLogWriter().info("[doTestSystemClientEventsInServer] Create BridgeServer"); |
| getSystem(); |
| AttributesFactory factory = new AttributesFactory(); |
| factory.setScope(Scope.LOCAL); |
| Region region = createRegion(name, factory.create()); |
| assertNotNull(region); |
| assertNotNull(getRootRegion().getSubregion(name)); |
| |
| ports[0] = startBridgeServer(0); |
| assertTrue(ports[0] != 0); |
| final String serverMemberId = getMemberId(); |
| final DistributedMember serverMember = getDistributedMember(); |
| final Properties serverProperties = getSystem().getProperties(); |
| |
| //Below removed properties are already got copied as cluster SSL properties |
| serverProperties.remove(DistributionConfig.SSL_ENABLED_NAME); |
| serverProperties.remove(DistributionConfig.SSL_CIPHERS_NAME); |
| serverProperties.remove(DistributionConfig.SSL_PROTOCOLS_NAME); |
| serverProperties.remove(DistributionConfig.SSL_REQUIRE_AUTHENTICATION_NAME); |
| |
| getLogWriter().info("[doTestSystemClientEventsInServer] ports[0]=" + ports[0]); |
| getLogWriter().info("[doTestSystemClientEventsInServer] serverMemberId=" + serverMemberId); |
| getLogWriter().info("[doTestSystemClientEventsInServer] serverMember=" + serverMember); |
| |
| // register the bridge listener |
| ClientMembership.registerClientMembershipListener(bridgeListener); |
| |
| GemFireCacheImpl cache = GemFireCacheImpl.getExisting(); |
| assertNotNull(cache); |
| ManagementService service = ManagementService.getExistingManagementService(cache); |
| // register the system listener |
| service.addMembershipListener(systemListener); |
| |
| // register the universal adapter. |
| adapter.registerMembershipListener(service); |
| |
| |
| SerializableRunnable createBridgeClient = |
| new CacheSerializableRunnable("Create bridge client") { |
| @Override |
| public void run2() throws CacheException { |
| getLogWriter().info("[doTestSystemClientEventsInServer] create system bridge client"); |
| assertTrue(getSystem(serverProperties).isConnected()); |
| assertFalse(getCache().isClosed()); |
| AttributesFactory factory = new AttributesFactory(); |
| factory.setScope(Scope.LOCAL); |
| BridgeTestCase.configureConnectionPool(factory, getServerHostName(host), ports, false, -1, -1, null); |
| createRegion(name, factory.create()); |
| assertNotNull(getRootRegion().getSubregion(name)); |
| } |
| }; |
| |
| // create bridge client in vm0... |
| vm0.invoke(createBridgeClient); |
| String clientMemberId = (String) vm0.invoke( |
| UniversalMembershipListenerAdapterDUnitTest.class, "getMemberId"); |
| DistributedMember clientMember = (DistributedMember) vm0.invoke( |
| UniversalMembershipListenerAdapterDUnitTest.class, "getDistributedMember"); |
| |
| // should trigger both adapter and bridge listener but not system listener |
| synchronized(adapter) { |
| if (!firedAdapter[JOINED]) { |
| adapter.wait(ASYNC_EVENT_WAIT_MILLIS); |
| } |
| } |
| synchronized(bridgeListener) { |
| if (!firedBridge[JOINED]) { |
| bridgeListener.wait(ASYNC_EVENT_WAIT_MILLIS); |
| } |
| } |
| synchronized(systemListener) { |
| if (!firedSystem[JOINED]) { |
| systemListener.wait(ASYNC_EVENT_WAIT_MILLIS); |
| } |
| } |
| |
| getLogWriter().info("[doTestSystemClientEventsInServer] assert server detected client join"); |
| assertFalse(firedSystemDuplicate); |
| assertFalse(firedAdapterDuplicate); |
| assertFalse(firedBridgeDuplicate); |
| |
| assertTrue(firedBridge[JOINED]); |
| assertEquals(clientMember, memberBridge[JOINED]); |
| assertEquals(clientMemberId, memberIdBridge[JOINED]); |
| assertTrue(isClientBridge[JOINED]); |
| assertFalse(firedBridge[LEFT]); |
| assertNull(memberBridge[LEFT]); |
| assertNull(memberIdBridge[LEFT]); |
| assertFalse(isClientBridge[LEFT]); |
| assertFalse(firedBridge[CRASHED]); |
| assertNull(memberBridge[CRASHED]); |
| assertNull(memberIdBridge[CRASHED]); |
| assertFalse(isClientBridge[CRASHED]); |
| resetArraysForTesting(firedBridge, memberBridge, memberIdBridge, isClientBridge); |
| |
| assertTrue(firedSystem[JOINED]); |
| assertEquals(clientMember, memberSystem[JOINED]); |
| assertEquals(clientMemberId, memberIdSystem[JOINED]); |
| assertFalse(isClientSystem[JOINED]); |
| assertFalse(firedSystem[LEFT]); |
| assertNull(memberSystem[LEFT]); |
| assertNull(memberIdSystem[LEFT]); |
| assertFalse(isClientSystem[LEFT]); |
| assertFalse(firedSystem[CRASHED]); |
| assertNull(memberSystem[CRASHED]); |
| assertNull(memberIdSystem[CRASHED]); |
| assertFalse(isClientSystem[CRASHED]); |
| resetArraysForTesting(firedSystem, memberSystem, memberIdSystem, isClientSystem); |
| |
| assertTrue(firedAdapter[JOINED]); |
| assertEquals(clientMember, memberAdapter[JOINED]); |
| assertEquals(clientMemberId, memberIdAdapter[JOINED]); |
| //assertTrue(isClientAdapter[JOINED]); |
| assertFalse(firedAdapter[LEFT]); |
| assertNull(memberAdapter[LEFT]); |
| assertNull(memberIdAdapter[LEFT]); |
| assertFalse(isClientAdapter[LEFT]); |
| assertFalse(firedAdapter[CRASHED]); |
| assertNull(memberAdapter[CRASHED]); |
| assertNull(memberIdAdapter[CRASHED]); |
| assertFalse(isClientAdapter[CRASHED]); |
| resetArraysForTesting(firedAdapter, memberAdapter, memberIdAdapter, isClientAdapter); |
| |
| vm0.invoke(new SerializableRunnable("Wait for client to fully connect") { |
| public void run() { |
| getLogWriter().info("[doTestSystemClientEventsInServer] wait for client to fully connect"); |
| final String pl = |
| getRootRegion().getSubregion(name).getAttributes().getPoolName(); |
| PoolImpl pi = (PoolImpl)PoolManager.find(pl); |
| waitForClientToFullyConnect(pi); |
| } |
| }); |
| |
| // close bridge client region |
| vm0.invoke(new SerializableRunnable("Close bridge client region") { |
| public void run() { |
| getLogWriter().info("[doTestSystemClientEventsInServer] close bridge client region"); |
| getRootRegion().getSubregion(name).close(); |
| PoolManager.close(); |
| } |
| }); |
| |
| synchronized(adapter) { |
| if (!firedAdapter[LEFT]) { |
| adapter.wait(ASYNC_EVENT_WAIT_MILLIS); |
| } |
| } |
| synchronized(bridgeListener) { |
| if (!firedBridge[LEFT]) { |
| bridgeListener.wait(ASYNC_EVENT_WAIT_MILLIS); |
| } |
| } |
| |
| getLogWriter().info("[doTestSystemClientEventsInServer] assert server detected client left"); |
| assertFalse(firedSystemDuplicate); |
| assertFalse(firedAdapterDuplicate); |
| assertFalse(firedBridgeDuplicate); |
| |
| assertFalse(firedBridge[JOINED]); |
| assertNull(memberIdBridge[JOINED]); |
| assertNull(memberBridge[JOINED]); |
| assertFalse(isClientBridge[JOINED]); |
| assertTrue(firedBridge[LEFT]); |
| assertEquals(clientMember, memberBridge[LEFT]); |
| assertEquals(clientMemberId, memberIdBridge[LEFT]); |
| assertTrue(isClientBridge[LEFT]); |
| assertFalse(firedBridge[CRASHED]); |
| assertNull(memberBridge[CRASHED]); |
| assertNull(memberIdBridge[CRASHED]); |
| assertFalse(isClientBridge[CRASHED]); |
| resetArraysForTesting(firedBridge, memberBridge, memberIdBridge, isClientBridge); |
| |
| assertFalse(firedSystem[JOINED]); |
| assertNull(memberSystem[JOINED]); |
| assertNull(memberIdSystem[JOINED]); |
| assertFalse(isClientSystem[JOINED]); |
| assertFalse(firedSystem[LEFT]); |
| assertNull(memberSystem[LEFT]); |
| assertNull(memberIdSystem[LEFT]); |
| assertFalse(isClientSystem[LEFT]); |
| assertFalse(firedSystem[CRASHED]); |
| assertNull(memberSystem[CRASHED]); |
| assertNull(memberIdSystem[CRASHED]); |
| assertFalse(isClientSystem[CRASHED]); |
| resetArraysForTesting(firedSystem, memberSystem, memberIdSystem, isClientSystem); |
| |
| assertFalse(firedAdapter[JOINED]); |
| assertNull(memberAdapter[JOINED]); |
| assertNull(memberIdAdapter[JOINED]); |
| assertFalse(isClientAdapter[JOINED]); |
| assertTrue(firedAdapter[LEFT]); |
| assertEquals(clientMember, memberAdapter[LEFT]); |
| assertEquals(clientMemberId, memberIdAdapter[LEFT]); |
| assertTrue(isClientAdapter[LEFT]); |
| assertFalse(firedAdapter[CRASHED]); |
| assertNull(memberAdapter[CRASHED]); |
| assertNull(memberIdAdapter[CRASHED]); |
| assertFalse(isClientAdapter[CRASHED]); |
| resetArraysForTesting(firedAdapter, memberAdapter, memberIdAdapter, isClientAdapter); |
| |
| // reconnect bridge client |
| vm0.invoke(createBridgeClient); |
| clientMemberId = (String) vm0.invoke( |
| UniversalMembershipListenerAdapterDUnitTest.class, "getMemberId"); |
| clientMember = (DistributedMember) vm0.invoke( |
| UniversalMembershipListenerAdapterDUnitTest.class, "getDistributedMember"); |
| |
| synchronized(adapter) { |
| if (!firedAdapter[JOINED]) { |
| adapter.wait(ASYNC_EVENT_WAIT_MILLIS); |
| } |
| } |
| synchronized(bridgeListener) { |
| if (!firedBridge[JOINED]) { |
| bridgeListener.wait(ASYNC_EVENT_WAIT_MILLIS); |
| } |
| } |
| |
| getLogWriter().info("[doTestSystemClientEventsInServer] assert server detected client re-join"); |
| assertFalse(firedSystemDuplicate); |
| assertFalse(firedAdapterDuplicate); |
| assertFalse(firedBridgeDuplicate); |
| |
| assertTrue(firedBridge[JOINED]); |
| assertEquals(clientMember, memberBridge[JOINED]); |
| assertEquals(clientMemberId, memberIdBridge[JOINED]); |
| assertTrue(isClientBridge[JOINED]); |
| assertFalse(firedBridge[LEFT]); |
| assertNull(memberBridge[LEFT]); |
| assertNull(memberIdBridge[LEFT]); |
| assertFalse(isClientBridge[LEFT]); |
| assertFalse(firedBridge[CRASHED]); |
| assertNull(memberBridge[CRASHED]); |
| assertNull(memberIdBridge[CRASHED]); |
| assertFalse(isClientBridge[CRASHED]); |
| resetArraysForTesting(firedBridge, memberBridge, memberIdBridge, isClientBridge); |
| |
| assertFalse(firedSystem[JOINED]); |
| assertNull(memberSystem[JOINED]); |
| assertNull(memberIdSystem[JOINED]); |
| assertFalse(isClientSystem[JOINED]); |
| assertFalse(firedSystem[LEFT]); |
| assertNull(memberSystem[LEFT]); |
| assertNull(memberIdSystem[LEFT]); |
| assertFalse(isClientSystem[LEFT]); |
| assertFalse(firedSystem[CRASHED]); |
| assertNull(memberSystem[CRASHED]); |
| assertNull(memberIdSystem[CRASHED]); |
| assertFalse(isClientSystem[CRASHED]); |
| resetArraysForTesting(firedSystem, memberSystem, memberIdSystem, isClientSystem); |
| |
| assertTrue(firedAdapter[JOINED]); |
| assertEquals(clientMember, memberAdapter[JOINED]); |
| assertEquals(clientMemberId, memberIdAdapter[JOINED]); |
| //assertTrue(isClientAdapter[JOINED]); |
| assertFalse(firedAdapter[LEFT]); |
| assertNull(memberAdapter[LEFT]); |
| assertNull(memberIdAdapter[LEFT]); |
| assertFalse(isClientAdapter[LEFT]); |
| assertFalse(firedAdapter[CRASHED]); |
| assertNull(memberAdapter[CRASHED]); |
| assertNull(memberIdAdapter[CRASHED]); |
| assertFalse(isClientAdapter[CRASHED]); |
| resetArraysForTesting(firedAdapter, memberAdapter, memberIdAdapter, isClientAdapter); |
| |
| vm0.invoke(new SerializableRunnable("Wait for client to fully connect") { |
| public void run() { |
| getLogWriter().info("[doTestSystemClientEventsInServer] wait for client to fully connect"); |
| final String pl = |
| getRootRegion().getSubregion(name).getAttributes().getPoolName(); |
| PoolImpl pi = (PoolImpl)PoolManager.find(pl); |
| waitForClientToFullyConnect(pi); |
| } |
| }); |
| |
| // have bridge client disconnect from system |
| vm0.invoke(new SerializableRunnable("Disconnect bridge client") { |
| public void run() { |
| getLogWriter().info("[doTestSystemClientEventsInServer] disconnect bridge client"); |
| closeCache(); |
| disconnectFromDS(); |
| } |
| }); |
| |
| synchronized(adapter) { |
| if (!firedAdapter[LEFT]) { |
| adapter.wait(ASYNC_EVENT_WAIT_MILLIS); |
| } |
| } |
| synchronized(systemListener) { |
| if (!firedSystem[LEFT]) { |
| systemListener.wait(ASYNC_EVENT_WAIT_MILLIS); |
| } |
| } |
| synchronized(bridgeListener) { |
| if (!firedBridge[LEFT]) { |
| bridgeListener.wait(ASYNC_EVENT_WAIT_MILLIS); |
| } |
| } |
| |
| getLogWriter().info("[doTestSystemClientEventsInServer] assert server detected client left"); |
| assertFalse(firedSystemDuplicate); |
| assertFalse(firedAdapterDuplicate); |
| assertFalse(firedBridgeDuplicate); |
| |
| assertFalse(firedBridge[JOINED]); |
| assertNull(memberBridge[JOINED]); |
| assertNull(memberIdBridge[JOINED]); |
| assertFalse(isClientBridge[JOINED]); |
| assertTrue(firedBridge[LEFT]); |
| assertEquals(clientMember, memberBridge[LEFT]); |
| assertEquals(clientMemberId, memberIdBridge[LEFT]); |
| assertTrue(isClientBridge[LEFT]); |
| assertFalse(firedBridge[CRASHED]); |
| assertNull(memberBridge[CRASHED]); |
| assertNull(memberIdBridge[CRASHED]); |
| assertFalse(isClientBridge[CRASHED]); |
| resetArraysForTesting(firedBridge, memberBridge, memberIdBridge, isClientBridge); |
| |
| assertFalse(firedSystem[JOINED]); |
| assertNull(memberSystem[JOINED]); |
| assertNull(memberIdSystem[JOINED]); |
| assertFalse(isClientSystem[JOINED]); |
| assertTrue(firedSystem[LEFT]); |
| assertEquals(clientMember, memberSystem[LEFT]); |
| assertEquals(clientMemberId, memberIdSystem[LEFT]); |
| assertFalse(isClientSystem[LEFT]); |
| assertFalse(firedSystem[CRASHED]); |
| assertNull(memberSystem[CRASHED]); |
| assertNull(memberIdSystem[CRASHED]); |
| assertFalse(isClientSystem[CRASHED]); |
| resetArraysForTesting(firedSystem, memberSystem, memberIdSystem, isClientSystem); |
| |
| assertFalse(firedAdapter[JOINED]); |
| assertNull(memberAdapter[JOINED]); |
| assertNull(memberIdAdapter[JOINED]); |
| assertFalse(isClientAdapter[JOINED]); |
| assertTrue(firedAdapter[LEFT]); |
| assertEquals(clientMember, memberAdapter[LEFT]); |
| assertEquals(clientMemberId, memberIdAdapter[LEFT]); |
| //assertTrue(isClientAdapter[LEFT]); |
| assertFalse(firedAdapter[CRASHED]); |
| assertNull(memberAdapter[CRASHED]); |
| assertNull(memberIdAdapter[CRASHED]); |
| assertFalse(isClientAdapter[CRASHED]); |
| resetArraysForTesting(firedAdapter, memberAdapter, memberIdAdapter, isClientAdapter); |
| |
| // reconnect bridge client |
| vm0.invoke(createBridgeClient); |
| clientMemberId = (String) vm0.invoke( |
| UniversalMembershipListenerAdapterDUnitTest.class, "getMemberId"); |
| clientMember = (DistributedMember) vm0.invoke( |
| UniversalMembershipListenerAdapterDUnitTest.class, "getDistributedMember"); |
| |
| synchronized(adapter) { |
| if (!firedAdapter[JOINED]) { |
| adapter.wait(ASYNC_EVENT_WAIT_MILLIS); |
| } |
| } |
| synchronized(systemListener) { |
| if (!firedSystem[JOINED]) { |
| systemListener.wait(ASYNC_EVENT_WAIT_MILLIS); |
| } |
| } |
| synchronized(bridgeListener) { |
| if (!firedBridge[JOINED]) { |
| bridgeListener.wait(ASYNC_EVENT_WAIT_MILLIS); |
| } |
| } |
| |
| getLogWriter().info("[doTestSystemClientEventsInServer] assert server detected client re-join"); |
| assertFalse(firedSystemDuplicate); |
| assertFalse(firedAdapterDuplicate); |
| assertFalse(firedBridgeDuplicate); |
| |
| assertTrue(firedBridge[JOINED]); |
| assertEquals(clientMember, memberBridge[JOINED]); |
| assertEquals(clientMemberId, memberIdBridge[JOINED]); |
| assertTrue(isClientBridge[JOINED]); |
| assertFalse(firedBridge[LEFT]); |
| assertNull(memberBridge[LEFT]); |
| assertNull(memberIdBridge[LEFT]); |
| assertFalse(isClientBridge[LEFT]); |
| assertFalse(firedBridge[CRASHED]); |
| assertNull(memberBridge[CRASHED]); |
| assertNull(memberIdBridge[CRASHED]); |
| assertFalse(isClientBridge[CRASHED]); |
| resetArraysForTesting(firedBridge, memberBridge, memberIdBridge, isClientBridge); |
| |
| assertTrue(firedSystem[JOINED]); |
| assertEquals(clientMember, memberSystem[JOINED]); |
| assertEquals(clientMemberId, memberIdSystem[JOINED]); |
| assertFalse(isClientSystem[JOINED]); |
| assertFalse(firedSystem[LEFT]); |
| assertNull(memberSystem[LEFT]); |
| assertNull(memberIdSystem[LEFT]); |
| assertFalse(isClientSystem[LEFT]); |
| assertFalse(firedSystem[CRASHED]); |
| assertNull(memberSystem[CRASHED]); |
| assertNull(memberIdSystem[CRASHED]); |
| assertFalse(isClientSystem[CRASHED]); |
| resetArraysForTesting(firedSystem, memberSystem, memberIdSystem, isClientSystem); |
| |
| assertTrue(firedAdapter[JOINED]); |
| assertEquals(clientMember, memberAdapter[JOINED]); |
| assertEquals(clientMemberId, memberIdAdapter[JOINED]); |
| //assertTrue(isClientAdapter[JOINED]); |
| assertFalse(firedAdapter[LEFT]); |
| assertNull(memberAdapter[LEFT]); |
| assertNull(memberIdAdapter[LEFT]); |
| assertFalse(isClientAdapter[LEFT]); |
| assertFalse(firedAdapter[CRASHED]); |
| assertNull(memberAdapter[CRASHED]); |
| assertNull(memberIdAdapter[CRASHED]); |
| assertFalse(isClientAdapter[CRASHED]); |
| resetArraysForTesting(firedAdapter, memberAdapter, memberIdAdapter, isClientAdapter); |
| |
| vm0.invoke(new SerializableRunnable("Wait for client to fully connect") { |
| public void run() { |
| getLogWriter().info("[doTestSystemClientEventsInServer] wait for client to fully connect"); |
| final String pl = |
| getRootRegion().getSubregion(name).getAttributes().getPoolName(); |
| PoolImpl pi = (PoolImpl)PoolManager.find(pl); |
| waitForClientToFullyConnect(pi); |
| } |
| }); |
| |
| // close bridge client region with test hook for crash |
| ServerConnection.setForceClientCrashEvent(true); |
| try { |
| vm0.invoke(new SerializableRunnable("Close bridge client region") { |
| public void run() { |
| getLogWriter().info("[doTestSystemClientEventsInServer] close bridge client region"); |
| getRootRegion().getSubregion(name).close(); |
| PoolManager.close(); |
| } |
| }); |
| |
| synchronized(adapter) { |
| if (!firedAdapter[CRASHED]) { |
| adapter.wait(ASYNC_EVENT_WAIT_MILLIS); |
| } |
| } |
| synchronized(bridgeListener) { |
| if (!firedBridge[CRASHED]) { |
| bridgeListener.wait(ASYNC_EVENT_WAIT_MILLIS); |
| } |
| } |
| |
| getLogWriter().info("[doTestSystemClientEventsInServer] assert server detected client crashed"); |
| assertFalse(firedSystemDuplicate); |
| assertFalse(firedAdapterDuplicate); |
| assertFalse(firedBridgeDuplicate); |
| |
| assertFalse(firedBridge[JOINED]); |
| assertNull(memberBridge[JOINED]); |
| assertNull(memberIdBridge[JOINED]); |
| assertFalse(isClientBridge[JOINED]); |
| assertFalse(firedBridge[LEFT]); |
| assertNull(memberBridge[LEFT]); |
| assertNull(memberIdBridge[LEFT]); |
| assertFalse(isClientBridge[LEFT]); |
| assertTrue(firedBridge[CRASHED]); |
| assertEquals(clientMember, memberBridge[CRASHED]); |
| assertEquals(clientMemberId, memberIdBridge[CRASHED]); |
| assertTrue(isClientBridge[CRASHED]); |
| |
| assertFalse(firedSystem[JOINED]); |
| assertNull(memberSystem[JOINED]); |
| assertNull(memberIdSystem[JOINED]); |
| assertFalse(isClientSystem[JOINED]); |
| assertFalse(firedSystem[LEFT]); |
| assertNull(memberSystem[LEFT]); |
| assertNull(memberIdSystem[LEFT]); |
| assertFalse(isClientSystem[LEFT]); |
| assertFalse(firedSystem[CRASHED]); |
| assertNull(memberSystem[CRASHED]); |
| assertNull(memberIdSystem[CRASHED]); |
| assertFalse(isClientSystem[CRASHED]); |
| |
| assertFalse(firedAdapter[JOINED]); |
| assertNull(memberAdapter[JOINED]); |
| assertNull(memberIdAdapter[JOINED]); |
| assertFalse(isClientAdapter[JOINED]); |
| assertFalse(firedAdapter[LEFT]); |
| assertNull(memberAdapter[LEFT]); |
| assertNull(memberIdAdapter[LEFT]); |
| assertFalse(isClientAdapter[LEFT]); |
| assertTrue(firedAdapter[CRASHED]); |
| assertEquals(clientMember, memberAdapter[CRASHED]); |
| assertEquals(clientMemberId, memberIdAdapter[CRASHED]); |
| assertTrue(isClientAdapter[CRASHED]); |
| } |
| finally { |
| ServerConnection.setForceClientCrashEvent(false); |
| } |
| } |
| |
| /** |
| * Waits for client to create {@link |
| * com.gemstone.gemfire.internal.cache.tier.Endpoint#getNumConnections |
| * Endpoint.getNumConnections()} to {@link |
| * com.gemstone.gemfire.internal.cache.tier.Endpoint}. Note: This probably |
| * won't work if the BridgeLoader has more than one Endpoint. |
| */ |
| protected void waitForClientToFullyConnect(final PoolImpl pool) { |
| getLogWriter().info("[waitForClientToFullyConnect]"); |
| final long failMillis = System.currentTimeMillis() + JOIN_FAIL_MILLIS; |
| boolean fullyConnected = false; |
| while (!fullyConnected) { |
| pause(100); |
| fullyConnected = pool.getConnectionCount() >= pool.getMinConnections(); |
| assertTrue("Client failed to create " |
| + pool.getMinConnections() |
| + " connections within " + JOIN_FAIL_MILLIS |
| + " milliseconds. Only " + pool.getConnectionCount() |
| + " connections were created.", |
| System.currentTimeMillis() < failMillis); |
| } |
| getLogWriter().info("[waitForClientToFullyConnect] fullyConnected=" + fullyConnected); |
| } |
| |
| /** |
| * Resets all elements of arrays used for listener testing. Boolean values |
| * are reset to false. String values are reset to null. |
| */ |
| private void resetArraysForTesting(boolean[] fired, |
| DistributedMember[] member, |
| String[] memberId, |
| boolean[] isClient) { |
| for (int i = 0; i < fired.length; i++) { |
| fired[i] = false; |
| member[i] = null; |
| memberId[i] = null; |
| isClient[i] = false; |
| } |
| } |
| |
| /** |
| * Asserts all elements in the array are false. |
| */ |
| private void assertFalse(boolean[] array) { |
| assertFalse(null, array); |
| } |
| private void assertFalse(String msg, boolean[] array) { |
| for (int i = 0; i < array.length; i++) { |
| if (msg == null) { |
| assertFalse(array[i]); |
| } else { |
| assertFalse(msg, array[i]); |
| } |
| } |
| } |
| private void assertTrue(boolean[] array) { |
| assertTrue(null, array); |
| } |
| private void assertTrue(String msg, boolean[] array) { |
| for (int i = 0; i < array.length; i++) { |
| if (msg == null) { |
| assertTrue(array[i]); |
| } else { |
| assertTrue(msg, array[i]); |
| } |
| } |
| } |
| |
| /** |
| * Tests notification of events for bridge server in system bridge client |
| * process. |
| */ |
| public void testServerEventsInPeerSystem() throws Exception { |
| try { |
| doTestServerEventsInPeerSystem(); |
| }finally { |
| disconnectAllFromDS(); |
| } |
| } |
| protected static int testServerEventsInSystemClient_port; |
| private static int getTestServerEventsInSystemClient_port() { |
| return testServerEventsInSystemClient_port; |
| } |
| private void doTestServerEventsInPeerSystem() throws Exception { |
| // KIRK: this test fails intermittently with bug 37482 |
| final boolean[] firedSystem = new boolean[3]; |
| final DistributedMember[] memberSystem = new DistributedMember[3]; |
| final String[] memberIdSystem = new String[3]; |
| final boolean[] isClientSystem = new boolean[3]; |
| |
| final boolean[] firedAdapter = new boolean[3]; |
| final DistributedMember[] memberAdapter = new DistributedMember[3]; |
| final String[] memberIdAdapter = new String[3]; |
| final boolean[] isClientAdapter = new boolean[3]; |
| |
| final boolean[] firedBridge = new boolean[3]; |
| final DistributedMember[] memberBridge = new DistributedMember[3]; |
| final String[] memberIdBridge = new String[3]; |
| final boolean[] isClientBridge = new boolean[3]; |
| |
| final boolean[] firedSystemDuplicate = new boolean[3]; |
| final boolean[] firedAdapterDuplicate = new boolean[3]; |
| final boolean[] firedBridgeDuplicate = new boolean[3]; |
| |
| MembershipListener systemListener = new MembershipListener() { |
| public synchronized void memberJoined(MembershipEvent event) { |
| firedSystemDuplicate[JOINED] = firedSystem[JOINED]; |
| firedSystem[JOINED] = true; |
| memberSystem[JOINED] = event.getDistributedMember(); |
| memberIdSystem[JOINED] = event.getMemberId(); |
| notify(); |
| } |
| public synchronized void memberLeft(MembershipEvent event) { |
| firedSystemDuplicate[LEFT] = firedSystem[LEFT]; |
| firedSystem[LEFT] = true; |
| memberSystem[LEFT] = event.getDistributedMember(); |
| memberIdSystem[LEFT] = event.getMemberId(); |
| notify(); |
| } |
| public synchronized void memberCrashed(MembershipEvent event) { |
| firedSystemDuplicate[CRASHED] = firedSystem[CRASHED]; |
| firedSystem[CRASHED] = true; |
| memberSystem[CRASHED] = event.getDistributedMember(); |
| memberIdSystem[CRASHED] = event.getMemberId(); |
| notify(); |
| } |
| }; |
| |
| UniversalMembershipListenerAdapter adapter = |
| new UniversalMembershipListenerAdapter() { |
| @Override |
| public synchronized void memberJoined(MembershipEvent event) { |
| getLogWriter().info("[testServerEventsInSystemClient] memberJoined >" + event.getMemberId() + "<"); |
| firedAdapterDuplicate[JOINED] = firedAdapter[JOINED]; |
| firedAdapter[JOINED] = true; |
| memberAdapter[JOINED] = event.getDistributedMember(); |
| memberIdAdapter[JOINED] = event.getMemberId(); |
| if (event instanceof UniversalMembershipListenerAdapter.AdaptedMembershipEvent) { |
| isClientAdapter[JOINED] = |
| ((UniversalMembershipListenerAdapter.AdaptedMembershipEvent)event).isClient(); |
| } |
| notify(); |
| } |
| @Override |
| public synchronized void memberLeft(MembershipEvent event) { |
| getLogWriter().info("[testServerEventsInSystemClient] memberLeft >" + event.getMemberId() + "<"); |
| firedAdapterDuplicate[LEFT] = firedAdapter[LEFT]; |
| firedAdapter[LEFT] = true; |
| memberAdapter[LEFT] = event.getDistributedMember(); |
| memberIdAdapter[LEFT] = event.getMemberId(); |
| if (event instanceof UniversalMembershipListenerAdapter.AdaptedMembershipEvent) { |
| isClientAdapter[LEFT] = |
| ((UniversalMembershipListenerAdapter.AdaptedMembershipEvent)event).isClient(); |
| } |
| notify(); |
| } |
| @Override |
| public synchronized void memberCrashed(MembershipEvent event) { |
| getLogWriter().info("[testServerEventsInSystemClient] memberCrashed >" + event.getMemberId() + "<"); |
| firedAdapterDuplicate[CRASHED] = firedAdapter[CRASHED]; |
| firedAdapter[CRASHED] = true; |
| memberAdapter[CRASHED] = event.getDistributedMember(); |
| memberIdAdapter[CRASHED] = event.getMemberId(); |
| if (event instanceof UniversalMembershipListenerAdapter.AdaptedMembershipEvent) { |
| isClientAdapter[CRASHED] = |
| ((UniversalMembershipListenerAdapter.AdaptedMembershipEvent)event).isClient(); |
| } |
| notify(); |
| } |
| }; |
| |
| ClientMembershipListener bridgeListener = new ClientMembershipListener() { |
| public synchronized void memberJoined(ClientMembershipEvent event) { |
| firedBridgeDuplicate[JOINED] = firedBridge[JOINED]; |
| firedBridge[JOINED] = true; |
| memberBridge[JOINED] = event.getMember(); |
| memberIdBridge[JOINED] = event.getMemberId(); |
| isClientBridge[JOINED] = event.isClient(); |
| notify(); |
| } |
| public synchronized void memberLeft(ClientMembershipEvent event) { |
| firedBridgeDuplicate[LEFT] = firedBridge[LEFT]; |
| firedBridge[LEFT] = true; |
| memberBridge[LEFT] = event.getMember(); |
| memberIdBridge[LEFT] = event.getMemberId(); |
| isClientBridge[LEFT] = event.isClient(); |
| notify(); |
| } |
| public synchronized void memberCrashed(ClientMembershipEvent event) { |
| firedBridgeDuplicate[CRASHED] = firedBridge[CRASHED]; |
| firedBridge[CRASHED] = true; |
| memberBridge[CRASHED] = event.getMember(); |
| memberIdBridge[CRASHED] = event.getMemberId(); |
| isClientBridge[CRASHED] = event.isClient(); |
| notify(); |
| } |
| }; |
| |
| final Host host = Host.getHost(0); |
| final VM vm0 = host.getVM(0); |
| final String name = this.getUniqueName(); |
| final int[] ports = new int[] |
| { AvailablePort.getRandomAvailablePort(AvailablePort.SOCKET) }; |
| assertTrue(ports[0] != 0); |
| |
| // create BridgeServer in controller vm... |
| getLogWriter().info("[doTestSystemClientEventsInServer] Create BridgeServer"); |
| getSystem(); |
| AttributesFactory factory = new AttributesFactory(); |
| factory.setScope(Scope.LOCAL); |
| Region region = createRegion(name, factory.create()); |
| assertNotNull(region); |
| assertNotNull(getRootRegion().getSubregion(name)); |
| |
| ports[0] = startBridgeServer(0); |
| assertTrue(ports[0] != 0); |
| final String serverMemberId = getMemberId(); |
| final DistributedMember serverMember = getDistributedMember(); |
| final Properties serverProperties = getSystem().getProperties(); |
| |
| serverProperties.remove(DistributionConfig.SSL_ENABLED_NAME); |
| serverProperties.remove(DistributionConfig.SSL_CIPHERS_NAME); |
| serverProperties.remove(DistributionConfig.SSL_PROTOCOLS_NAME); |
| serverProperties.remove(DistributionConfig.SSL_REQUIRE_AUTHENTICATION_NAME); |
| |
| getLogWriter().info("[testServerEventsInPeerSystem] ports[0]=" + ports[0]); |
| getLogWriter().info("[testServerEventsInPeerSystem] serverMemberId=" + serverMemberId); |
| getLogWriter().info("[testServerEventsInPeerSystem] serverMember=" + serverMember); |
| |
| GemFireCacheImpl cache = GemFireCacheImpl.getExisting(); |
| assertNotNull(cache); |
| ManagementService service = ManagementService.getExistingManagementService(cache); |
| // register the system listener |
| service.addMembershipListener(systemListener); |
| |
| // register the universal adapter. |
| adapter.registerMembershipListener(service); |
| |
| // create BridgeServer in vm0... |
| SerializableRunnable createPeerCache = |
| new CacheSerializableRunnable("Create Peer Cache") { |
| @Override |
| public void run2() throws CacheException { |
| getLogWriter().info("[testServerEventsInPeerSystem] Create Peer cache"); |
| getSystem(serverProperties); |
| AttributesFactory factory = new AttributesFactory(); |
| factory.setScope(Scope.LOCAL); |
| Region region = createRegion(name, factory.create()); |
| assertNotNull(region); |
| assertNotNull(getRootRegion().getSubregion(name)); |
| } |
| }; |
| |
| vm0.invoke(createPeerCache); |
| |
| String peerMemberId = (String) vm0.invoke( |
| UniversalMembershipListenerAdapterDUnitTest.class, "getMemberId"); |
| DistributedMember peerMember = (DistributedMember) vm0.invoke( |
| UniversalMembershipListenerAdapterDUnitTest.class, "getDistributedMember"); |
| |
| getLogWriter().info("[testServerEventsInPeerSystem] peerMemberId=" + peerMemberId); |
| getLogWriter().info("[testServerEventsInPeerSystem] peerMember=" + peerMember); |
| |
| |
| |
| synchronized(systemListener) { |
| if (!firedSystem[JOINED]) { |
| systemListener.wait(ASYNC_EVENT_WAIT_MILLIS); |
| } |
| } |
| synchronized(adapter) { |
| if (!firedAdapter[JOINED]) { |
| adapter.wait(ASYNC_EVENT_WAIT_MILLIS); |
| } |
| } |
| |
| getLogWriter().info("[testServerEventsInPeerSystem] assert server detected peer join"); |
| assertFalse(firedSystemDuplicate); |
| // TODO: sometimes get adapter duplicate since memberId isn't endpoint |
| // initial impl uses Endpoint.toString() for memberId of server; final |
| // impl should have server send its real memberId to client via HandShake |
| //assertFalse("Please update testBridgeMembershipEventsInClient to use BridgeServer memberId.", |
| // firedAdapterDuplicate); |
| |
| assertTrue(firedSystem[JOINED]); |
| assertEquals(peerMember, memberSystem[JOINED]); |
| assertEquals(peerMemberId, memberIdSystem[JOINED]); |
| assertFalse(isClientSystem[JOINED]); |
| assertFalse(firedSystem[LEFT]); |
| assertNull(memberSystem[LEFT]); |
| assertNull(memberIdSystem[LEFT]); |
| assertFalse(isClientSystem[LEFT]); |
| assertFalse(firedSystem[CRASHED]); |
| assertNull(memberSystem[CRASHED]); |
| assertNull(memberIdSystem[CRASHED]); |
| assertFalse(isClientSystem[CRASHED]); |
| resetArraysForTesting(firedSystem, memberSystem, memberIdSystem, isClientSystem); |
| |
| assertTrue(firedAdapter[JOINED]); |
| assertNotNull(memberAdapter[JOINED]); |
| assertNotNull(memberIdAdapter[JOINED]); |
| assertEquals(peerMember, memberAdapter[JOINED]); |
| assertEquals(peerMemberId, memberIdAdapter[JOINED]); |
| assertFalse(isClientAdapter[JOINED]); |
| assertFalse(firedAdapter[LEFT]); |
| assertNull(memberAdapter[LEFT]); |
| assertNull(memberIdAdapter[LEFT]); |
| assertFalse(isClientAdapter[LEFT]); |
| assertFalse(firedAdapter[CRASHED]); |
| assertNull(memberAdapter[CRASHED]); |
| assertNull(memberIdAdapter[CRASHED]); |
| assertFalse(isClientAdapter[CRASHED]); |
| resetArraysForTesting(firedAdapter, memberAdapter, memberIdAdapter, isClientAdapter); |
| |
| |
| LogWriter bgexecLogger = |
| new LocalLogWriter(InternalLogWriter.ALL_LEVEL, System.out); |
| bgexecLogger.info("<ExpectedException action=add>" + |
| "java.io.IOException" + "</ExpectedException>"); |
| final ExpectedException ex = addExpectedException( |
| ServerConnectivityException.class.getName()); |
| try { |
| vm0.invoke(new SerializableRunnable("Disconnect Peer server") { |
| public void run() { |
| getLogWriter().info("[testServerEventsInPeerSystem] disconnect peer server"); |
| closeCache(); |
| disconnectFromDS(); |
| } |
| }); |
| |
| synchronized(systemListener) { |
| if (!firedSystem[LEFT]) { |
| systemListener.wait(ASYNC_EVENT_WAIT_MILLIS); |
| } |
| } |
| synchronized(adapter) { |
| if (!firedAdapter[LEFT]) { |
| adapter.wait(ASYNC_EVENT_WAIT_MILLIS); // KIRK: did increasing this solve problem on balrog? |
| } |
| } |
| } |
| finally { |
| bgexecLogger.info("<ExpectedException action=remove>" + |
| "java.io.IOException" + "</ExpectedException>"); |
| ex.remove(); |
| } |
| |
| getLogWriter().info("[testServerEventsInPeerSystem] assert server detected peer crashed"); |
| assertFalse(firedSystemDuplicate); |
| // TODO: sometimes get adapter duplicate since memberId isn't endpoint |
| // initial impl uses Endpoint.toString() for memberId of server; final |
| // impl should have server send its real memberId to client via HandShake |
| //assertFalse("Please update testBridgeMembershipEventsInClient to use BridgeServer memberId.", |
| // firedAdapterDuplicate); |
| assertFalse(firedAdapterDuplicate); |
| |
| assertFalse(firedSystem[JOINED]); |
| assertNull(memberSystem[JOINED]); |
| assertNull(memberIdSystem[JOINED]); |
| assertFalse(isClientSystem[JOINED]); |
| assertTrue(firedSystem[LEFT]); |
| assertEquals(peerMember, memberSystem[LEFT]); |
| assertEquals(peerMemberId, memberIdSystem[LEFT]); |
| assertFalse(isClientSystem[LEFT]); |
| assertFalse(firedSystem[CRASHED]); |
| assertNull(memberSystem[CRASHED]); |
| assertNull(memberIdSystem[CRASHED]); |
| assertFalse(isClientSystem[CRASHED]); |
| resetArraysForTesting(firedSystem, memberSystem, memberIdSystem, isClientSystem); |
| |
| assertFalse("this intermittently fails", firedAdapter[JOINED]); // KIRK --> this fails on balrog occasionally |
| assertNull(memberIdAdapter[JOINED]); |
| assertFalse(isClientAdapter[JOINED]); |
| // LEFT fired by System listener |
| assertTrue(firedAdapter[LEFT]); |
| assertEquals(peerMember, memberAdapter[LEFT]); |
| assertEquals(peerMemberId, memberIdAdapter[LEFT]); |
| assertFalse(isClientAdapter[LEFT]); |
| |
| // There won't be an adapter crashed event because since the two VMs |
| // are in the same distributed system, and the server's real member |
| // id is used now. In this case, two events are sent - one from |
| // jgroups (memberDeparted), and one from the server (a memberCrshed). |
| // The memberCrashed event is deemed a duplicate and not sent - see |
| // UniversalMembershipListenerAdapter.MembershipListener.isDuplicate |
| assertFalse(firedAdapter[CRASHED]); |
| assertNull(memberAdapter[CRASHED]); |
| assertNull(memberIdAdapter[CRASHED]); |
| assertFalse(isClientAdapter[CRASHED]); |
| resetArraysForTesting(firedAdapter, memberAdapter, memberIdAdapter, isClientAdapter); |
| |
| |
| } |
| |
| /** |
| * Tests notification of events for bridge server in system bridge client |
| * process. |
| */ |
| public void testServerEventsInLonerClient() throws Exception { |
| try { |
| doTestServerEventsInLonerClient(); |
| } |
| finally { |
| disconnectAllFromDS(); |
| } |
| } |
| protected static int testServerEventsInLonerClient_port; |
| private static int getTestServerEventsInLonerClient_port() { |
| return testServerEventsInLonerClient_port; |
| } |
| private void doTestServerEventsInLonerClient() throws Exception { |
| final boolean[] firedAdapter = new boolean[3]; |
| final DistributedMember[] memberAdapter = new DistributedMember[3]; |
| final String[] memberIdAdapter = new String[3]; |
| final boolean[] isClientAdapter = new boolean[3]; |
| |
| final boolean[] firedBridge = new boolean[3]; |
| final DistributedMember[] memberBridge = new DistributedMember[3]; |
| final String[] memberIdBridge = new String[3]; |
| final boolean[] isClientBridge = new boolean[3]; |
| |
| final boolean[] firedAdapterDuplicate = new boolean[3]; |
| final boolean[] firedBridgeDuplicate = new boolean[3]; |
| |
| UniversalMembershipListenerAdapter adapter = |
| new UniversalMembershipListenerAdapter() { |
| @Override |
| public synchronized void memberJoined(MembershipEvent event) { |
| getLogWriter().info("[testServerEventsInLonerClient] memberJoined >" + event.getMemberId() + "<"); |
| firedAdapterDuplicate[JOINED] = firedAdapter[JOINED]; |
| firedAdapter[JOINED] = true; |
| memberAdapter[JOINED] = event.getDistributedMember(); |
| memberIdAdapter[JOINED] = event.getMemberId(); |
| if (event instanceof UniversalMembershipListenerAdapter.AdaptedMembershipEvent) { |
| isClientAdapter[JOINED] = |
| ((UniversalMembershipListenerAdapter.AdaptedMembershipEvent)event).isClient(); |
| } |
| notify(); |
| } |
| @Override |
| public synchronized void memberLeft(MembershipEvent event) { |
| getLogWriter().info("[testServerEventsInLonerClient] memberLeft >" + event.getMemberId() + "<"); |
| firedAdapterDuplicate[LEFT] = firedAdapter[LEFT]; |
| firedAdapter[LEFT] = true; |
| memberAdapter[LEFT] = event.getDistributedMember(); |
| memberIdAdapter[LEFT] = event.getMemberId(); |
| if (event instanceof UniversalMembershipListenerAdapter.AdaptedMembershipEvent) { |
| isClientAdapter[LEFT] = |
| ((UniversalMembershipListenerAdapter.AdaptedMembershipEvent)event).isClient(); |
| } |
| notify(); |
| } |
| @Override |
| public synchronized void memberCrashed(MembershipEvent event) { |
| getLogWriter().info("[testServerEventsInLonerClient] memberCrashed >" + event.getMemberId() + "<"); |
| firedAdapterDuplicate[CRASHED] = firedAdapter[CRASHED]; |
| firedAdapter[CRASHED] = true; |
| memberAdapter[CRASHED] = event.getDistributedMember(); |
| memberIdAdapter[CRASHED] = event.getMemberId(); |
| if (event instanceof UniversalMembershipListenerAdapter.AdaptedMembershipEvent) { |
| isClientAdapter[CRASHED] = |
| ((UniversalMembershipListenerAdapter.AdaptedMembershipEvent)event).isClient(); |
| } |
| notify(); |
| } |
| }; |
| |
| ClientMembershipListener bridgeListener = new ClientMembershipListener() { |
| public synchronized void memberJoined(ClientMembershipEvent event) { |
| firedBridgeDuplicate[JOINED] = firedBridge[JOINED]; |
| firedBridge[JOINED] = true; |
| memberBridge[JOINED] = event.getMember(); |
| memberIdBridge[JOINED] = event.getMemberId(); |
| isClientBridge[JOINED] = event.isClient(); |
| notify(); |
| } |
| public synchronized void memberLeft(ClientMembershipEvent event) { |
| firedBridgeDuplicate[LEFT] = firedBridge[LEFT]; |
| firedBridge[LEFT] = true; |
| memberBridge[LEFT] = event.getMember(); |
| memberIdBridge[LEFT] = event.getMemberId(); |
| isClientBridge[LEFT] = event.isClient(); |
| notify(); |
| } |
| public synchronized void memberCrashed(ClientMembershipEvent event) { |
| firedBridgeDuplicate[CRASHED] = firedBridge[CRASHED]; |
| firedBridge[CRASHED] = true; |
| memberBridge[CRASHED] = event.getMember(); |
| memberIdBridge[CRASHED] = event.getMemberId(); |
| isClientBridge[CRASHED] = event.isClient(); |
| notify(); |
| } |
| }; |
| |
| final Host host = Host.getHost(0); |
| final VM vm0 = host.getVM(0); |
| final String name = this.getUniqueName(); |
| final int[] ports = new int[] |
| { AvailablePort.getRandomAvailablePort(AvailablePort.SOCKET) }; |
| assertTrue(ports[0] != 0); |
| |
| getLogWriter().info("[testServerEventsInLonerClient] create loner bridge client"); |
| Properties config = new Properties(); |
| config.setProperty(DistributionConfig.MCAST_PORT_NAME, "0"); |
| config.setProperty(DistributionConfig.LOCATORS_NAME, ""); |
| getSystem(config); |
| |
| getLogWriter().info("[testServerEventsInLonerClient] create system bridge client"); |
| getSystem(); |
| |
| // register the bridge listener |
| ClientMembership.registerClientMembershipListener(bridgeListener); |
| |
| // adapter should've self-registered w/ BridgeMembership |
| |
| // String clientMemberId = getMemberId(); |
| // DistributedMember clientMember = getDistributedMember(); |
| |
| // create BridgeServer in vm0... |
| SerializableRunnable createBridgeServer = |
| new CacheSerializableRunnable("Create BridgeServer") { |
| @Override |
| public void run2() throws CacheException { |
| getLogWriter().info("[testServerEventsInLonerClient] Create BridgeServer"); |
| getSystem(); |
| AttributesFactory factory = new AttributesFactory(); |
| factory.setScope(Scope.LOCAL); |
| Region region = createRegion(name, factory.create()); |
| assertNotNull(region); |
| assertNotNull(getRootRegion().getSubregion(name)); |
| try { |
| testServerEventsInLonerClient_port = startBridgeServer(ports[0]); |
| } |
| catch (IOException e) { |
| getLogWriter().error(e); |
| fail(e.getMessage()); |
| } |
| } |
| }; |
| |
| vm0.invoke(createBridgeServer); |
| |
| // gather details for later creation of BridgeLoader... |
| assertEquals(ports[0], |
| vm0.invokeInt(UniversalMembershipListenerAdapterDUnitTest.class, |
| "getTestServerEventsInLonerClient_port")); |
| String serverMemberId = (String) vm0.invoke( |
| UniversalMembershipListenerAdapterDUnitTest.class, "getMemberId"); |
| DistributedMember serverMember = (DistributedMember) vm0.invoke( |
| UniversalMembershipListenerAdapterDUnitTest.class, "getDistributedMember"); |
| |
| getLogWriter().info("[testServerEventsInLonerClient] ports[0]=" + ports[0]); |
| getLogWriter().info("[testServerEventsInLonerClient] serverMemberId=" + serverMemberId); |
| getLogWriter().info("[testServerEventsInLonerClient] serverMember=" + serverMember); |
| |
| // create region which connects to bridge server |
| AttributesFactory factory = new AttributesFactory(); |
| factory.setScope(Scope.LOCAL); |
| BridgeTestCase.configureConnectionPool(factory, getServerHostName(host), ports, false, -1, -1, null); |
| createRegion(name, factory.create()); |
| assertNotNull(getRootRegion().getSubregion(name)); |
| |
| synchronized(adapter) { |
| if (!firedAdapter[JOINED]) { |
| adapter.wait(ASYNC_EVENT_WAIT_MILLIS); |
| } |
| } |
| synchronized(bridgeListener) { |
| if (!firedBridge[JOINED]) { |
| bridgeListener.wait(ASYNC_EVENT_WAIT_MILLIS); |
| } |
| } |
| |
| getLogWriter().info("[testServerEventsInLonerClient] assert client detected server join"); |
| // TODO: sometimes get adapter duplicate since memberId isn't endpoint KIRK |
| // initial impl uses Endpoint.toString() for memberId of server; final |
| // impl should have server send its real memberId to client via HandShake |
| //assertFalse("Please update testBridgeMembershipEventsInClient to use BridgeServer memberId.", |
| // firedAdapterDuplicate); |
| assertFalse(firedAdapterDuplicate); |
| assertFalse(firedBridgeDuplicate); |
| |
| assertTrue(firedBridge[JOINED]); |
| assertEquals(serverMember, memberBridge[JOINED]); |
| assertEquals(serverMemberId, memberIdBridge[JOINED]); |
| assertNotNull(memberBridge[JOINED]); |
| assertNotNull(memberIdBridge[JOINED]); |
| assertFalse(isClientBridge[JOINED]); |
| assertFalse(firedBridge[LEFT]); |
| assertNull(memberBridge[LEFT]); |
| assertNull(memberIdBridge[LEFT]); |
| assertFalse(isClientBridge[LEFT]); |
| assertFalse(firedBridge[CRASHED]); |
| assertNull(memberBridge[CRASHED]); |
| assertNull(memberIdBridge[CRASHED]); |
| assertFalse(isClientBridge[CRASHED]); |
| resetArraysForTesting(firedBridge, memberBridge, memberIdBridge, isClientBridge); |
| |
| assertTrue(firedAdapter[JOINED]); |
| assertEquals(serverMember, memberAdapter[JOINED]); |
| assertEquals(serverMemberId, memberIdAdapter[JOINED]); |
| assertNotNull(memberIdAdapter[JOINED]); |
| assertFalse(isClientAdapter[JOINED]); |
| assertFalse(firedAdapter[LEFT]); |
| assertNull(memberAdapter[LEFT]); |
| assertNull(memberIdAdapter[LEFT]); |
| assertFalse(isClientAdapter[LEFT]); |
| assertFalse(firedAdapter[CRASHED]); |
| assertNull(memberAdapter[CRASHED]); |
| assertNull(memberIdAdapter[CRASHED]); |
| assertFalse(isClientAdapter[CRASHED]); |
| resetArraysForTesting(firedAdapter, memberAdapter, memberIdAdapter, isClientAdapter); |
| |
| getLogWriter().info("[testServerEventsInLonerClient] wait for client to fully connect"); |
| final String pl = |
| getRootRegion().getSubregion(name).getAttributes().getPoolName(); |
| PoolImpl pi = (PoolImpl)PoolManager.find(pl); |
| waitForClientToFullyConnect(pi); |
| |
| String expected = "java.io.IOException"; |
| String addExpected = |
| "<ExpectedException action=add>" + expected + "</ExpectedException>"; |
| String removeExpected = |
| "<ExpectedException action=remove>" + expected + "</ExpectedException>"; |
| |
| String expected2 = "java.net.ConnectException"; |
| String addExpected2 = |
| "<ExpectedException action=add>" + expected2 + "</ExpectedException>"; |
| String removeExpected2 = |
| "<ExpectedException action=remove>" + expected2 + "</ExpectedException>"; |
| |
| //LogWriter bgexecLogger = |
| // new LocalLogWriter(LocalLogWriter.ALL_LEVEL, System.out); |
| //bgexecLogger.info(addExpected); |
| //bgexecLogger.info(addExpected2); |
| LogWriter lw = getSystem().getLogWriter(); |
| lw.info(addExpected); |
| lw.info(addExpected2); |
| |
| try { |
| vm0.invoke(new SerializableRunnable("Disconnect bridge server") { |
| public void run() { |
| getLogWriter().info("[testServerEventsInLonerClient] disconnect bridge server"); |
| closeCache(); |
| } |
| }); |
| |
| synchronized(adapter) { |
| if (!firedAdapter[LEFT]) { |
| adapter.wait(ASYNC_EVENT_WAIT_MILLIS); |
| } |
| } |
| |
| synchronized(bridgeListener) { |
| if (!firedBridge[LEFT] && !firedBridge[CRASHED]) { |
| bridgeListener.wait(ASYNC_EVENT_WAIT_MILLIS); |
| } |
| } |
| } |
| finally { |
| //bgexecLogger.info(removeExpected); |
| //bgexecLogger.info(removeExpected2); |
| lw.info(removeExpected); |
| lw.info(removeExpected2); |
| } |
| |
| getLogWriter().info("[testServerEventsInLonerClient] assert client detected server crashed"); |
| // TODO: sometimes get adapter duplicate since memberId isn't endpoint KIRK |
| // initial impl uses Endpoint.toString() for memberId of server; final |
| // impl should have server send its real memberId to client via HandShake |
| //assertFalse("Please update testBridgeMembershipEventsInClient to use BridgeServer memberId.", |
| // firedAdapterDuplicate); |
| assertFalse(firedAdapterDuplicate); |
| assertFalse(firedBridgeDuplicate); |
| |
| assertFalse(firedBridge[JOINED]); |
| assertNull(memberIdBridge[JOINED]); |
| assertNull(memberBridge[JOINED]); |
| assertFalse(isClientBridge[JOINED]); |
| assertFalse("Please update testServerEventsInLonerClient to handle memberLeft for BridgeServer.", |
| firedBridge[LEFT]); |
| assertNull(memberBridge[LEFT]); |
| assertNull(memberIdBridge[LEFT]); |
| assertFalse(isClientBridge[LEFT]); |
| assertTrue(firedBridge[CRASHED]); |
| assertNotNull(memberBridge[CRASHED]); |
| assertNotNull(memberIdBridge[CRASHED]); |
| assertEquals(serverMember, memberAdapter[CRASHED]); |
| assertEquals(serverMemberId, memberIdAdapter[CRASHED]); |
| assertFalse(isClientBridge[CRASHED]); |
| resetArraysForTesting(firedBridge, memberBridge, memberIdBridge, isClientBridge); |
| |
| assertFalse(firedAdapter[JOINED]); |
| assertNull(memberAdapter[JOINED]); |
| assertNull(memberIdAdapter[JOINED]); |
| assertFalse(isClientAdapter[JOINED]); |
| assertFalse("Please update testServerEventsInLonerClient to handle BridgeServer LEFT", |
| firedAdapter[LEFT]); |
| assertNull(memberAdapter[LEFT]); |
| assertNull(memberIdAdapter[LEFT]); |
| assertFalse(isClientAdapter[LEFT]); |
| // CRASHED fired by Bridge listener |
| assertTrue(firedAdapter[CRASHED]); |
| assertNotNull(memberAdapter[CRASHED]); |
| assertNotNull(memberIdAdapter[CRASHED]); |
| assertEquals(serverMember, memberAdapter[CRASHED]); |
| assertEquals(serverMemberId, memberIdAdapter[CRASHED]); |
| assertFalse(isClientAdapter[CRASHED]); |
| resetArraysForTesting(firedAdapter, memberAdapter, memberIdAdapter, isClientAdapter); |
| |
| // reconnect bridge client to test for crashed event |
| vm0.invoke(createBridgeServer); |
| |
| // gather details for later creation of BridgeLoader... |
| assertEquals(ports[0], |
| vm0.invokeInt(UniversalMembershipListenerAdapterDUnitTest.class, |
| "getTestServerEventsInLonerClient_port")); |
| serverMemberId = (String) vm0.invoke( |
| UniversalMembershipListenerAdapterDUnitTest.class, "getMemberId"); |
| serverMember = (DistributedMember) vm0.invoke( |
| UniversalMembershipListenerAdapterDUnitTest.class, "getDistributedMember"); |
| |
| getLogWriter().info("[testServerEventsInLonerClient] ports[0]=" + ports[0]); |
| getLogWriter().info("[testServerEventsInLonerClient] serverMemberId=" + serverMemberId); |
| getLogWriter().info("[testServerEventsInLonerClient] serverMember=" + serverMember); |
| |
| synchronized(adapter) { |
| if (!firedAdapter[JOINED]) { |
| adapter.wait(ASYNC_EVENT_WAIT_MILLIS); |
| } |
| } |
| synchronized(bridgeListener) { |
| if (!firedBridge[JOINED]) { |
| bridgeListener.wait(ASYNC_EVENT_WAIT_MILLIS); |
| } |
| } |
| |
| getLogWriter().info("[testServerEventsInLonerClient] assert client detected server re-join"); |
| // TODO: sometimes get adapter duplicate since memberId isn't endpoint KIRK |
| // initial impl uses Endpoint.toString() for memberId of server; final |
| // impl should have server send its real memberId to client via HandShake |
| //assertFalse("Please update testBridgeMembershipEventsInClient to use BridgeServer memberId.", |
| // firedAdapterDuplicate); |
| assertFalse(firedAdapterDuplicate); |
| assertFalse(firedBridgeDuplicate); |
| |
| assertTrue(firedBridge[JOINED]); |
| assertNotNull(memberBridge[JOINED]); |
| assertNotNull(memberIdBridge[JOINED]); |
| assertEquals(serverMember, memberBridge[JOINED]); |
| assertEquals(serverMemberId, memberIdBridge[JOINED]); |
| assertFalse(isClientBridge[JOINED]); |
| assertFalse(firedBridge[LEFT]); |
| assertNull(memberBridge[LEFT]); |
| assertNull(memberIdBridge[LEFT]); |
| assertFalse(isClientBridge[LEFT]); |
| assertFalse(firedBridge[CRASHED]); |
| assertNull(memberBridge[CRASHED]); |
| assertNull(memberIdBridge[CRASHED]); |
| assertFalse(isClientBridge[CRASHED]); |
| resetArraysForTesting(firedBridge, memberBridge, memberIdBridge, isClientBridge); |
| |
| assertTrue(firedAdapter[JOINED]); |
| assertEquals(serverMember, memberAdapter[JOINED]); |
| assertEquals(serverMemberId, memberIdAdapter[JOINED]); |
| assertNotNull(memberAdapter[JOINED]); |
| assertNotNull(memberIdAdapter[JOINED]); |
| assertFalse(isClientAdapter[JOINED]); |
| assertFalse(firedAdapter[LEFT]); |
| assertNull(memberAdapter[LEFT]); |
| assertNull(memberIdAdapter[LEFT]); |
| assertFalse(isClientAdapter[LEFT]); |
| assertFalse(firedAdapter[CRASHED]); |
| assertNull(memberAdapter[CRASHED]); |
| assertNull(memberIdAdapter[CRASHED]); |
| assertFalse(isClientAdapter[CRASHED]); |
| resetArraysForTesting(firedAdapter, memberAdapter, memberIdAdapter, isClientAdapter); |
| } |
| |
| // Simple DistributedMember implementation |
| static final class TestDistributedMember implements DistributedMember { |
| |
| private final String host; |
| |
| public TestDistributedMember(String host) { |
| this.host = host; |
| } |
| |
| public String getName() { |
| return ""; |
| } |
| |
| public String getHost() { |
| return this.host; |
| } |
| |
| public Set getRoles() { |
| return new HashSet(); |
| } |
| |
| public int getProcessId() { |
| return 0; |
| } |
| |
| public String getId() { |
| return this.host; |
| } |
| |
| public int compareTo(DistributedMember o) { |
| if ((o == null) || !(o instanceof TestDistributedMember)) { |
| throw new InternalGemFireException("Invalidly comparing TestDistributedMember to " + o); |
| } |
| |
| TestDistributedMember tds = (TestDistributedMember) o; |
| return getHost().compareTo(tds.getHost()); |
| } |
| |
| @Override |
| public boolean equals(Object obj) { |
| if ((obj == null) || !(obj instanceof TestDistributedMember)) { |
| return false; |
| } |
| return compareTo((TestDistributedMember)obj) == 0; |
| } |
| |
| @Override |
| public int hashCode() { |
| return getHost().hashCode(); |
| } |
| |
| public DurableClientAttributes getDurableClientAttributes() { |
| return null; |
| } |
| |
| public List<String> getGroups() { |
| return Collections.emptyList(); |
| } |
| } |
| |
| } |