use of org.apache.geode.management.membership.ClientMembershipEvent in project geode by apache.
the class UniversalMembershipListenerAdapterDUnitTest method doTestSystemClientEventsInServer.
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...
System.out.println("[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 DistributedMember serverMember = getMemberId();
final String serverMemberId = serverMember.getId();
final Properties serverProperties = getSystem().getProperties();
// Below removed properties are already got copied as cluster SSL properties
serverProperties.remove(CLUSTER_SSL_ENABLED);
serverProperties.remove(CLUSTER_SSL_CIPHERS);
serverProperties.remove(CLUSTER_SSL_PROTOCOLS);
serverProperties.remove(CLUSTER_SSL_REQUIRE_AUTHENTICATION);
System.out.println("[doTestSystemClientEventsInServer] ports[0]=" + ports[0]);
System.out.println("[doTestSystemClientEventsInServer] serverMemberId=" + serverMemberId);
System.out.println("[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);
SerializableCallable createBridgeClient = new SerializableCallable("Create bridge client") {
@Override
public Object call() {
System.out.println("[doTestSystemClientEventsInServer] create system bridge client");
assertTrue(getSystem(serverProperties).isConnected());
assertFalse(getCache().isClosed());
AttributesFactory factory = new AttributesFactory();
factory.setScope(Scope.LOCAL);
ClientServerTestCase.configureConnectionPool(factory, NetworkUtils.getServerHostName(host), ports, false, -1, -1, null);
createRegion(name, factory.create());
assertNotNull(getRootRegion().getSubregion(name));
return getMemberId();
}
};
// create bridge client in vm0...
DistributedMember clientMember = (DistributedMember) vm0.invoke(createBridgeClient);
String clientMemberId = clientMember.getId();
// 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);
}
}
System.out.println("[doTestSystemClientEventsInServer] assert server detected client join");
assertArrayFalse(firedSystemDuplicate);
assertArrayFalse(firedAdapterDuplicate);
assertArrayFalse(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() {
System.out.println("[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() {
System.out.println("[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);
}
}
System.out.println("[doTestSystemClientEventsInServer] assert server detected client left");
assertArrayFalse(firedSystemDuplicate);
assertArrayFalse(firedAdapterDuplicate);
assertArrayFalse(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
clientMember = (DistributedMember) vm0.invoke(createBridgeClient);
clientMemberId = clientMember.getId();
synchronized (adapter) {
if (!firedAdapter[JOINED]) {
adapter.wait(ASYNC_EVENT_WAIT_MILLIS);
}
}
synchronized (bridgeListener) {
if (!firedBridge[JOINED]) {
bridgeListener.wait(ASYNC_EVENT_WAIT_MILLIS);
}
}
System.out.println("[doTestSystemClientEventsInServer] assert server detected client re-join");
assertArrayFalse(firedSystemDuplicate);
assertArrayFalse(firedAdapterDuplicate);
assertArrayFalse(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() {
System.out.println("[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() {
System.out.println("[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);
}
}
System.out.println("[doTestSystemClientEventsInServer] assert server detected client left");
assertArrayFalse(firedSystemDuplicate);
assertArrayFalse(firedAdapterDuplicate);
assertArrayFalse(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
clientMember = (DistributedMember) vm0.invoke(createBridgeClient);
clientMemberId = clientMember.getId();
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);
}
}
System.out.println("[doTestSystemClientEventsInServer] assert server detected client re-join");
assertArrayFalse(firedSystemDuplicate);
assertArrayFalse(firedAdapterDuplicate);
assertArrayFalse(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() {
System.out.println("[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() {
System.out.println("[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");
assertArrayFalse(firedSystemDuplicate);
assertArrayFalse(firedAdapterDuplicate);
assertArrayFalse(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);
}
}
use of org.apache.geode.management.membership.ClientMembershipEvent in project geode by apache.
the class AutoConnectionSourceImplJUnitTest method testServerLocationUsedInListenerNotification.
@Test
public void testServerLocationUsedInListenerNotification() throws Exception {
final ClientMembershipEvent[] listenerEvents = new ClientMembershipEvent[1];
ClientMembershipListener listener = new ClientMembershipListener() {
@Override
public void memberJoined(final ClientMembershipEvent event) {
synchronized (listenerEvents) {
listenerEvents[0] = event;
}
}
@Override
public void memberLeft(final ClientMembershipEvent event) {
}
@Override
public void memberCrashed(final ClientMembershipEvent event) {
}
};
InternalClientMembership.registerClientMembershipListener(listener);
ServerLocation location = new ServerLocation("1.1.1.1", 0);
InternalClientMembership.notifyServerJoined(location);
Awaitility.await("wait for listener notification").atMost(10, TimeUnit.SECONDS).until(() -> {
synchronized (listenerEvents) {
return listenerEvents[0] != null;
}
});
assertEquals("1.1.1.1", listenerEvents[0].getMember().getHost());
InetAddress addr = InetAddress.getLocalHost();
location = new ServerLocation(addr.getHostAddress(), 0);
listenerEvents[0] = null;
InternalClientMembership.notifyServerJoined(location);
Awaitility.await("wait for listener notification").atMost(10, TimeUnit.SECONDS).until(() -> {
synchronized (listenerEvents) {
return listenerEvents[0] != null;
}
});
assertEquals(addr.getCanonicalHostName(), listenerEvents[0].getMember().getHost());
}
use of org.apache.geode.management.membership.ClientMembershipEvent in project geode by apache.
the class InternalClientMembership method notifyListeners.
/**
* Notifies registered listeners that a Client member has joined. The new member may be a client
* connecting to this process or a server that this process has just connected to.
*
* @param member the <code>DistributedMember</code>
* @param client true if the member is a client; false if server
* @param typeOfEvent joined/left/crashed
*/
private static void notifyListeners(final DistributedMember member, final boolean client, final EventType typeOfEvent) {
startMonitoring();
ThreadPoolExecutor queuedExecutor = executor;
if (queuedExecutor == null) {
return;
}
final ClientMembershipEvent event = new InternalClientMembershipEvent(member, client);
if (forceSynchronous) {
doNotifyClientMembershipListener(member, client, event, typeOfEvent);
} else {
try {
queuedExecutor.execute(() -> {
doNotifyClientMembershipListener(member, client, event, typeOfEvent);
});
} catch (RejectedExecutionException e) {
// executor must have been shutdown
}
}
}
use of org.apache.geode.management.membership.ClientMembershipEvent in project geode by apache.
the class ClientMembershipDUnitTest method testClientMembershipEventsInClient.
/**
* Tests notification of events in client process. Bridge clients detect server joins when the
* client connects to the server. If the server crashes or departs gracefully, the client will
* detect this as a crash.
*/
@Test
public void testClientMembershipEventsInClient() throws Exception {
properties = null;
getSystem();
IgnoredException.addIgnoredException("IOException");
final boolean[] fired = new boolean[3];
final DistributedMember[] member = new DistributedMember[3];
final String[] memberId = new String[3];
final boolean[] isClient = new boolean[3];
// create and register ClientMembershipListener in controller vm...
ClientMembershipListener listener = new ClientMembershipListener() {
public void memberJoined(ClientMembershipEvent event) {
System.out.println("[testClientMembershipEventsInClient] memberJoined: " + event);
fired[JOINED] = true;
member[JOINED] = event.getMember();
memberId[JOINED] = event.getMemberId();
isClient[JOINED] = event.isClient();
}
public void memberLeft(ClientMembershipEvent event) {
System.out.println("[testClientMembershipEventsInClient] memberLeft: " + event);
}
public void memberCrashed(ClientMembershipEvent event) {
System.out.println("[testClientMembershipEventsInClient] memberCrashed: " + event);
fired[CRASHED] = true;
member[CRASHED] = event.getMember();
memberId[CRASHED] = event.getMemberId();
isClient[CRASHED] = event.isClient();
}
};
ClientMembership.registerClientMembershipListener(listener);
final VM vm0 = Host.getHost(0).getVM(0);
final String name = this.getUniqueName();
final int[] ports = new int[1];
// create BridgeServer in vm0...
vm0.invoke("create Bridge Server", () -> {
try {
System.out.println("[testClientMembershipEventsInClient] Create BridgeServer");
getSystem();
AttributesFactory factory = new AttributesFactory();
factory.setScope(Scope.LOCAL);
Region region = createRegion(name, factory.create());
assertNotNull(region);
assertNotNull(getRootRegion().getSubregion(name));
testClientMembershipEventsInClient_port = startBridgeServer(0);
} catch (IOException e) {
getSystem().getLogWriter().fine(new Exception(e));
fail("Failed to start CacheServer: " + e.getMessage());
}
});
// gather details for later creation of ConnectionPool...
ports[0] = vm0.invoke("getTestClientMembershipEventsInClient_port", () -> ClientMembershipDUnitTest.getTestClientMembershipEventsInClient_port());
assertTrue(ports[0] != 0);
DistributedMember serverMember = (DistributedMember) vm0.invoke("get distributed member", () -> ClientMembershipDUnitTest.getDistributedMember());
String serverMemberId = serverMember.toString();
System.out.println("[testClientMembershipEventsInClient] ports[0]=" + ports[0]);
System.out.println("[testClientMembershipEventsInClient] serverMember=" + serverMember);
System.out.println("[testClientMembershipEventsInClient] serverMemberId=" + serverMemberId);
assertFalse(fired[JOINED]);
assertNull(member[JOINED]);
assertNull(memberId[JOINED]);
assertFalse(isClient[JOINED]);
assertFalse(fired[LEFT]);
assertNull(member[LEFT]);
assertNull(memberId[LEFT]);
assertFalse(isClient[LEFT]);
assertFalse(fired[CRASHED]);
assertNull(member[CRASHED]);
assertNull(memberId[CRASHED]);
assertFalse(isClient[CRASHED]);
// sanity check...
System.out.println("[testClientMembershipEventsInClient] sanity check");
InternalClientMembership.notifyServerJoined(serverLocation);
Awaitility.await().pollInterval(50, TimeUnit.MILLISECONDS).timeout(300, TimeUnit.SECONDS).pollDelay(50, TimeUnit.MILLISECONDS).until(() -> fired[JOINED] || fired[CRASHED]);
assertTrue(fired[JOINED]);
assertNotNull(member[JOINED]);
assertFalse(isClient[JOINED]);
assertFalse(fired[LEFT]);
assertNull(member[LEFT]);
assertNull(memberId[LEFT]);
assertFalse(isClient[LEFT]);
assertFalse(fired[CRASHED]);
assertNull(member[CRASHED]);
assertNull(memberId[CRASHED]);
assertFalse(isClient[CRASHED]);
resetArraysForTesting(fired, member, memberId, isClient);
// create bridge client in controller vm...
System.out.println("[testClientMembershipEventsInClient] create bridge client");
Properties config = new Properties();
config.setProperty(MCAST_PORT, "0");
config.setProperty(LOCATORS, "");
config.setProperty(ENABLE_NETWORK_PARTITION_DETECTION, "false");
getSystem(config);
try {
getCache();
AttributesFactory factory = new AttributesFactory();
factory.setScope(Scope.LOCAL);
ClientServerTestCase.configureConnectionPool(factory, NetworkUtils.getServerHostName(Host.getHost(0)), ports, true, -1, -1, null);
createRegion(name, factory.create());
assertNotNull(getRootRegion().getSubregion(name));
} catch (CacheException ex) {
Assert.fail("While creating Region on Edge", ex);
}
Awaitility.await().pollInterval(50, TimeUnit.MILLISECONDS).timeout(300, TimeUnit.SECONDS).pollDelay(50, TimeUnit.MILLISECONDS).until(() -> fired[JOINED] || fired[CRASHED]);
System.out.println("[testClientMembershipEventsInClient] assert client detected server join");
// first check the getCurrentServers() result
ClientCache clientCache = (ClientCache) getCache();
Set<InetSocketAddress> servers = clientCache.getCurrentServers();
assertTrue(!servers.isEmpty());
InetSocketAddress serverAddr = servers.iterator().next();
InetSocketAddress expectedAddr = new InetSocketAddress(serverMember.getHost(), ports[0]);
assertEquals(expectedAddr, serverAddr);
// now check listener results
assertTrue(fired[JOINED]);
assertNotNull(member[JOINED]);
assertNotNull(memberId[JOINED]);
assertFalse(isClient[JOINED]);
assertFalse(fired[LEFT]);
assertNull(member[LEFT]);
assertNull(memberId[LEFT]);
assertFalse(isClient[LEFT]);
assertFalse(fired[CRASHED]);
assertNull(member[CRASHED]);
assertNull(memberId[CRASHED]);
assertFalse(isClient[CRASHED]);
resetArraysForTesting(fired, member, memberId, isClient);
vm0.invoke("Stop BridgeServer", () -> stopBridgeServers(getCache()));
Awaitility.await().pollInterval(50, TimeUnit.MILLISECONDS).timeout(300, TimeUnit.SECONDS).pollDelay(50, TimeUnit.MILLISECONDS).until(() -> fired[JOINED] || fired[CRASHED]);
System.out.println("[testClientMembershipEventsInClient] assert client detected server departure");
assertFalse(fired[JOINED]);
assertNull(member[JOINED]);
assertNull(memberId[JOINED]);
assertFalse(isClient[JOINED]);
assertFalse(fired[LEFT]);
assertNull(member[LEFT]);
assertNull(memberId[LEFT]);
assertFalse(isClient[LEFT]);
assertTrue(fired[CRASHED]);
assertNotNull(member[CRASHED]);
assertNotNull(memberId[CRASHED]);
assertFalse(isClient[CRASHED]);
resetArraysForTesting(fired, member, memberId, isClient);
// now test that we redisover the bridge server
vm0.invoke("Recreate BridgeServer", () -> {
try {
System.out.println("[testClientMembershipEventsInClient] restarting BridgeServer");
startBridgeServer(ports[0]);
} catch (IOException e) {
getSystem().getLogWriter().fine(new Exception(e));
fail("Failed to start CacheServer on VM1: " + e.getMessage());
}
});
Awaitility.await().pollInterval(50, TimeUnit.MILLISECONDS).timeout(300, TimeUnit.SECONDS).pollDelay(50, TimeUnit.MILLISECONDS).until(() -> fired[JOINED] || fired[CRASHED]);
System.out.println("[testClientMembershipEventsInClient] assert client detected server recovery");
assertTrue(fired[JOINED]);
assertNotNull(member[JOINED]);
assertNotNull(memberId[JOINED]);
assertFalse(isClient[JOINED]);
assertFalse(fired[LEFT]);
assertNull(member[LEFT]);
assertNull(memberId[LEFT]);
assertFalse(isClient[LEFT]);
assertFalse(fired[CRASHED]);
assertNull(member[CRASHED]);
assertNull(memberId[CRASHED]);
}
use of org.apache.geode.management.membership.ClientMembershipEvent in project geode by apache.
the class ClientMembershipDUnitTest method doTestBasicEvents.
public void doTestBasicEvents() throws Exception {
final boolean[] fired = new boolean[3];
final DistributedMember[] member = new DistributedMember[3];
final String[] memberId = new String[3];
final boolean[] isClient = new boolean[3];
ClientMembershipListener listener = new ClientMembershipListener() {
public void memberJoined(ClientMembershipEvent event) {
fired[JOINED] = true;
member[JOINED] = event.getMember();
memberId[JOINED] = event.getMemberId();
isClient[JOINED] = event.isClient();
}
public void memberLeft(ClientMembershipEvent event) {
fired[LEFT] = true;
member[LEFT] = event.getMember();
memberId[LEFT] = event.getMemberId();
isClient[LEFT] = event.isClient();
}
public void memberCrashed(ClientMembershipEvent event) {
fired[CRASHED] = true;
member[CRASHED] = event.getMember();
memberId[CRASHED] = event.getMemberId();
isClient[CRASHED] = event.isClient();
}
};
ClientMembership.registerClientMembershipListener(listener);
// test JOIN for server
InternalClientMembership.notifyServerJoined(serverLocation);
Awaitility.await().pollInterval(100, TimeUnit.MILLISECONDS).pollDelay(100, TimeUnit.MILLISECONDS).timeout(300, TimeUnit.SECONDS).until(() -> {
return fired[JOINED];
});
assertTrue(fired[JOINED]);
assertNotNull(member[JOINED]);
assertFalse(isClient[JOINED]);
assertFalse(fired[LEFT]);
assertNull(memberId[LEFT]);
assertFalse(isClient[LEFT]);
assertFalse(fired[CRASHED]);
assertNull(memberId[CRASHED]);
assertFalse(isClient[CRASHED]);
resetArraysForTesting(fired, member, memberId, isClient);
// test JOIN for client
DistributedMember clientJoined = new TestDistributedMember("clientJoined");
InternalClientMembership.notifyClientJoined(clientJoined);
Awaitility.await().pollInterval(100, TimeUnit.MILLISECONDS).pollDelay(100, TimeUnit.MILLISECONDS).timeout(300, TimeUnit.SECONDS).until(() -> {
return fired[JOINED];
});
assertTrue(fired[JOINED]);
assertEquals(clientJoined, member[JOINED]);
assertEquals(clientJoined.getId(), memberId[JOINED]);
assertTrue(isClient[JOINED]);
assertFalse(fired[LEFT]);
assertNull(memberId[LEFT]);
assertFalse(isClient[LEFT]);
assertFalse(fired[CRASHED]);
assertNull(memberId[CRASHED]);
assertFalse(isClient[CRASHED]);
resetArraysForTesting(fired, member, memberId, isClient);
// test LEFT for server
InternalClientMembership.notifyServerLeft(serverLocation);
Awaitility.await().pollInterval(100, TimeUnit.MILLISECONDS).pollDelay(100, TimeUnit.MILLISECONDS).timeout(300, TimeUnit.SECONDS).until(() -> {
return fired[LEFT];
});
assertFalse(fired[JOINED]);
assertNull(memberId[JOINED]);
assertFalse(isClient[JOINED]);
assertTrue(fired[LEFT]);
assertNotNull(member[LEFT]);
assertFalse(isClient[LEFT]);
assertFalse(fired[CRASHED]);
assertNull(memberId[CRASHED]);
assertFalse(isClient[CRASHED]);
resetArraysForTesting(fired, member, memberId, isClient);
// test LEFT for client
DistributedMember clientLeft = new TestDistributedMember("clientLeft");
InternalClientMembership.notifyClientLeft(clientLeft);
Awaitility.await().pollInterval(100, TimeUnit.MILLISECONDS).pollDelay(100, TimeUnit.MILLISECONDS).timeout(300, TimeUnit.SECONDS).until(() -> {
return fired[LEFT];
});
assertFalse(fired[JOINED]);
assertNull(memberId[JOINED]);
assertFalse(isClient[JOINED]);
assertTrue(fired[LEFT]);
assertEquals(clientLeft, member[LEFT]);
assertEquals(clientLeft.getId(), memberId[LEFT]);
assertTrue(isClient[LEFT]);
assertFalse(fired[CRASHED]);
assertNull(memberId[CRASHED]);
assertFalse(isClient[CRASHED]);
resetArraysForTesting(fired, member, memberId, isClient);
// test CRASHED for server
InternalClientMembership.notifyServerCrashed(serverLocation);
Awaitility.await().pollInterval(100, TimeUnit.MILLISECONDS).pollDelay(100, TimeUnit.MILLISECONDS).timeout(300, TimeUnit.SECONDS).until(() -> {
return fired[CRASHED];
});
assertFalse(fired[JOINED]);
assertNull(memberId[JOINED]);
assertFalse(isClient[JOINED]);
assertFalse(fired[LEFT]);
assertNull(memberId[LEFT]);
assertFalse(isClient[LEFT]);
assertTrue(fired[CRASHED]);
assertNotNull(member[CRASHED]);
assertFalse(isClient[CRASHED]);
resetArraysForTesting(fired, member, memberId, isClient);
// test CRASHED for client
DistributedMember clientCrashed = new TestDistributedMember("clientCrashed");
InternalClientMembership.notifyClientCrashed(clientCrashed);
Awaitility.await().pollInterval(100, TimeUnit.MILLISECONDS).pollDelay(100, TimeUnit.MILLISECONDS).timeout(300, TimeUnit.SECONDS).until(() -> {
return fired[CRASHED];
});
assertFalse(fired[JOINED]);
assertNull(memberId[JOINED]);
assertFalse(isClient[JOINED]);
assertFalse(fired[LEFT]);
assertNull(memberId[LEFT]);
assertFalse(isClient[LEFT]);
assertTrue(fired[CRASHED]);
assertEquals(clientCrashed, member[CRASHED]);
assertEquals(clientCrashed.getId(), memberId[CRASHED]);
assertTrue(isClient[CRASHED]);
resetArraysForTesting(fired, member, memberId, isClient);
}
Aggregations