You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@geode.apache.org by ji...@apache.org on 2016/07/06 22:59:24 UTC
[01/10] incubator-geode git commit: GEODE-1610: ClientSession
register interest now enqueues initial value
Repository: incubator-geode
Updated Branches:
refs/heads/feature/GEODE-1571 8a26ac0d7 -> e4d79df78
GEODE-1610: ClientSession register interest now enqueues initial value
Project: http://git-wip-us.apache.org/repos/asf/incubator-geode/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-geode/commit/c065b6ae
Tree: http://git-wip-us.apache.org/repos/asf/incubator-geode/tree/c065b6ae
Diff: http://git-wip-us.apache.org/repos/asf/incubator-geode/diff/c065b6ae
Branch: refs/heads/feature/GEODE-1571
Commit: c065b6aef47016a75a06c4bb206531f2178ddd4a
Parents: cf30f6c
Author: Barry Oglesby <bo...@pivotal.io>
Authored: Tue Jul 5 17:36:16 2016 -0700
Committer: Barry Oglesby <bo...@pivotal.io>
Committed: Tue Jul 5 17:37:42 2016 -0700
----------------------------------------------------------------------
.../cache/tier/sockets/CacheClientProxy.java | 105 +++---
.../tier/sockets/ClientInterestMessageImpl.java | 40 +++
.../cache/tier/sockets/CacheServerTestUtil.java | 43 ++-
.../sockets/DurableClientSimpleDUnitTest.java | 357 ++++++-------------
.../tier/sockets/DurableClientTestCase.java | 158 +++-----
5 files changed, 313 insertions(+), 390 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/c065b6ae/geode-core/src/main/java/com/gemstone/gemfire/internal/cache/tier/sockets/CacheClientProxy.java
----------------------------------------------------------------------
diff --git a/geode-core/src/main/java/com/gemstone/gemfire/internal/cache/tier/sockets/CacheClientProxy.java b/geode-core/src/main/java/com/gemstone/gemfire/internal/cache/tier/sockets/CacheClientProxy.java
index c4b48f4..4269e7f 100755
--- a/geode-core/src/main/java/com/gemstone/gemfire/internal/cache/tier/sockets/CacheClientProxy.java
+++ b/geode-core/src/main/java/com/gemstone/gemfire/internal/cache/tier/sockets/CacheClientProxy.java
@@ -1084,27 +1084,7 @@ public class CacheClientProxy implements ClientSession {
// Enqueue the initial value message for the client if necessary
if (policy == InterestResultPolicy.KEYS_VALUES) {
- Get70 request = (Get70)Get70.getCommand();
- LocalRegion lr = (LocalRegion) this._cache.getRegion(regionName);
- Get70.Entry entry = request.getValueAndIsObject(lr, keyOfInterest, null,
- null);
- boolean isObject = entry.isObject;
- byte[] value = null;
- if (entry.value instanceof byte[]) {
- value = (byte[])entry.value;
- } else {
- try {
- value = CacheServerHelper.serialize(entry.value);
- } catch (IOException e) {
- logger.warn(LocalizedMessage.create(LocalizedStrings.CacheClientProxy_THE_FOLLOWING_EXCEPTION_OCCURRED_0, entry.value), e);
- }
- }
- VersionTag tag = entry.versionTag;
- ClientUpdateMessage updateMessage = new ClientUpdateMessageImpl(
- EnumListenerEvent.AFTER_CREATE, lr, keyOfInterest, value, null,
- (isObject ? (byte) 0x01 : (byte) 0x00), null, this.proxyID,
- new EventID(this._cache.getDistributedSystem()), tag);
- CacheClientNotifier.routeSingleClientMessage(updateMessage, this.proxyID);
+ enqueueInitialValue(null, regionName, keyOfInterest);
}
// Add the client to the region's filters
//addFilterRegisteredClients(regionName, keyOfInterest);
@@ -1136,16 +1116,58 @@ public class CacheClientProxy implements ClientSession {
}
// Enqueue the interest registration message for the client.
+ enqueueInterestRegistrationMessage(message);
+ }
+
+ private void enqueueInitialValue(ClientInterestMessageImpl clientInterestMessage, String regionName, Object keyOfInterest) {
+ // Get the initial value
+ Get70 request = (Get70)Get70.getCommand();
+ LocalRegion lr = (LocalRegion) this._cache.getRegion(regionName);
+ Get70.Entry entry = request.getValueAndIsObject(lr, keyOfInterest, null, null);
+ boolean isObject = entry.isObject;
+ byte[] value = null;
+
+ // If the initial value is not null, add it to the client's queue
+ if (entry.value != null) {
+ if (entry.value instanceof byte[]) {
+ value = (byte[])entry.value;
+ } else {
+ try {
+ value = CacheServerHelper.serialize(entry.value);
+ } catch (IOException e) {
+ logger.warn(LocalizedMessage.create(LocalizedStrings.CacheClientProxy_THE_FOLLOWING_EXCEPTION_OCCURRED_0, entry.value), e);
+ }
+ }
+ VersionTag tag = entry.versionTag;
+
+ // Initialize the event id.
+ EventID eventId = null;
+ if (clientInterestMessage == null) {
+ // If the clientInterestMessage is null, create a new event id
+ eventId = new EventID(this._cache.getDistributedSystem());
+ } else {
+ // If the clientInterestMessage is not null, base the event id off its event id to fix GEM-794.
+ // This will cause the updateMessage created below to have the same event id as the one created
+ // in the primary.
+ eventId = new EventID(clientInterestMessage.getEventId(), 1);
+ }
+ ClientUpdateMessage updateMessage = new ClientUpdateMessageImpl(
+ EnumListenerEvent.AFTER_CREATE, lr, keyOfInterest, value, null,
+ (isObject ? (byte) 0x01 : (byte) 0x00), null, this.proxyID,
+ eventId, tag);
+ CacheClientNotifier.routeSingleClientMessage(updateMessage, this.proxyID);
+ }
+ }
+
+ private void enqueueInterestRegistrationMessage(ClientInterestMessageImpl message) {
+ // Enqueue the interest registration message for the client.
// If the client is not 7.0.1 or greater and the key of interest is a list,
// then create an individual message for each entry in the list since the
// client doesn't support a ClientInterestMessageImpl containing a list.
if (Version.GFE_701.compareTo(this.clientVersion) > 0
- && keyOfInterest instanceof List) {
- for (Iterator i = ((List) keyOfInterest).iterator(); i.hasNext();) {
- this._messageDispatcher.enqueueMessage(new ClientInterestMessageImpl(
- new EventID(this._cache.getDistributedSystem()), regionName,
- i.next(), interestType, policy.getOrdinal(), isDurable, !receiveValues,
- ClientInterestMessageImpl.REGISTER));
+ && message.getKeyOfInterest() instanceof List) {
+ for (Iterator i = ((List) message.getKeyOfInterest()).iterator(); i.hasNext();) {
+ this._messageDispatcher.enqueueMessage(new ClientInterestMessageImpl(message, i.next()));
}
} else {
this._messageDispatcher.enqueueMessage(message);
@@ -1205,20 +1227,7 @@ public class CacheClientProxy implements ClientSession {
}
// Enqueue the interest unregistration message for the client.
- // If the client is not 7.0.1 or greater and the key of interest is a list,
- // then create an individual message for each entry in the list since the
- // client doesn't support a ClientInterestMessageImpl containing a list.
- if (Version.GFE_701.compareTo(this.clientVersion) > 0
- && keyOfInterest instanceof List) {
- for (Iterator i = ((List) keyOfInterest).iterator(); i.hasNext();) {
- this._messageDispatcher.enqueueMessage(new ClientInterestMessageImpl(
- new EventID(this._cache.getDistributedSystem()), regionName,
- i.next(), interestType, (byte) 0, isDurable, !receiveValues,
- ClientInterestMessageImpl.UNREGISTER));
- }
- } else {
- this._messageDispatcher.enqueueMessage(message);
- }
+ enqueueInterestRegistrationMessage(message);
}
protected void notifySecondariesOfInterestChange(ClientInterestMessageImpl message) {
@@ -1410,6 +1419,7 @@ public class CacheClientProxy implements ClientSession {
/** sent by the cache client notifier when there is an interest registration change */
protected void processInterestMessage(ClientInterestMessageImpl message) {
+ // Register or unregister interest depending on the interest type
int interestType = message.getInterestType();
String regionName = message.getRegionName();
Object key = message.getKeyOfInterest();
@@ -1460,7 +1470,18 @@ public class CacheClientProxy implements ClientSession {
.append(InterestType.getString(message.getInterestType()));
logger.debug(buffer.toString());
}
- }
+ }
+
+ // Enqueue the interest message in this secondary proxy (fix for bug #52088)
+ enqueueInterestRegistrationMessage(message);
+
+ // Enqueue the initial value if the message is register on a key that is not a list (fix for bug #52088)
+ if (message.isRegister()
+ && message.getInterestType() == InterestType.KEY
+ && !(key instanceof List)
+ && InterestResultPolicy.fromOrdinal(message.getInterestResultPolicy()) == InterestResultPolicy.KEYS_VALUES) {
+ enqueueInitialValue(message, regionName, key);
+ }
}
private boolean postDeliverAuthCheckPassed(ClientUpdateMessage clientMessage) {
http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/c065b6ae/geode-core/src/main/java/com/gemstone/gemfire/internal/cache/tier/sockets/ClientInterestMessageImpl.java
----------------------------------------------------------------------
diff --git a/geode-core/src/main/java/com/gemstone/gemfire/internal/cache/tier/sockets/ClientInterestMessageImpl.java b/geode-core/src/main/java/com/gemstone/gemfire/internal/cache/tier/sockets/ClientInterestMessageImpl.java
index c7fd61a..ee53ef2 100755
--- a/geode-core/src/main/java/com/gemstone/gemfire/internal/cache/tier/sockets/ClientInterestMessageImpl.java
+++ b/geode-core/src/main/java/com/gemstone/gemfire/internal/cache/tier/sockets/ClientInterestMessageImpl.java
@@ -18,6 +18,7 @@
package com.gemstone.gemfire.internal.cache.tier.sockets;
import com.gemstone.gemfire.DataSerializer;
+import com.gemstone.gemfire.cache.CacheFactory;
import com.gemstone.gemfire.internal.DataSerializableFixedID;
import com.gemstone.gemfire.internal.Version;
import com.gemstone.gemfire.internal.cache.EventID;
@@ -112,6 +113,17 @@ public class ClientInterestMessageImpl implements ClientMessage {
this.action = action;
}
+ public ClientInterestMessageImpl(ClientInterestMessageImpl message, Object keyOfInterest) {
+ this.eventId = new EventID(CacheFactory.getAnyInstance().getDistributedSystem());
+ this.regionName = message.regionName;
+ this.keyOfInterest = keyOfInterest;
+ this.interestType = message.interestType;
+ this.interestResultPolicy = message.interestResultPolicy;
+ this.isDurable = message.isDurable;
+ this.forUpdatesAsInvalidates = message.forUpdatesAsInvalidates;
+ this.action = message.action;
+ }
+
/**
* Default constructor.
*/
@@ -231,6 +243,10 @@ public class ClientInterestMessageImpl implements ClientMessage {
return this.interestType;
}
+ public byte getInterestResultPolicy() {
+ return this.interestResultPolicy;
+ }
+
public boolean getIsDurable() {
return this.isDurable;
}
@@ -265,6 +281,30 @@ public class ClientInterestMessageImpl implements ClientMessage {
public void setLatestValue(Object value){
}
+
+ public String toString() {
+ return new StringBuilder()
+ .append(getClass().getSimpleName())
+ .append("[")
+ .append("eventId=")
+ .append(this.eventId)
+ .append("; regionName=")
+ .append(this.regionName)
+ .append("; keyOfInterest=")
+ .append(this.keyOfInterest)
+ .append("; isDurable=")
+ .append(this.isDurable)
+ .append("; forUpdatesAsInvalidates=")
+ .append(this.forUpdatesAsInvalidates)
+ .append("; interestType=")
+ .append(this.interestType)
+ .append("; interestResultPolicy=")
+ .append(this.interestResultPolicy)
+ .append("; action=")
+ .append(this.action)
+ .append("]")
+ .toString();
+ }
@Override
public Version[] getSerializationVersions() {
http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/c065b6ae/geode-core/src/test/java/com/gemstone/gemfire/internal/cache/tier/sockets/CacheServerTestUtil.java
----------------------------------------------------------------------
diff --git a/geode-core/src/test/java/com/gemstone/gemfire/internal/cache/tier/sockets/CacheServerTestUtil.java b/geode-core/src/test/java/com/gemstone/gemfire/internal/cache/tier/sockets/CacheServerTestUtil.java
index 3d9c039..b0520f8 100755
--- a/geode-core/src/test/java/com/gemstone/gemfire/internal/cache/tier/sockets/CacheServerTestUtil.java
+++ b/geode-core/src/test/java/com/gemstone/gemfire/internal/cache/tier/sockets/CacheServerTestUtil.java
@@ -26,6 +26,7 @@ import java.net.URL;
import java.util.Enumeration;
import java.util.Iterator;
import java.util.LinkedList;
+import java.util.List;
import java.util.Properties;
import com.gemstone.gemfire.cache.AttributesFactory;
@@ -505,14 +506,19 @@ public class CacheServerTestUtil extends JUnit4DistributedTestCase {
this.arg = ee.getCallbackArgument();
this.type = type;
}
- @Override
+ public boolean isCreate() {
+ return this.type == TYPE_CREATE;
+ }
public String toString() {
return "EventWrapper: event=" + event + ", type=" + type;
}
}
public static class ControlListener extends CacheListenerAdapter implements Declarable {
- public final LinkedList events = new LinkedList();
+ public final LinkedList<EventWrapper> events = new LinkedList();
+ public final LinkedList<EntryEvent> createEvents = new LinkedList();
+ public final LinkedList<EntryEvent> updateEvents = new LinkedList();
+ public final LinkedList<EntryEvent> destroyEvents = new LinkedList();
public final Object CONTROL_LOCK = new Object();
//added to test creation of cache from xml
@@ -521,10 +527,18 @@ public class CacheServerTestUtil extends JUnit4DistributedTestCase {
}
public boolean waitWhileNotEnoughEvents(long sleepMs, int eventCount) {
+ return waitWhileNotEnoughEvents(sleepMs, eventCount, -1);
+ }
+
+ public boolean waitWhileNotEnoughEvents(long sleepMs, int eventCount, int eventType) {
+ return waitWhileNotEnoughEvents(sleepMs, eventCount, getEvents(eventType));
+ }
+
+ public boolean waitWhileNotEnoughEvents(long sleepMs, int eventCount, List eventsToCheck) {
long maxMillis = System.currentTimeMillis() + sleepMs;
synchronized(this.CONTROL_LOCK) {
try {
- while (this.events.size() < eventCount) {
+ while (eventsToCheck.size() < eventCount) {
long waitMillis = maxMillis - System.currentTimeMillis();
if (waitMillis < 10) {
break;
@@ -534,14 +548,33 @@ public class CacheServerTestUtil extends JUnit4DistributedTestCase {
} catch (InterruptedException abort) {
fail("interrupted");
}
- return !this.events.isEmpty();
+ return !eventsToCheck.isEmpty();
} // synchronized
}
+ public List getEvents(int eventType) {
+ List eventsToCheck = null;
+ switch (eventType) {
+ case TYPE_CREATE:
+ eventsToCheck = this.createEvents;
+ break;
+ case TYPE_UPDATE:
+ eventsToCheck = this.updateEvents;
+ break;
+ case TYPE_DESTROY:
+ eventsToCheck = this.destroyEvents;
+ break;
+ default:
+ eventsToCheck = this.events;
+ }
+ return eventsToCheck;
+ }
+
@Override
public void afterCreate(EntryEvent e) {
synchronized(this.CONTROL_LOCK) {
this.events.add(new EventWrapper(e, TYPE_CREATE));
+ this.createEvents.add(e);
this.CONTROL_LOCK.notifyAll();
}
}
@@ -550,6 +583,7 @@ public class CacheServerTestUtil extends JUnit4DistributedTestCase {
public void afterUpdate(EntryEvent e) {
synchronized(this.CONTROL_LOCK) {
this.events.add(new EventWrapper(e, TYPE_UPDATE));
+ this.updateEvents.add(e);
this.CONTROL_LOCK.notifyAll();
}
}
@@ -566,6 +600,7 @@ public class CacheServerTestUtil extends JUnit4DistributedTestCase {
public void afterDestroy(EntryEvent e) {
synchronized(this.CONTROL_LOCK) {
this.events.add(new EventWrapper(e, TYPE_DESTROY));
+ this.destroyEvents.add(e);
this.CONTROL_LOCK.notifyAll();
}
}
http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/c065b6ae/geode-cq/src/test/java/com/gemstone/gemfire/internal/cache/tier/sockets/DurableClientSimpleDUnitTest.java
----------------------------------------------------------------------
diff --git a/geode-cq/src/test/java/com/gemstone/gemfire/internal/cache/tier/sockets/DurableClientSimpleDUnitTest.java b/geode-cq/src/test/java/com/gemstone/gemfire/internal/cache/tier/sockets/DurableClientSimpleDUnitTest.java
index f2afb1f..7bfd1eb 100644
--- a/geode-cq/src/test/java/com/gemstone/gemfire/internal/cache/tier/sockets/DurableClientSimpleDUnitTest.java
+++ b/geode-cq/src/test/java/com/gemstone/gemfire/internal/cache/tier/sockets/DurableClientSimpleDUnitTest.java
@@ -16,10 +16,16 @@
*/
package com.gemstone.gemfire.internal.cache.tier.sockets;
+import static com.gemstone.gemfire.internal.cache.tier.sockets.CacheServerTestUtil.TYPE_CREATE;
import static com.gemstone.gemfire.test.dunit.Assert.*;
import java.util.Iterator;
+import java.util.concurrent.TimeUnit;
+import com.gemstone.gemfire.cache.ClientSession;
+import com.gemstone.gemfire.internal.cache.ha.HARegionQueue;
+import com.gemstone.gemfire.internal.cache.ha.HARegionQueueStats;
+import com.jayway.awaitility.Awaitility;
import org.junit.Ignore;
import org.junit.Test;
import org.junit.experimental.categories.Category;
@@ -100,37 +106,11 @@ public class DurableClientSimpleDUnitTest extends DurableClientTestCase {
// Publish some entries
final int numberOfEntries = 10;
- this.publisherClientVM.invoke(new CacheSerializableRunnable("Register interest") {
- @Override
- public void run2() throws CacheException {
- // Get the region
- Region region = CacheServerTestUtil.getCache().getRegion(regionName);
- assertNotNull(region);
+ publishEntries(numberOfEntries);
- // Publish some entries
- for (int i=0; i<numberOfEntries; i++) {
- String keyAndValue = String.valueOf(i);
- region.put(keyAndValue, keyAndValue);
- }
- }
- });
-
// Verify the durable client received the updates
- this.durableClientVM.invoke(new CacheSerializableRunnable("Verify updates") {
- @Override
- public void run2() throws CacheException {
- // Get the region
- Region region = CacheServerTestUtil.getCache().getRegion(regionName);
- assertNotNull(region);
+ verifyDurableClientEvents(this.durableClientVM, numberOfEntries);
- // Get the listener and wait for the appropriate number of events
- CacheServerTestUtil.ControlListener listener = (CacheServerTestUtil.ControlListener) region
- .getAttributes().getCacheListeners()[0];
- listener.waitWhileNotEnoughEvents(30000, numberOfEntries);
- assertEquals(numberOfEntries, listener.events.size());
- }
- });
-
// Stop the durable client
this.durableClientVM.invoke(() -> CacheServerTestUtil.closeCache());
@@ -288,37 +268,11 @@ public class DurableClientSimpleDUnitTest extends DurableClientTestCase {
// Publish some entries
final int numberOfEntries = 10;
- this.publisherClientVM.invoke(new CacheSerializableRunnable("Register interest") {
- @Override
- public void run2() throws CacheException {
- // Get the region
- Region region = CacheServerTestUtil.getCache().getRegion(regionName);
- assertNotNull(region);
-
- // Publish some entries
- for (int i=0; i<numberOfEntries; i++) {
- String keyAndValue = String.valueOf(i);
- region.put(keyAndValue, keyAndValue);
- }
- }
- });
+ publishEntries(numberOfEntries);
// Verify the durable client received the updates
- this.durableClientVM.invoke(new CacheSerializableRunnable("Verify updates") {
- @Override
- public void run2() throws CacheException {
- // Get the region
- Region region = CacheServerTestUtil.getCache().getRegion(regionName);
- assertNotNull(region);
+ verifyDurableClientEvents(this.durableClientVM, numberOfEntries);
- // Get the listener and wait for the appropriate number of events
- CacheServerTestUtil.ControlListener listener = (CacheServerTestUtil.ControlListener) region
- .getAttributes().getCacheListeners()[0];
- listener.waitWhileNotEnoughEvents(30000, numberOfEntries);
- assertEquals(numberOfEntries, listener.events.size());
- }
- });
-
// Stop the publisher client
this.publisherClientVM.invoke(() -> CacheServerTestUtil.closeCache());
@@ -467,20 +421,7 @@ public class DurableClientSimpleDUnitTest extends DurableClientTestCase {
// Publish some entries
final int numberOfEntries = 10;
- this.publisherClientVM.invoke(new CacheSerializableRunnable("Register interest") {
- @Override
- public void run2() throws CacheException {
- // Get the region
- Region region = CacheServerTestUtil.getCache().getRegion(regionName);
- assertNotNull(region);
-
- // Publish some entries
- for (int i=0; i<numberOfEntries; i++) {
- String keyAndValue = String.valueOf(i);
- region.put(keyAndValue, keyAndValue);
- }
- }
- });
+ publishEntries(numberOfEntries);
// Verify the durable client received the updates
this.durableClientVM.invoke(new CacheSerializableRunnable("Verify updates") {
@@ -519,20 +460,7 @@ public class DurableClientSimpleDUnitTest extends DurableClientTestCase {
});
// Publish some more entries
- this.publisherClientVM.invoke(new CacheSerializableRunnable("Register interest") {
- @Override
- public void run2() throws CacheException {
- // Get the region
- Region region = CacheServerTestUtil.getCache().getRegion(regionName);
- assertNotNull(region);
-
- // Publish some entries
- for (int i=0; i<numberOfEntries; i++) {
- String keyAndValue = String.valueOf(i);
- region.put(keyAndValue, keyAndValue);
- }
- }
- });
+ publishEntries(numberOfEntries);
// Re-start the durable client
this.durableClientVM.invoke(() -> CacheServerTestUtil.createCacheClient(getClientPool(NetworkUtils.getServerHostName(durableClientVM.getHost()), server1Port, server2Port, true), regionName, getClientDistributedSystemProperties(durableClientId), Boolean.TRUE));
@@ -682,53 +610,14 @@ public class DurableClientSimpleDUnitTest extends DurableClientTestCase {
// Publish some entries
final int numberOfEntries = 10;
- this.publisherClientVM.invoke(new CacheSerializableRunnable("Register interest") {
- @Override
- public void run2() throws CacheException {
- // Get the region
- Region region = CacheServerTestUtil.getCache().getRegion(regionName);
- assertNotNull(region);
-
- // Publish some entries
- for (int i=0; i<numberOfEntries; i++) {
- String keyAndValue = String.valueOf(i);
- region.put(keyAndValue, keyAndValue);
- }
- }
- });
+ publishEntries(numberOfEntries);
// Verify durable client 1 received the updates
- this.durableClientVM.invoke(new CacheSerializableRunnable("Verify updates") {
- @Override
- public void run2() throws CacheException {
- // Get the region
- Region region = CacheServerTestUtil.getCache().getRegion(regionName);
- assertNotNull(region);
-
- // Get the listener and wait for the appropriate number of events
- CacheServerTestUtil.ControlListener listener = (CacheServerTestUtil.ControlListener) region
- .getAttributes().getCacheListeners()[0];
- listener.waitWhileNotEnoughEvents(30000, numberOfEntries);
- assertEquals(numberOfEntries, listener.events.size());
- }
- });
+ verifyDurableClientEvents(this.durableClientVM, numberOfEntries);
// Verify durable client 2 received the updates
- durableClient2VM.invoke(new CacheSerializableRunnable("Verify updates") {
- @Override
- public void run2() throws CacheException {
- // Get the region
- Region region = CacheServerTestUtil.getCache().getRegion(regionName);
- assertNotNull(region);
+ verifyDurableClientEvents(durableClient2VM, numberOfEntries);
- // Get the listener and wait for the appropriate number of events
- CacheServerTestUtil.ControlListener listener = (CacheServerTestUtil.ControlListener) region
- .getAttributes().getCacheListeners()[0];
- listener.waitWhileNotEnoughEvents(30000, numberOfEntries);
- assertEquals(numberOfEntries, listener.events.size());
- }
- });
-
// ARB: Wait for queue ack to arrive at server.
try {
Thread.sleep(1000);
@@ -768,20 +657,7 @@ public class DurableClientSimpleDUnitTest extends DurableClientTestCase {
});
// Publish some more entries
- this.publisherClientVM.invoke(new CacheSerializableRunnable("Register interest") {
- @Override
- public void run2() throws CacheException {
- // Get the region
- Region region = CacheServerTestUtil.getCache().getRegion(regionName);
- assertNotNull(region);
-
- // Publish some entries
- for (int i=0; i<numberOfEntries; i++) {
- String keyAndValue = String.valueOf(i);
- region.put(keyAndValue, keyAndValue);
- }
- }
- });
+ publishEntries(numberOfEntries);
try {
Thread.sleep(1000);
@@ -830,36 +706,10 @@ public class DurableClientSimpleDUnitTest extends DurableClientTestCase {
});
// Verify durable client 1 received the updates held for it on the server
- this.durableClientVM.invoke(new CacheSerializableRunnable("Verify updates") {
- @Override
- public void run2() throws CacheException {
- // Get the region
- Region region = CacheServerTestUtil.getCache().getRegion(regionName);
- assertNotNull(region);
-
- // Get the listener and wait for the appropriate number of events
- CacheServerTestUtil.ControlListener listener = (CacheServerTestUtil.ControlListener) region
- .getAttributes().getCacheListeners()[0];
- listener.waitWhileNotEnoughEvents(30000, numberOfEntries);
- assertEquals(numberOfEntries, listener.events.size());
- }
- });
+ verifyDurableClientEvents(this.durableClientVM, numberOfEntries);
// Verify durable client 2 received the updates held for it on the server
- durableClient2VM.invoke(new CacheSerializableRunnable("Verify updates") {
- @Override
- public void run2() throws CacheException {
- // Get the region
- Region region = CacheServerTestUtil.getCache().getRegion(regionName);
- assertNotNull(region);
-
- // Get the listener and wait for the appropriate number of events
- CacheServerTestUtil.ControlListener listener = (CacheServerTestUtil.ControlListener) region
- .getAttributes().getCacheListeners()[0];
- listener.waitWhileNotEnoughEvents(30000, numberOfEntries);
- assertEquals(numberOfEntries, listener.events.size());
- }
- });
+ verifyDurableClientEvents(durableClient2VM, numberOfEntries);
// Stop durable client 1
this.durableClientVM.invoke(() -> CacheServerTestUtil.closeCache());
@@ -965,20 +815,7 @@ public class DurableClientSimpleDUnitTest extends DurableClientTestCase {
// Publish some entries
final int numberOfEntries = 10;
- this.publisherClientVM.invoke(new CacheSerializableRunnable("Register interest") {
- @Override
- public void run2() throws CacheException {
- // Get the region
- Region region = CacheServerTestUtil.getCache().getRegion(regionName);
- assertNotNull(region);
-
- // Publish some entries
- for (int i=0; i<numberOfEntries; i++) {
- String keyAndValue = String.valueOf(i);
- region.put(keyAndValue, keyAndValue);
- }
- }
- });
+ publishEntries(numberOfEntries);
try {
Thread.sleep(1000);
@@ -1050,20 +887,7 @@ public class DurableClientSimpleDUnitTest extends DurableClientTestCase {
assertEquals(server1HARegionQueueName, server2HARegionQueueName);
// Verify the durable client received the updates
- this.durableClientVM.invoke(new CacheSerializableRunnable("Verify updates") {
- @Override
- public void run2() throws CacheException {
- // Get the region
- Region region = CacheServerTestUtil.getCache().getRegion(regionName);
- assertNotNull(region);
-
- // Get the listener and wait for the appropriate number of events
- CacheServerTestUtil.ControlListener listener = (CacheServerTestUtil.ControlListener) region
- .getAttributes().getCacheListeners()[0];
- listener.waitWhileNotEnoughEvents(30000, numberOfEntries);
- assertEquals(numberOfEntries, listener.events.size());
- }
- });
+ verifyDurableClientEvents(this.durableClientVM, numberOfEntries);
// Stop the durable client
this.durableClientVM.invoke(() -> CacheServerTestUtil.closeCache());
@@ -1235,20 +1059,7 @@ public class DurableClientSimpleDUnitTest extends DurableClientTestCase {
// Publish some entries
final int numberOfEntries = 10;
- this.publisherClientVM.invoke(new CacheSerializableRunnable("publish updates") {
- @Override
- public void run2() throws CacheException {
- // Get the region
- Region region = CacheServerTestUtil.getCache().getRegion(regionName);
- assertNotNull(region);
-
- // Publish some entries
- for (int i=0; i<numberOfEntries; i++) {
- String keyAndValue = String.valueOf(i);
- region.put(keyAndValue, keyAndValue);
- }
- }
- });
+ publishEntries(numberOfEntries);
// Verify the durable client received the updates
this.durableClientVM.invoke(new CacheSerializableRunnable("Verify updates") {
@@ -1288,20 +1099,7 @@ public class DurableClientSimpleDUnitTest extends DurableClientTestCase {
});
// Publish some more entries
- this.publisherClientVM.invoke(new CacheSerializableRunnable("Publish additional updates") {
- @Override
- public void run2() throws CacheException {
- // Get the region
- Region region = CacheServerTestUtil.getCache().getRegion(regionName);
- assertNotNull(region);
-
- // Publish some entries
- for (int i=0; i<numberOfEntries; i++) {
- String keyAndValue = String.valueOf(i);
- region.put(keyAndValue, keyAndValue + "lkj");
- }
- }
- });
+ publishEntries(numberOfEntries);
this.publisherClientVM.invoke(() -> CacheServerTestUtil.closeCache());
@@ -1491,20 +1289,7 @@ public class DurableClientSimpleDUnitTest extends DurableClientTestCase {
// Publish some entries
final int numberOfEntries = 10;
- this.publisherClientVM.invoke(new CacheSerializableRunnable("publish updates") {
- @Override
- public void run2() throws CacheException {
- // Get the region
- Region region = CacheServerTestUtil.getCache().getRegion(regionName);
- assertNotNull(region);
-
- // Publish some entries
- for (int i=0; i<numberOfEntries; i++) {
- String keyAndValue = String.valueOf(i);
- region.put(keyAndValue, keyAndValue);
- }
- }
- });
+ publishEntries(numberOfEntries);
// Verify the durable client received the updates
this.durableClientVM.invoke(new CacheSerializableRunnable("Verify updates") {
@@ -3459,5 +3244,99 @@ public class DurableClientSimpleDUnitTest extends DurableClientTestCase {
// Stop server 2
this.server2VM.invoke(() -> CacheServerTestUtil.closeCache());
}
-
+
+ @Test
+ public void testDurableClientReceivedClientSessionInitialValue() {
+ // Start server 1
+ int server1Port = this.server1VM.invoke(() -> CacheServerTestUtil.createCacheServer(regionName, new Boolean(true)));
+
+ // Start server 2
+ int server2Port = this.server2VM.invoke(() -> CacheServerTestUtil.createCacheServer(regionName, new Boolean(true)));
+
+ // Start normal publisher client
+ this.publisherClientVM.invoke(() -> CacheServerTestUtil.createCacheClient(
+ getClientPool(NetworkUtils.getServerHostName(this.publisherClientVM.getHost()), server1Port, server2Port, false),
+ this.regionName));
+
+ // Create an entry
+ publishEntries(1);
+
+ // Start a durable client with the ControlListener
+ final String durableClientId = getName() + "_client";
+ final int durableClientTimeout = 60; // keep the client alive for 60 seconds
+ restartDurableClient(new Object[] {
+ getClientPool(NetworkUtils.getServerHostName(this.durableClientVM.getHost()),server1Port, server2Port, true),
+ regionName,
+ getClientDistributedSystemProperties(durableClientId, durableClientTimeout),
+ true
+ });
+
+ // Use ClientSession on the server to register interest in entry key on behalf of durable client
+ boolean server1IsPrimary=false, server2IsPrimary=false;
+ boolean registered = this.server1VM
+ .invoke(() -> DurableClientSimpleDUnitTest.registerInterestWithClientSession(durableClientId, this.regionName, String.valueOf(0)));
+ if (registered) {
+ server1IsPrimary = true;
+ } else {
+ registered = this.server2VM
+ .invoke(() -> DurableClientSimpleDUnitTest.registerInterestWithClientSession(durableClientId, this.regionName, String.valueOf(0)));
+ if (registered) {
+ server2IsPrimary = true;
+ } else {
+ fail("ClientSession interest registration failed to occur in either server.");
+ }
+ }
+
+ // Verify durable client received create event
+ verifyDurableClientEvents(this.durableClientVM, 1, TYPE_CREATE);
+
+ // Wait for QRM to be processed on the secondary
+ waitForEventsRemovedByQueueRemovalMessage(server1IsPrimary ? this.server2VM : this.server1VM, durableClientId, 2);
+
+ // Stop durable client
+ disconnectDurableClient(true);
+
+ // Restart durable client
+ restartDurableClient(new Object[] {
+ getClientPool(NetworkUtils.getServerHostName(this.durableClientVM.getHost()),server1Port, server2Port, true),
+ regionName,
+ getClientDistributedSystemProperties(durableClientId, durableClientTimeout),
+ true
+ });
+
+ // Verify durable client does not receive create event
+ verifyNoDurableClientEvents(this.durableClientVM, 1, TYPE_CREATE);
+
+ // Stop the durable client
+ this.durableClientVM.invoke(() -> CacheServerTestUtil.closeCache());
+
+ // Stop server 1
+ this.server1VM.invoke(() -> CacheServerTestUtil.closeCache());
+
+ // Stop server 2
+ this.server2VM.invoke(() -> CacheServerTestUtil.closeCache());
+ }
+
+ public static boolean registerInterestWithClientSession(String durableClientId, String regionName, Object keyOfInterest) {
+ ClientSession session = getBridgeServer().getClientSession(durableClientId);
+ boolean registered = false;
+ if (session.isPrimary()) {
+ session.registerInterest(regionName, keyOfInterest, InterestResultPolicy.KEYS_VALUES, true, true);
+ registered = true;
+ }
+ return registered;
+ }
+
+ private void waitForEventsRemovedByQueueRemovalMessage(VM secondaryServerVM, final String durableClientId, final int numEvents) {
+ secondaryServerVM.invoke(() -> DurableClientSimpleDUnitTest.waitForEventsRemovedByQueueRemovalMessage(durableClientId, numEvents));
+ }
+
+ private static void waitForEventsRemovedByQueueRemovalMessage(String durableClientId, final int numEvents) {
+ CacheClientNotifier ccn = CacheClientNotifier.getInstance();
+ CacheClientProxy ccp = ccn.getClientProxy(durableClientId);
+ HARegionQueue harq = ccp.getHARegionQueue();
+ HARegionQueueStats harqStats = harq.getStatistics();
+ Awaitility.await().atMost(10, TimeUnit.SECONDS).until(() -> assertEquals("Expected queue removal messages: " +
+ numEvents + " but actual messages: " + harqStats.getEventsRemovedByQrm(), numEvents, harqStats.getEventsRemovedByQrm()));
+ }
}
http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/c065b6ae/geode-cq/src/test/java/com/gemstone/gemfire/internal/cache/tier/sockets/DurableClientTestCase.java
----------------------------------------------------------------------
diff --git a/geode-cq/src/test/java/com/gemstone/gemfire/internal/cache/tier/sockets/DurableClientTestCase.java b/geode-cq/src/test/java/com/gemstone/gemfire/internal/cache/tier/sockets/DurableClientTestCase.java
index cc54a47..b1dcc58 100755
--- a/geode-cq/src/test/java/com/gemstone/gemfire/internal/cache/tier/sockets/DurableClientTestCase.java
+++ b/geode-cq/src/test/java/com/gemstone/gemfire/internal/cache/tier/sockets/DurableClientTestCase.java
@@ -594,19 +594,7 @@ public class DurableClientTestCase extends JUnit4DistributedTestCase {
// Publish some entries
final int numberOfEntries = 1;
- this.publisherClientVM.invoke(new CacheSerializableRunnable("Publish entries") {
- public void run2() throws CacheException {
- // Get the region
- Region region = CacheServerTestUtil.getCache().getRegion(regionName);
- assertNotNull(region);
-
- // Publish some entries
- for (int i=0; i<numberOfEntries; i++) {
- String keyAndValue = String.valueOf(i);
- region.put(keyAndValue, keyAndValue);
- }
- }
- });
+ publishEntries(numberOfEntries);
// Verify the durable client received the updates
this.verifyListenerUpdates(numberOfEntries);
@@ -639,20 +627,8 @@ public class DurableClientTestCase extends JUnit4DistributedTestCase {
});
// Publish some more entries
- this.publisherClientVM.invoke(new CacheSerializableRunnable("Register interest") {
- public void run2() throws CacheException {
- // Get the region
- Region region = CacheServerTestUtil.getCache().getRegion(regionName);
- assertNotNull(region);
+ publishEntries(numberOfEntries);
- // Publish some entries
- for (int i=0; i<numberOfEntries; i++) {
- String keyAndValue = String.valueOf(i);
- region.put(keyAndValue, keyAndValue);
- }
- }
- });
-
try {
Thread.sleep(1000);
} catch (InterruptedException ex) {
@@ -722,7 +698,23 @@ public class DurableClientTestCase extends JUnit4DistributedTestCase {
// Stop the server
this.server1VM.invoke(() -> CacheServerTestUtil.closeCache());
}
-
+
+ protected void publishEntries(final int numberOfEntries) {
+ this.publisherClientVM.invoke(new CacheSerializableRunnable("Publish entries") {
+ public void run2() throws CacheException {
+ // Get the region
+ Region region = CacheServerTestUtil.getCache().getRegion(regionName);
+ assertNotNull(region);
+
+ // Publish some entries
+ for (int i=0; i<numberOfEntries; i++) {
+ String keyAndValue = String.valueOf(i);
+ region.put(keyAndValue, keyAndValue);
+ }
+ }
+ });
+ }
+
/**
* Test that a durable client correctly receives updates after it reconnects.
*/
@@ -763,19 +755,7 @@ public class DurableClientTestCase extends JUnit4DistributedTestCase {
// Publish some entries
final int numberOfEntries = 1;
- this.publisherClientVM.invoke(new CacheSerializableRunnable("Publish entries") {
- public void run2() throws CacheException {
- // Get the region
- Region region = CacheServerTestUtil.getCache().getRegion(regionName);
- assertNotNull(region);
-
- // Publish some entries
- for (int i=0; i<numberOfEntries; i++) {
- String keyAndValue = String.valueOf(i);
- region.put(keyAndValue, keyAndValue);
- }
- }
- });
+ publishEntries(numberOfEntries);
// Verify the durable client received the updates
this.verifyListenerUpdates(numberOfEntries);
@@ -1034,19 +1014,7 @@ public class DurableClientTestCase extends JUnit4DistributedTestCase {
});
// Verify the durable client received the updates
- this.durableClientVM.invoke(new CacheSerializableRunnable("Verify updates") {
- public void run2() throws CacheException {
- // Get the region
- Region region = CacheServerTestUtil.getCache().getRegion(regionName);
- assertNotNull(region);
-
- // Get the listener and wait for the appropriate number of events
- CacheServerTestUtil.ControlListener listener = (CacheServerTestUtil.ControlListener) region
- .getAttributes().getCacheListeners()[0];
- listener.waitWhileNotEnoughEvents(30000, numberOfEntries);
- assertEquals(numberOfEntries, listener.events.size());
- }
- });
+ verifyDurableClientEvents(this.durableClientVM, numberOfEntries);
// Stop the durable client
this.durableClientVM.invoke(() -> CacheServerTestUtil.closeCache());
@@ -1058,6 +1026,34 @@ public class DurableClientTestCase extends JUnit4DistributedTestCase {
this.server1VM.invoke(() -> CacheServerTestUtil.closeCache());
}
+ protected void verifyDurableClientEvents(VM durableClientVm, final int numberOfEntries) {
+ verifyDurableClientEvents(durableClientVm, numberOfEntries, -1);
+ }
+
+ protected void verifyDurableClientEvents(VM durableClientVm, final int numberOfEntries, final int eventType) {
+ verifyDurableClientEvents(durableClientVm, numberOfEntries, eventType, numberOfEntries);
+ }
+
+ protected void verifyNoDurableClientEvents(VM durableClientVm, final int numberOfEntries, final int eventType) {
+ verifyDurableClientEvents(durableClientVm, numberOfEntries, eventType, 0);
+ }
+
+ private void verifyDurableClientEvents(VM durableClientVm, final int numberOfEntries, final int eventType, final int expectedNumberOfEvents) {
+ durableClientVm.invoke(new CacheSerializableRunnable("Verify updates") {
+ public void run2() throws CacheException {
+ // Get the region
+ Region region = CacheServerTestUtil.getCache().getRegion(regionName);
+ assertNotNull(region);
+
+ // Get the listener and wait for the appropriate number of events
+ CacheServerTestUtil.ControlListener listener = (CacheServerTestUtil.ControlListener) region
+ .getAttributes().getCacheListeners()[0];
+ listener.waitWhileNotEnoughEvents(30000, numberOfEntries, eventType);
+ assertEquals(expectedNumberOfEvents, listener.getEvents(eventType).size());
+ }
+ });
+ }
+
@Ignore("TODO: This test is failing inconsistently, see bug 51258")
@Test
public void testDurableNonHAFailover() throws InterruptedException {
@@ -1135,19 +1131,7 @@ public class DurableClientTestCase extends JUnit4DistributedTestCase {
// Publish some entries
final int numberOfEntries = 1;
- this.publisherClientVM.invoke(new CacheSerializableRunnable("Publish entries") {
- public void run2() throws CacheException {
- // Get the region
- Region region = CacheServerTestUtil.getCache().getRegion(regionName);
- assertNotNull(region);
-
- // Publish some entries
- for (int i=0; i<numberOfEntries; i++) {
- String keyAndValue = String.valueOf(i);
- region.put(keyAndValue, keyAndValue);
- }
- }
- });
+ publishEntries(numberOfEntries);
// Verify the durable client received the updates
this.verifyListenerUpdates(numberOfEntries);
@@ -1164,19 +1148,7 @@ public class DurableClientTestCase extends JUnit4DistributedTestCase {
this.disconnectDurableClient(true);
// Publish updates during client downtime
- this.publisherClientVM.invoke(new CacheSerializableRunnable("Publish entries") {
- public void run2() throws CacheException {
- // Get the region
- Region region = CacheServerTestUtil.getCache().getRegion(regionName);
- assertNotNull(region);
-
- // Publish some entries
- for (int i=0; i<numberOfEntries; i++) {
- String keyAndValue = String.valueOf(i);
- region.put(keyAndValue, keyAndValue);
- }
- }
- });
+ publishEntries(numberOfEntries);
// Re-start the durable client that is kept alive on the server
@@ -1322,19 +1294,7 @@ public class DurableClientTestCase extends JUnit4DistributedTestCase {
// Publish some entries
final int numberOfEntries = 1;
- this.publisherClientVM.invoke(new CacheSerializableRunnable("Publish entries") {
- public void run2() throws CacheException {
- // Get the region
- Region region = CacheServerTestUtil.getCache().getRegion(regionName);
- assertNotNull(region);
-
- // Publish some entries
- for (int i=0; i<numberOfEntries; i++) {
- String keyAndValue = String.valueOf(i);
- region.put(keyAndValue, keyAndValue);
- }
- }
- });
+ publishEntries(numberOfEntries);
try {
java.lang.Thread.sleep(10000);
@@ -1365,19 +1325,7 @@ public class DurableClientTestCase extends JUnit4DistributedTestCase {
this.server1VM.invoke(() -> CacheServerTestUtil.closeCache());
// Publish updates during client downtime
- this.publisherClientVM.invoke(new CacheSerializableRunnable("Publish entries") {
- public void run2() throws CacheException {
- // Get the region
- Region region = CacheServerTestUtil.getCache().getRegion(regionName);
- assertNotNull(region);
-
- // Publish some entries
- for (int i=0; i<numberOfEntries; i++) {
- String keyAndValue = String.valueOf(i);
- region.put(keyAndValue, keyAndValue);
- }
- }
- });
+ publishEntries(numberOfEntries);
// Re-start the durable client that is kept alive on the server
this.restartDurableClient(new Object[] {
[02/10] incubator-geode git commit: GEODE-1586: Re-arranged the
validation sequence in the test case. * Validate that the receiver region
side before validating that the sender's queues are drained. * This gives the
sender's queues additional time to d
Posted by ji...@apache.org.
GEODE-1586: Re-arranged the validation sequence in the test case.
* Validate that the receiver region side before validating that the sender's queues are drained.
* This gives the sender's queues additional time to drain.
* size() in CustomEntryConcurrentHashMap is written such that if the counts do not change in two iterations, that value is returned as size.
* This size() will not be always consistent.
* Only the test can be modified to ensure that the queues get enough time to drain out.
This closes #189
Project: http://git-wip-us.apache.org/repos/asf/incubator-geode/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-geode/commit/ff2637d7
Tree: http://git-wip-us.apache.org/repos/asf/incubator-geode/tree/ff2637d7
Diff: http://git-wip-us.apache.org/repos/asf/incubator-geode/diff/ff2637d7
Branch: refs/heads/feature/GEODE-1571
Commit: ff2637d7aeadd0beda581d5c2422803f167021e1
Parents: c065b6a
Author: nabarun <nn...@pivotal.io>
Authored: Thu Jun 30 10:47:16 2016 -0700
Committer: nabarun <nn...@pivotal.io>
Committed: Wed Jul 6 09:36:23 2016 -0700
----------------------------------------------------------------------
...oncurrentParallelGatewaySenderDUnitTest.java | 22 +++++++++++++-------
1 file changed, 14 insertions(+), 8 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/ff2637d7/geode-wan/src/test/java/com/gemstone/gemfire/internal/cache/wan/concurrent/ConcurrentParallelGatewaySenderDUnitTest.java
----------------------------------------------------------------------
diff --git a/geode-wan/src/test/java/com/gemstone/gemfire/internal/cache/wan/concurrent/ConcurrentParallelGatewaySenderDUnitTest.java b/geode-wan/src/test/java/com/gemstone/gemfire/internal/cache/wan/concurrent/ConcurrentParallelGatewaySenderDUnitTest.java
index 5790a8d..ee9edf8 100644
--- a/geode-wan/src/test/java/com/gemstone/gemfire/internal/cache/wan/concurrent/ConcurrentParallelGatewaySenderDUnitTest.java
+++ b/geode-wan/src/test/java/com/gemstone/gemfire/internal/cache/wan/concurrent/ConcurrentParallelGatewaySenderDUnitTest.java
@@ -16,6 +16,7 @@
*/
package com.gemstone.gemfire.internal.cache.wan.concurrent;
+import com.jayway.awaitility.Awaitility;
import org.junit.experimental.categories.Category;
import org.junit.Test;
@@ -40,6 +41,7 @@ import com.gemstone.gemfire.test.dunit.Wait;
import java.net.SocketException;
import java.util.Set;
+import java.util.concurrent.TimeUnit;
/**
* Test the functionality of ParallelGatewaySender with multiple dispatchers.
@@ -621,29 +623,33 @@ public class ConcurrentParallelGatewaySenderDUnitTest extends WANTestBase {
getTestMethodName() + "_PR", null, 1, 100, isOffHeap() ));
AsyncInvocation inv1 = vm7.invokeAsync(() -> WANTestBase.doPuts( getTestMethodName() + "_PR", 5000 ));
- Wait.pause(500);
+ vm2.invoke(() -> Awaitility.await().atMost(30000, TimeUnit.MILLISECONDS).until(() ->
+ assertEquals("Failure in waiting for at least 10 events to be received by the receiver",
+ true, (getRegionSize(getTestMethodName() + "_PR") > 10 ))));
AsyncInvocation inv2 = vm4.invokeAsync(() -> WANTestBase.killSender());
AsyncInvocation inv3 = vm6.invokeAsync(() -> WANTestBase.doPuts( getTestMethodName() + "_PR", 10000 ));
- Wait.pause(1500);
+ vm2.invoke(() -> Awaitility.await().atMost(30000, TimeUnit.MILLISECONDS).until(() ->
+ assertEquals("Failure in waiting for additional 2000 events to be received by the receiver ",
+ true,getRegionSize(getTestMethodName() + "_PR") > 7000 )));
AsyncInvocation inv4 = vm5.invokeAsync(() -> WANTestBase.killSender());
inv1.join();
inv2.join();
inv3.join();
inv4.join();
-
+
vm6.invoke(() -> WANTestBase.validateRegionSize(
getTestMethodName() + "_PR", 10000 ));
vm7.invoke(() -> WANTestBase.validateRegionSize(
getTestMethodName() + "_PR", 10000 ));
+
+ vm2.invoke(() -> WANTestBase.validateRegionSize(
+ getTestMethodName() + "_PR", 10000 ));
+ vm3.invoke(() -> WANTestBase.validateRegionSize(
+ getTestMethodName() + "_PR", 10000 ));
//verify all buckets drained on the sender nodes that up and running.
vm6.invoke(() -> WANTestBase.validateParallelSenderQueueAllBucketsDrained("ln"));
vm7.invoke(() -> WANTestBase.validateParallelSenderQueueAllBucketsDrained("ln"));
-
- vm2.invoke(() -> WANTestBase.validateRegionSize(
- getTestMethodName() + "_PR", 10000 ));
- vm3.invoke(() -> WANTestBase.validateRegionSize(
- getTestMethodName() + "_PR", 10000 ));
}
@Test
[07/10] incubator-geode git commit: Update init and close on
SecurityManager interface
Posted by ji...@apache.org.
Update init and close on SecurityManager interface
* Add close() to SecurityManager interface
* Change init(Properties) to have default empty impl
* Create integration test for init and close
Project: http://git-wip-us.apache.org/repos/asf/incubator-geode/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-geode/commit/0fd2288e
Tree: http://git-wip-us.apache.org/repos/asf/incubator-geode/tree/0fd2288e
Diff: http://git-wip-us.apache.org/repos/asf/incubator-geode/diff/0fd2288e
Branch: refs/heads/feature/GEODE-1571
Commit: 0fd2288ecda79f1670553f3198e0ae4aad5e36a6
Parents: 8a26ac0
Author: gmeilen <gr...@gmail.com>
Authored: Wed Jul 6 14:56:26 2016 -0700
Committer: gmeilen <gr...@gmail.com>
Committed: Wed Jul 6 14:57:32 2016 -0700
----------------------------------------------------------------------
.../internal/cache/GemFireCacheImpl.java | 4 +-
.../internal/security/GeodeSecurityUtil.java | 11 ++
.../gemfire/security/SecurityManager.java | 4 +-
...edSecurityCacheLifecycleIntegrationTest.java | 104 +++++++++++++++++++
4 files changed, 121 insertions(+), 2 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/0fd2288e/geode-core/src/main/java/com/gemstone/gemfire/internal/cache/GemFireCacheImpl.java
----------------------------------------------------------------------
diff --git a/geode-core/src/main/java/com/gemstone/gemfire/internal/cache/GemFireCacheImpl.java b/geode-core/src/main/java/com/gemstone/gemfire/internal/cache/GemFireCacheImpl.java
index 13e0602..567f377 100755
--- a/geode-core/src/main/java/com/gemstone/gemfire/internal/cache/GemFireCacheImpl.java
+++ b/geode-core/src/main/java/com/gemstone/gemfire/internal/cache/GemFireCacheImpl.java
@@ -147,6 +147,7 @@ import com.gemstone.gemfire.internal.logging.LoggingThreadGroup;
import com.gemstone.gemfire.internal.logging.log4j.LocalizedMessage;
import com.gemstone.gemfire.internal.offheap.MemoryAllocator;
import com.gemstone.gemfire.internal.process.ClusterConfigurationNotAvailableException;
+import com.gemstone.gemfire.internal.security.GeodeSecurityUtil;
import com.gemstone.gemfire.internal.sequencelog.SequenceLoggerImpl;
import com.gemstone.gemfire.internal.tcp.ConnectionTable;
import com.gemstone.gemfire.internal.util.concurrent.FutureResult;
@@ -1898,7 +1899,8 @@ public class GemFireCacheImpl implements InternalCache, ClientCache, HasCachePer
return;
}
final boolean isDebugEnabled = logger.isDebugEnabled();
-
+ GeodeSecurityUtil.close(system.getConfig().getSecurityProps());
+
synchronized (GemFireCacheImpl.class) {
// bugfix for bug 36512 "GemFireCache.close is not thread safe"
// ALL CODE FOR CLOSE SHOULD NOW BE UNDER STATIC SYNCHRONIZATION
http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/0fd2288e/geode-core/src/main/java/com/gemstone/gemfire/internal/security/GeodeSecurityUtil.java
----------------------------------------------------------------------
diff --git a/geode-core/src/main/java/com/gemstone/gemfire/internal/security/GeodeSecurityUtil.java b/geode-core/src/main/java/com/gemstone/gemfire/internal/security/GeodeSecurityUtil.java
index 048b8ba..ff32f92 100644
--- a/geode-core/src/main/java/com/gemstone/gemfire/internal/security/GeodeSecurityUtil.java
+++ b/geode-core/src/main/java/com/gemstone/gemfire/internal/security/GeodeSecurityUtil.java
@@ -337,6 +337,17 @@ public class GeodeSecurityUtil {
}
+ public static void close(Properties securityProps) {
+ if (securityProps != null) {
+ String customAuthenticator = securityProps.getProperty(SECURITY_MANAGER);
+ Object authenticatorObject = getObject(customAuthenticator);
+ if (authenticatorObject != null && authenticatorObject instanceof SecurityManager) {
+ ((SecurityManager) authenticatorObject).close();
+ }
+ }
+ return;
+ }
+
public static Object postProcess(String regionPath, Object key, Object result){
if(postProcessor == null)
return result;
http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/0fd2288e/geode-core/src/main/java/com/gemstone/gemfire/security/SecurityManager.java
----------------------------------------------------------------------
diff --git a/geode-core/src/main/java/com/gemstone/gemfire/security/SecurityManager.java b/geode-core/src/main/java/com/gemstone/gemfire/security/SecurityManager.java
index b19e5a8..eff27ae 100644
--- a/geode-core/src/main/java/com/gemstone/gemfire/security/SecurityManager.java
+++ b/geode-core/src/main/java/com/gemstone/gemfire/security/SecurityManager.java
@@ -22,11 +22,13 @@ import java.util.Properties;
public interface SecurityManager {
- void init(Properties securityProps);
+ default void init(Properties securityProps) {}
Principal authenticate(Properties props) throws AuthenticationFailedException;
default boolean authorize(Principal principal, GeodePermission permission) {
return true;
}
+
+ default void close() {}
}
http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/0fd2288e/geode-core/src/test/java/com/gemstone/gemfire/security/IntegratedSecurityCacheLifecycleIntegrationTest.java
----------------------------------------------------------------------
diff --git a/geode-core/src/test/java/com/gemstone/gemfire/security/IntegratedSecurityCacheLifecycleIntegrationTest.java b/geode-core/src/test/java/com/gemstone/gemfire/security/IntegratedSecurityCacheLifecycleIntegrationTest.java
new file mode 100644
index 0000000..96a4a51
--- /dev/null
+++ b/geode-core/src/test/java/com/gemstone/gemfire/security/IntegratedSecurityCacheLifecycleIntegrationTest.java
@@ -0,0 +1,104 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.gemstone.gemfire.security;
+
+import static com.gemstone.gemfire.distributed.ConfigurationProperties.*;
+import static org.assertj.core.api.Assertions.*;
+
+import java.security.Principal;
+import java.util.Properties;
+
+import com.gemstone.gemfire.cache.Cache;
+import com.gemstone.gemfire.cache.CacheFactory;
+import com.gemstone.gemfire.test.junit.categories.IntegrationTest;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.experimental.categories.Category;
+
+@Category(IntegrationTest.class)
+public class IntegratedSecurityCacheLifecycleIntegrationTest {
+
+ private static SpySecurityManager spySecurityManager;
+
+ private Properties securityProps;
+ private Cache cache;
+
+ @Before
+ public void before() {
+ securityProps = new Properties();
+ securityProps.setProperty(SECURITY_MANAGER, SpySecurityManager.class.getName()+".create");
+
+ spySecurityManager = new SpySecurityManager();
+
+ Properties props = new Properties();
+ props.putAll(securityProps);
+ props.setProperty(MCAST_PORT, "0");
+ props.setProperty(LOCATORS, "");
+
+ cache = new CacheFactory(props).create();
+ }
+
+ @After
+ public void after() {
+ if (cache != null && !cache.isClosed()) {
+ cache.close();
+ }
+ }
+
+ @Test
+ public void initAndCloseTest () {
+ assertThat(spySecurityManager.initInvoked).isEqualTo(1);
+ assertThat(spySecurityManager.securityPropsInvoked).isEqualTo(securityProps);
+ cache.close();
+ assertThat(spySecurityManager.closeInvoked).isEqualTo(1);
+ }
+
+ public static class SpySecurityManager implements SecurityManager {
+
+ private int initInvoked = 0;
+ private int closeInvoked = 0;
+ private Properties securityPropsInvoked;
+
+ public static SecurityManager create() {
+ return spySecurityManager;
+ }
+
+ @Override
+ public void init(final Properties securityProps) {
+ initInvoked++;
+ this.securityPropsInvoked = securityProps;
+ }
+
+ @Override
+ public Principal authenticate(final Properties props) throws AuthenticationFailedException {
+ return null;
+ }
+
+ @Override
+ public boolean authorize(final Principal principal, final GeodePermission permission) {
+ return false;
+ }
+
+ @Override
+ public void close() {
+ closeInvoked++;
+ }
+ }
+}
[10/10] incubator-geode git commit: Merge branch 'develop' into
feature/GEODE-1571
Posted by ji...@apache.org.
Merge branch 'develop' into feature/GEODE-1571
Project: http://git-wip-us.apache.org/repos/asf/incubator-geode/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-geode/commit/e4d79df7
Tree: http://git-wip-us.apache.org/repos/asf/incubator-geode/tree/e4d79df7
Diff: http://git-wip-us.apache.org/repos/asf/incubator-geode/diff/e4d79df7
Branch: refs/heads/feature/GEODE-1571
Commit: e4d79df78bdb482f66a95ee7c3b02e5ba42c9dcb
Parents: c67f8b7 2ab9d11
Author: Jinmei Liao <ji...@pivotal.io>
Authored: Wed Jul 6 15:58:30 2016 -0700
Committer: Jinmei Liao <ji...@pivotal.io>
Committed: Wed Jul 6 15:58:30 2016 -0700
----------------------------------------------------------------------
geode-assembly/build.gradle | 4 +-
.../cache/tier/sockets/CacheClientProxy.java | 105 +++---
.../tier/sockets/ClientInterestMessageImpl.java | 40 +++
.../internal/offheap/FreeListManager.java | 2 +-
.../CreateAlterDestroyRegionCommands.java | 33 +-
.../GemFireDeadlockDetectorDUnitTest.java | 1 +
.../cache/tier/sockets/CacheServerTestUtil.java | 43 ++-
...eateAlterDestroyRegionCommandsDUnitTest.java | 78 ++--
.../sockets/DurableClientSimpleDUnitTest.java | 357 ++++++-------------
.../tier/sockets/DurableClientTestCase.java | 158 +++-----
...oncurrentParallelGatewaySenderDUnitTest.java | 22 +-
11 files changed, 405 insertions(+), 438 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/e4d79df7/geode-core/src/main/java/com/gemstone/gemfire/internal/cache/tier/sockets/CacheClientProxy.java
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/e4d79df7/geode-core/src/main/java/com/gemstone/gemfire/management/internal/cli/commands/CreateAlterDestroyRegionCommands.java
----------------------------------------------------------------------
diff --cc geode-core/src/main/java/com/gemstone/gemfire/management/internal/cli/commands/CreateAlterDestroyRegionCommands.java
index dcaca19,b1ad27d..e0de649
--- a/geode-core/src/main/java/com/gemstone/gemfire/management/internal/cli/commands/CreateAlterDestroyRegionCommands.java
+++ b/geode-core/src/main/java/com/gemstone/gemfire/management/internal/cli/commands/CreateAlterDestroyRegionCommands.java
@@@ -78,13 -85,7 +83,9 @@@ import com.gemstone.gemfire.management.
import com.gemstone.gemfire.management.internal.configuration.SharedConfigurationWriter;
import com.gemstone.gemfire.management.internal.configuration.domain.XmlEntity;
import com.gemstone.gemfire.management.internal.security.ResourceOperation;
+import com.gemstone.gemfire.security.GeodePermission.Operation;
+import com.gemstone.gemfire.security.GeodePermission.Resource;
- import org.springframework.shell.core.annotation.CliAvailabilityIndicator;
- import org.springframework.shell.core.annotation.CliCommand;
- import org.springframework.shell.core.annotation.CliOption;
-
/**
*
* @since GemFire 7.0
[08/10] incubator-geode git commit: GEODE-1571: use a different
method for data serialization and fix the tests
Posted by ji...@apache.org.
GEODE-1571: use a different method for data serialization and fix the tests
Project: http://git-wip-us.apache.org/repos/asf/incubator-geode/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-geode/commit/1a4bd5d4
Tree: http://git-wip-us.apache.org/repos/asf/incubator-geode/tree/1a4bd5d4
Diff: http://git-wip-us.apache.org/repos/asf/incubator-geode/diff/1a4bd5d4
Branch: refs/heads/feature/GEODE-1571
Commit: 1a4bd5d4ec64126dcb70d69a26589cc461bacb17
Parents: 8a26ac0
Author: Jinmei Liao <ji...@pivotal.io>
Authored: Wed Jul 6 15:47:46 2016 -0700
Committer: Jinmei Liao <ji...@pivotal.io>
Committed: Wed Jul 6 15:47:46 2016 -0700
----------------------------------------------------------------------
.../internal/AbstractDistributionConfig.java | 21 ++++++++-----
.../cache/tier/sockets/CacheClientProxy.java | 17 ++++++-----
.../internal/DistributionConfigJUnitTest.java | 32 +++++++++++---------
...urityNoShowValue1PostProcessorDUnitTest.java | 4 +++
...ntegratedSecurityPostProcessorDUnitTest.java | 4 +++
5 files changed, 50 insertions(+), 28 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/1a4bd5d4/geode-core/src/main/java/com/gemstone/gemfire/distributed/internal/AbstractDistributionConfig.java
----------------------------------------------------------------------
diff --git a/geode-core/src/main/java/com/gemstone/gemfire/distributed/internal/AbstractDistributionConfig.java b/geode-core/src/main/java/com/gemstone/gemfire/distributed/internal/AbstractDistributionConfig.java
index 01c893f..fdda8a9 100644
--- a/geode-core/src/main/java/com/gemstone/gemfire/distributed/internal/AbstractDistributionConfig.java
+++ b/geode-core/src/main/java/com/gemstone/gemfire/distributed/internal/AbstractDistributionConfig.java
@@ -16,6 +16,19 @@
*/
package com.gemstone.gemfire.distributed.internal;
+import static com.gemstone.gemfire.distributed.ConfigurationProperties.*;
+
+import java.lang.reflect.Method;
+import java.net.InetAddress;
+import java.net.UnknownHostException;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.StringTokenizer;
+
import com.gemstone.gemfire.InternalGemFireException;
import com.gemstone.gemfire.InvalidValueException;
import com.gemstone.gemfire.UnmodifiableException;
@@ -27,13 +40,6 @@ import com.gemstone.gemfire.internal.i18n.LocalizedStrings;
import com.gemstone.gemfire.internal.logging.LogWriterImpl;
import com.gemstone.gemfire.memcached.GemFireMemcachedServer;
-import java.lang.reflect.Method;
-import java.net.InetAddress;
-import java.net.UnknownHostException;
-import java.util.*;
-
-import static com.gemstone.gemfire.distributed.ConfigurationProperties.*;
-
/**
* Provides an implementation of <code>DistributionConfig</code> that
* knows how to read the configuration file.
@@ -1125,6 +1131,7 @@ public abstract class AbstractDistributionConfig
m.put(DISTRIBUTED_TRANSACTIONS, "Flag to indicate whether all transactions including JTA should be distributed transactions. Default is false, meaning colocated transactions.");
m.put(SECURITY_SHIRO_INIT, "The name of the shiro configuration file in the classpath, e.g. shiro.ini");
+ m.put(SECURITY_MANAGER, "User defined fully qualified method name implementing SecurityManager interface for integrated security. Defaults to \"{0}\". Legal values can be any \"method name\" of a static method that is present in the classpath.");
dcAttDescriptions = Collections.unmodifiableMap(m);
http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/1a4bd5d4/geode-core/src/main/java/com/gemstone/gemfire/internal/cache/tier/sockets/CacheClientProxy.java
----------------------------------------------------------------------
diff --git a/geode-core/src/main/java/com/gemstone/gemfire/internal/cache/tier/sockets/CacheClientProxy.java b/geode-core/src/main/java/com/gemstone/gemfire/internal/cache/tier/sockets/CacheClientProxy.java
index 23b7bde..5aac686 100755
--- a/geode-core/src/main/java/com/gemstone/gemfire/internal/cache/tier/sockets/CacheClientProxy.java
+++ b/geode-core/src/main/java/com/gemstone/gemfire/internal/cache/tier/sockets/CacheClientProxy.java
@@ -47,6 +47,7 @@ import org.apache.shiro.util.ThreadState;
import com.gemstone.gemfire.CancelException;
import com.gemstone.gemfire.DataSerializer;
+import com.gemstone.gemfire.GemFireIOException;
import com.gemstone.gemfire.StatisticsFactory;
import com.gemstone.gemfire.cache.Cache;
import com.gemstone.gemfire.cache.CacheClosedException;
@@ -108,6 +109,7 @@ import com.gemstone.gemfire.internal.logging.log4j.LocalizedMessage;
import com.gemstone.gemfire.internal.logging.log4j.LogMarker;
import com.gemstone.gemfire.internal.security.AuthorizeRequestPP;
import com.gemstone.gemfire.internal.security.GeodeSecurityUtil;
+import com.gemstone.gemfire.internal.util.BlobHelper;
import com.gemstone.gemfire.security.AccessControl;
/**
@@ -1655,15 +1657,16 @@ public class CacheClientProxy implements ClientSession {
// post process
Object oldValue = clientMessage.getValue();
if(oldValue instanceof byte[]){
- EntryEventImpl.deserialize((byte[])oldValue);
- Object newValue = GeodeSecurityUtil.postProcess(clientMessage.getRegionName(),
- clientMessage.getKeyOfInterest(),
- EntryEventImpl.deserialize((byte[])oldValue));
- clientMessage.setLatestValue(EntryEventImpl.serialize(newValue));
+ Object newValue = GeodeSecurityUtil.postProcess(clientMessage.getRegionName(), clientMessage.getKeyOfInterest(),
+ EntryEventImpl.deserialize((byte[])oldValue));
+ try {
+ clientMessage.setLatestValue(BlobHelper.serializeToBlob(newValue));
+ } catch (IOException e) {
+ throw new GemFireIOException("Exception serializing entry value", e);
+ }
}
else{
- Object newValue = GeodeSecurityUtil.postProcess(clientMessage.getRegionName(),
- clientMessage.getKeyOfInterest(), oldValue);
+ Object newValue = GeodeSecurityUtil.postProcess(clientMessage.getRegionName(), clientMessage.getKeyOfInterest(), oldValue);
clientMessage.setLatestValue(newValue);
}
http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/1a4bd5d4/geode-core/src/test/java/com/gemstone/gemfire/distributed/internal/DistributionConfigJUnitTest.java
----------------------------------------------------------------------
diff --git a/geode-core/src/test/java/com/gemstone/gemfire/distributed/internal/DistributionConfigJUnitTest.java b/geode-core/src/test/java/com/gemstone/gemfire/distributed/internal/DistributionConfigJUnitTest.java
index 9d0740e..aab46fb 100644
--- a/geode-core/src/test/java/com/gemstone/gemfire/distributed/internal/DistributionConfigJUnitTest.java
+++ b/geode-core/src/test/java/com/gemstone/gemfire/distributed/internal/DistributionConfigJUnitTest.java
@@ -17,24 +17,28 @@
package com.gemstone.gemfire.distributed.internal;
import static com.gemstone.gemfire.distributed.ConfigurationProperties.*;
+import static org.junit.Assert.*;
+import static org.mockito.Matchers.any;
+import static org.mockito.Mockito.*;
+
+import java.io.File;
+import java.lang.reflect.Method;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Properties;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.experimental.categories.Category;
import com.gemstone.gemfire.InternalGemFireException;
import com.gemstone.gemfire.UnmodifiableException;
import com.gemstone.gemfire.internal.ConfigSource;
import com.gemstone.gemfire.management.internal.security.JSONAuthorization;
import com.gemstone.gemfire.test.junit.categories.UnitTest;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.experimental.categories.Category;
-
-import java.io.File;
-import java.lang.reflect.Method;
-import java.util.*;
-
-import static org.junit.Assert.*;
-import static org.mockito.Matchers.any;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.when;
@Category(UnitTest.class)
public class DistributionConfigJUnitTest {
@@ -73,7 +77,7 @@ public class DistributionConfigJUnitTest {
@Test
public void testGetAttributeNames() {
String[] attNames = AbstractDistributionConfig._getAttNames();
- assertEquals(attNames.length, 141);
+ assertEquals(attNames.length, 142);
List boolList = new ArrayList();
List intList = new ArrayList();
@@ -107,7 +111,7 @@ public class DistributionConfigJUnitTest {
assertEquals(boolList.size(), 30);
assertEquals(intList.size(), 33);
- assertEquals(stringList.size(), 70);
+ assertEquals(stringList.size(), 71);
assertEquals(fileList.size(), 5);
assertEquals(otherList.size(), 3);
}
http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/1a4bd5d4/geode-core/src/test/java/com/gemstone/gemfire/security/IntegratedSecurityNoShowValue1PostProcessorDUnitTest.java
----------------------------------------------------------------------
diff --git a/geode-core/src/test/java/com/gemstone/gemfire/security/IntegratedSecurityNoShowValue1PostProcessorDUnitTest.java b/geode-core/src/test/java/com/gemstone/gemfire/security/IntegratedSecurityNoShowValue1PostProcessorDUnitTest.java
index 98a62df..0599e57 100644
--- a/geode-core/src/test/java/com/gemstone/gemfire/security/IntegratedSecurityNoShowValue1PostProcessorDUnitTest.java
+++ b/geode-core/src/test/java/com/gemstone/gemfire/security/IntegratedSecurityNoShowValue1PostProcessorDUnitTest.java
@@ -24,13 +24,17 @@ import java.util.List;
import java.util.Map;
import org.junit.Test;
+import org.junit.experimental.categories.Category;
import com.gemstone.gemfire.cache.Region;
import com.gemstone.gemfire.cache.client.ClientCache;
import com.gemstone.gemfire.cache.client.Pool;
import com.gemstone.gemfire.cache.client.PoolManager;
import com.gemstone.gemfire.cache.query.SelectResults;
+import com.gemstone.gemfire.test.junit.categories.DistributedTest;
+import com.gemstone.gemfire.test.junit.categories.SecurityTest;
+@Category({ DistributedTest.class, SecurityTest.class })
public class IntegratedSecurityNoShowValue1PostProcessorDUnitTest extends AbstractIntegratedClientAuthDistributedTest {
public IntegratedSecurityNoShowValue1PostProcessorDUnitTest(){
http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/1a4bd5d4/geode-core/src/test/java/com/gemstone/gemfire/security/IntegratedSecurityPostProcessorDUnitTest.java
----------------------------------------------------------------------
diff --git a/geode-core/src/test/java/com/gemstone/gemfire/security/IntegratedSecurityPostProcessorDUnitTest.java b/geode-core/src/test/java/com/gemstone/gemfire/security/IntegratedSecurityPostProcessorDUnitTest.java
index 9f3e8b7..ceae94c 100644
--- a/geode-core/src/test/java/com/gemstone/gemfire/security/IntegratedSecurityPostProcessorDUnitTest.java
+++ b/geode-core/src/test/java/com/gemstone/gemfire/security/IntegratedSecurityPostProcessorDUnitTest.java
@@ -24,6 +24,7 @@ import java.util.List;
import java.util.Map;
import org.junit.Test;
+import org.junit.experimental.categories.Category;
import com.gemstone.gemfire.cache.EntryEvent;
import com.gemstone.gemfire.cache.Region;
@@ -36,7 +37,10 @@ import com.gemstone.gemfire.cache.client.PoolManager;
import com.gemstone.gemfire.cache.query.SelectResults;
import com.gemstone.gemfire.cache.util.CacheListenerAdapter;
import com.gemstone.gemfire.security.templates.SamplePostProcessor;
+import com.gemstone.gemfire.test.junit.categories.DistributedTest;
+import com.gemstone.gemfire.test.junit.categories.SecurityTest;
+@Category({ DistributedTest.class, SecurityTest.class })
public class IntegratedSecurityPostProcessorDUnitTest extends AbstractIntegratedClientAuthDistributedTest {
public IntegratedSecurityPostProcessorDUnitTest(){
[09/10] incubator-geode git commit: Merge branch 'feature/GEODE-1571'
of ssh://github.com/jinmeiliao/incubator-geode into feature/GEODE-1571
Posted by ji...@apache.org.
Merge branch 'feature/GEODE-1571' of ssh://github.com/jinmeiliao/incubator-geode into feature/GEODE-1571
Project: http://git-wip-us.apache.org/repos/asf/incubator-geode/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-geode/commit/c67f8b7e
Tree: http://git-wip-us.apache.org/repos/asf/incubator-geode/tree/c67f8b7e
Diff: http://git-wip-us.apache.org/repos/asf/incubator-geode/diff/c67f8b7e
Branch: refs/heads/feature/GEODE-1571
Commit: c67f8b7e26ff15904e5baa2a1b36caeec71aeabe
Parents: 1a4bd5d 0fd2288
Author: Jinmei Liao <ji...@pivotal.io>
Authored: Wed Jul 6 15:48:13 2016 -0700
Committer: Jinmei Liao <ji...@pivotal.io>
Committed: Wed Jul 6 15:48:13 2016 -0700
----------------------------------------------------------------------
.../internal/cache/GemFireCacheImpl.java | 4 +-
.../internal/security/GeodeSecurityUtil.java | 11 ++
.../gemfire/security/SecurityManager.java | 4 +-
...edSecurityCacheLifecycleIntegrationTest.java | 104 +++++++++++++++++++
4 files changed, 121 insertions(+), 2 deletions(-)
----------------------------------------------------------------------
[03/10] incubator-geode git commit: GEODE-1615: gfsh unable to
destroy region that has an hyphen in its name
Posted by ji...@apache.org.
GEODE-1615: gfsh unable to destroy region that has an hyphen in its name
This closes #186
Project: http://git-wip-us.apache.org/repos/asf/incubator-geode/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-geode/commit/66e76379
Tree: http://git-wip-us.apache.org/repos/asf/incubator-geode/tree/66e76379
Diff: http://git-wip-us.apache.org/repos/asf/incubator-geode/diff/66e76379
Branch: refs/heads/feature/GEODE-1571
Commit: 66e76379d9745e851bce7957ac843557bc4b2f98
Parents: ff2637d
Author: Kevin J. Duling <kd...@pivotal.io>
Authored: Thu Jun 30 15:07:22 2016 -0700
Committer: Jinmei Liao <ji...@pivotal.io>
Committed: Wed Jul 6 10:46:02 2016 -0700
----------------------------------------------------------------------
.../CreateAlterDestroyRegionCommands.java | 33 +++++----
...eateAlterDestroyRegionCommandsDUnitTest.java | 78 ++++++++++++++------
2 files changed, 74 insertions(+), 37 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/66e76379/geode-core/src/main/java/com/gemstone/gemfire/management/internal/cli/commands/CreateAlterDestroyRegionCommands.java
----------------------------------------------------------------------
diff --git a/geode-core/src/main/java/com/gemstone/gemfire/management/internal/cli/commands/CreateAlterDestroyRegionCommands.java b/geode-core/src/main/java/com/gemstone/gemfire/management/internal/cli/commands/CreateAlterDestroyRegionCommands.java
index e525f37..b1ad27d 100644
--- a/geode-core/src/main/java/com/gemstone/gemfire/management/internal/cli/commands/CreateAlterDestroyRegionCommands.java
+++ b/geode-core/src/main/java/com/gemstone/gemfire/management/internal/cli/commands/CreateAlterDestroyRegionCommands.java
@@ -30,10 +30,15 @@ import java.util.Map.Entry;
import java.util.Set;
import java.util.TreeSet;
import java.util.regex.Pattern;
+
import javax.management.MBeanServer;
import javax.management.MalformedObjectNameException;
import javax.management.ObjectName;
+import org.springframework.shell.core.annotation.CliAvailabilityIndicator;
+import org.springframework.shell.core.annotation.CliCommand;
+import org.springframework.shell.core.annotation.CliOption;
+
import com.gemstone.gemfire.LogWriter;
import com.gemstone.gemfire.cache.Cache;
import com.gemstone.gemfire.cache.CacheFactory;
@@ -81,10 +86,6 @@ import com.gemstone.gemfire.management.internal.configuration.SharedConfiguratio
import com.gemstone.gemfire.management.internal.configuration.domain.XmlEntity;
import com.gemstone.gemfire.management.internal.security.ResourceOperation;
-import org.springframework.shell.core.annotation.CliAvailabilityIndicator;
-import org.springframework.shell.core.annotation.CliCommand;
-import org.springframework.shell.core.annotation.CliOption;
-
/**
*
* @since GemFire 7.0
@@ -1082,17 +1083,25 @@ public class CreateAlterDestroyRegionCommands extends AbstractCommandsSupport {
return result;
}
- private Set<DistributedMember> findMembersForRegion(Cache cache, ManagementService managementService, String regionPath) {
+ private Set<DistributedMember> findMembersForRegion(Cache cache,
+ ManagementService managementService,
+ String regionPath) {
Set<DistributedMember> membersList = new HashSet<>();
- Set<String> regionMemberIds = Collections.emptySet();
+ Set<String> regionMemberIds = new HashSet<>();
MBeanServer mbeanServer = MBeanJMXAdapter.mbeanServer;
- String queryExp = MessageFormat.format(MBeanJMXAdapter.OBJECTNAME__REGION_MXBEAN, new Object[] {regionPath, "*"});
+
+ // needs to be escaped with quotes if it contains a hyphen
+ if (regionPath.contains("-")) {
+ regionPath = "\"" + regionPath + "\"";
+ }
+
+ String queryExp = MessageFormat.format(MBeanJMXAdapter.OBJECTNAME__REGION_MXBEAN, regionPath, "*");
try {
ObjectName queryExpON = new ObjectName(queryExp);
Set<ObjectName> queryNames = mbeanServer.queryNames(null, queryExpON);
- if (queryNames != null && queryNames.size() != 0) {
- regionMemberIds = new HashSet<>();
+ if (queryNames == null || queryNames.isEmpty()) {
+ return membersList; // protects against null pointer exception below
}
boolean addedOneRemote = false;
@@ -1117,7 +1126,7 @@ public class CreateAlterDestroyRegionCommands extends AbstractCommandsSupport {
} catch (ClassCastException e) {
LogWriter logger = cache.getLogger();
if (logger.finerEnabled()) {
- logger.finer(regionMBeanObjectName+" is not a "+RegionMXBean.class.getSimpleName(), e);
+ logger.finer(regionMBeanObjectName + " is not a " + RegionMXBean.class.getSimpleName(), e);
}
}
}
@@ -1125,9 +1134,7 @@ public class CreateAlterDestroyRegionCommands extends AbstractCommandsSupport {
if (!regionMemberIds.isEmpty()) {
membersList = getMembersByIds(cache, regionMemberIds);
}
- } catch (MalformedObjectNameException e) {
- LogWrapper.getInstance().info(e.getMessage(), e);
- } catch (NullPointerException e) {
+ } catch (MalformedObjectNameException | NullPointerException e) {
LogWrapper.getInstance().info(e.getMessage(), e);
}
http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/66e76379/geode-core/src/test/java/com/gemstone/gemfire/management/internal/cli/commands/CreateAlterDestroyRegionCommandsDUnitTest.java
----------------------------------------------------------------------
diff --git a/geode-core/src/test/java/com/gemstone/gemfire/management/internal/cli/commands/CreateAlterDestroyRegionCommandsDUnitTest.java b/geode-core/src/test/java/com/gemstone/gemfire/management/internal/cli/commands/CreateAlterDestroyRegionCommandsDUnitTest.java
index 5704ad7..21cdfbc 100644
--- a/geode-core/src/test/java/com/gemstone/gemfire/management/internal/cli/commands/CreateAlterDestroyRegionCommandsDUnitTest.java
+++ b/geode-core/src/test/java/com/gemstone/gemfire/management/internal/cli/commands/CreateAlterDestroyRegionCommandsDUnitTest.java
@@ -16,7 +16,38 @@
*/
package com.gemstone.gemfire.management.internal.cli.commands;
-import com.gemstone.gemfire.cache.*;
+import static com.gemstone.gemfire.distributed.ConfigurationProperties.*;
+import static com.gemstone.gemfire.test.dunit.Assert.*;
+import static com.gemstone.gemfire.test.dunit.LogWriterUtils.*;
+import static com.jayway.awaitility.Awaitility.*;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.text.MessageFormat;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Properties;
+import java.util.concurrent.Callable;
+import java.util.concurrent.CopyOnWriteArrayList;
+import java.util.concurrent.TimeUnit;
+
+import javax.management.MBeanServer;
+import javax.management.MalformedObjectNameException;
+import javax.management.ObjectName;
+
+import org.junit.Ignore;
+import org.junit.Test;
+import org.junit.experimental.categories.Category;
+
+import com.gemstone.gemfire.cache.Cache;
+import com.gemstone.gemfire.cache.PartitionAttributesFactory;
+import com.gemstone.gemfire.cache.Region;
+import com.gemstone.gemfire.cache.RegionAttributes;
+import com.gemstone.gemfire.cache.RegionFactory;
+import com.gemstone.gemfire.cache.RegionShortcut;
+import com.gemstone.gemfire.cache.Scope;
import com.gemstone.gemfire.cache.asyncqueue.AsyncEvent;
import com.gemstone.gemfire.cache.asyncqueue.AsyncEventListener;
import com.gemstone.gemfire.cache.wan.GatewaySenderFactory;
@@ -39,29 +70,6 @@ import com.gemstone.gemfire.test.dunit.SerializableCallable;
import com.gemstone.gemfire.test.dunit.VM;
import com.gemstone.gemfire.test.junit.categories.DistributedTest;
import com.gemstone.gemfire.test.junit.categories.FlakyTest;
-import org.junit.Ignore;
-import org.junit.Test;
-import org.junit.experimental.categories.Category;
-
-import javax.management.MBeanServer;
-import javax.management.MalformedObjectNameException;
-import javax.management.ObjectName;
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.OutputStream;
-import java.text.MessageFormat;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Properties;
-import java.util.concurrent.Callable;
-import java.util.concurrent.CopyOnWriteArrayList;
-import java.util.concurrent.TimeUnit;
-
-import static com.gemstone.gemfire.distributed.ConfigurationProperties.*;
-import static com.gemstone.gemfire.test.dunit.Assert.*;
-import static com.gemstone.gemfire.test.dunit.LogWriterUtils.getLogWriter;
-import static com.jayway.awaitility.Awaitility.waitAtMost;
@Category(DistributedTest.class)
public class CreateAlterDestroyRegionCommandsDUnitTest extends CliCommandTestBase {
@@ -289,6 +297,8 @@ public class CreateAlterDestroyRegionCommandsDUnitTest extends CliCommandTestBas
final Cache cache = getCache();
RegionFactory<Object, Object> factory = cache.createRegionFactory(RegionShortcut.PARTITION);
factory.create("Customer");
+ factory.create("Customer-2");
+ factory.create("Customer_3");
});
}
@@ -297,6 +307,8 @@ public class CreateAlterDestroyRegionCommandsDUnitTest extends CliCommandTestBas
RegionFactory<Object, Object> factory = cache.createRegionFactory(RegionShortcut.REPLICATE);
factory.setScope(Scope.LOCAL);
factory.create("Customer");
+ factory.create("Customer-2");
+ factory.create("Customer_3");
});
waitForRegionMBeanCreation("/Customer", 3);
@@ -318,10 +330,28 @@ public class CreateAlterDestroyRegionCommandsDUnitTest extends CliCommandTestBas
getLogWriter().info("testDestroyRegion strr=" + strr);
assertEquals(Result.Status.OK, cmdResult.getStatus());
+ command = "destroy region --name=/Customer_3";
+ getLogWriter().info("testDestroyRegion command=" + command);
+ cmdResult = executeCommand(command);
+ strr = commandResultToString(cmdResult);
+ assertTrue(stringContainsLine(strr, ".*Customer_3.*destroyed successfully.*"));
+ getLogWriter().info("testDestroyRegion strr=" + strr);
+ assertEquals(Result.Status.OK, cmdResult.getStatus());
+
+ command = "destroy region --name=/Customer-2";
+ getLogWriter().info("testDestroyRegion command=" + command);
+ cmdResult = executeCommand(command);
+ strr = commandResultToString(cmdResult);
+ assertTrue(stringContainsLine(strr, ".*Customer-2.*destroyed successfully.*"));
+ getLogWriter().info("testDestroyRegion strr=" + strr);
+ assertEquals(Result.Status.OK, cmdResult.getStatus());
+
for (int i = 1; i <= 3; i++) {
final int x = i;
Host.getHost(0).getVM(i).invoke(() -> {
assertNull("Region still exists in VM " + x, getCache().getRegion("Customer"));
+ assertNull("Region still exists in VM " + x, getCache().getRegion("Customer-2"));
+ assertNull("Region still exists in VM " + x, getCache().getRegion("Customer_3"));
});
}
}
[06/10] incubator-geode git commit: GEODE-1631: Removing a hardcoded
apache-geode from location
Posted by ji...@apache.org.
GEODE-1631: Removing a hardcoded apache-geode from location
Finding geode-dependencies.jar using a variable location instead of a
hardcoded one.
Project: http://git-wip-us.apache.org/repos/asf/incubator-geode/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-geode/commit/2ab9d115
Tree: http://git-wip-us.apache.org/repos/asf/incubator-geode/tree/2ab9d115
Diff: http://git-wip-us.apache.org/repos/asf/incubator-geode/diff/2ab9d115
Branch: refs/heads/feature/GEODE-1571
Commit: 2ab9d115ca82c10f1fcbff3ebcb6ea371a8441a0
Parents: d520b11
Author: Dan Smith <up...@apache.org>
Authored: Tue Jul 5 16:56:10 2016 -0700
Committer: Dan Smith <up...@apache.org>
Committed: Wed Jul 6 13:21:34 2016 -0700
----------------------------------------------------------------------
geode-assembly/build.gradle | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/2ab9d115/geode-assembly/build.gradle
----------------------------------------------------------------------
diff --git a/geode-assembly/build.gradle b/geode-assembly/build.gradle
index 6570c7d..c410f59 100755
--- a/geode-assembly/build.gradle
+++ b/geode-assembly/build.gradle
@@ -72,7 +72,7 @@ dependencies {
testCompile 'org.apache.httpcomponents:httpcore:' + project.'httpcore.version'
testRuntime files("${System.getProperty('java.home')}/../lib/tools.jar")
- testRuntime files("$buildDir/install/apache-geode/lib/geode-dependencies.jar")
+ testRuntime files("$buildDir/install/${distributions.main.baseName}/lib/geode-dependencies.jar")
gfshDependencies ('org.springframework:spring-web:' + project.'springframework.version'){
@@ -90,7 +90,7 @@ test {
// test from the actual classpath not the gradle classpath
dependsOn installDist
// @TODO: this doesn't seem to be working need to get basename first.
- classpath += files "$buildDir/install/apache-geode/lib/geode-dependencies.jar"
+ classpath += files "$buildDir/install/${distributions.main.baseName}/lib/geode-dependencies.jar"
}
tasks.withType(Test){
[04/10] incubator-geode git commit: GEODE-1593: increase default
number of off-heap free lists
Posted by ji...@apache.org.
GEODE-1593: increase default number of off-heap free lists
The number of off-heap free lists now defaults to 65536
so you can now, by default, have optimal free lists for
off-heap object whose size is less than or equal to 524,288 bytes.
Project: http://git-wip-us.apache.org/repos/asf/incubator-geode/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-geode/commit/640c8bbc
Tree: http://git-wip-us.apache.org/repos/asf/incubator-geode/tree/640c8bbc
Diff: http://git-wip-us.apache.org/repos/asf/incubator-geode/diff/640c8bbc
Branch: refs/heads/feature/GEODE-1571
Commit: 640c8bbc9d5b09c13b2c8ddba1b38597f6431f7e
Parents: 66e7637
Author: Darrel Schneider <ds...@pivotal.io>
Authored: Tue Jul 5 16:31:11 2016 -0700
Committer: Darrel Schneider <ds...@pivotal.io>
Committed: Wed Jul 6 11:03:34 2016 -0700
----------------------------------------------------------------------
.../com/gemstone/gemfire/internal/offheap/FreeListManager.java | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/640c8bbc/geode-core/src/main/java/com/gemstone/gemfire/internal/offheap/FreeListManager.java
----------------------------------------------------------------------
diff --git a/geode-core/src/main/java/com/gemstone/gemfire/internal/offheap/FreeListManager.java b/geode-core/src/main/java/com/gemstone/gemfire/internal/offheap/FreeListManager.java
index ffd5b0a..a4d2499 100644
--- a/geode-core/src/main/java/com/gemstone/gemfire/internal/offheap/FreeListManager.java
+++ b/geode-core/src/main/java/com/gemstone/gemfire/internal/offheap/FreeListManager.java
@@ -283,7 +283,7 @@ public class FreeListManager {
/**
* Number of free lists to keep for tiny allocations.
*/
- public final static int TINY_FREE_LIST_COUNT = Integer.getInteger(DistributionConfig.GEMFIRE_PREFIX + "OFF_HEAP_FREE_LIST_COUNT", 16384);
+ public final static int TINY_FREE_LIST_COUNT = Integer.getInteger(DistributionConfig.GEMFIRE_PREFIX + "OFF_HEAP_FREE_LIST_COUNT", 65536);
static {
verifyOffHeapFreeListCount(TINY_FREE_LIST_COUNT);
}
[05/10] incubator-geode git commit: GEODE-1580 ci failure:
GemFireDeadlockDetectorDUnitTest.testDistributedDeadlockWithDLock
Posted by ji...@apache.org.
GEODE-1580 ci failure: GemFireDeadlockDetectorDUnitTest.testDistributedDeadlockWithDLock
Marking the test as Flaky
Project: http://git-wip-us.apache.org/repos/asf/incubator-geode/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-geode/commit/d520b11c
Tree: http://git-wip-us.apache.org/repos/asf/incubator-geode/tree/d520b11c
Diff: http://git-wip-us.apache.org/repos/asf/incubator-geode/diff/d520b11c
Branch: refs/heads/feature/GEODE-1571
Commit: d520b11cc5f73a04af6e7c646a7a9d146e6f3dea
Parents: 640c8bb
Author: Bruce Schuchardt <bs...@pivotal.io>
Authored: Wed Jul 6 13:12:11 2016 -0700
Committer: Bruce Schuchardt <bs...@pivotal.io>
Committed: Wed Jul 6 13:13:45 2016 -0700
----------------------------------------------------------------------
.../internal/deadlock/GemFireDeadlockDetectorDUnitTest.java | 1 +
1 file changed, 1 insertion(+)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/d520b11c/geode-core/src/test/java/com/gemstone/gemfire/distributed/internal/deadlock/GemFireDeadlockDetectorDUnitTest.java
----------------------------------------------------------------------
diff --git a/geode-core/src/test/java/com/gemstone/gemfire/distributed/internal/deadlock/GemFireDeadlockDetectorDUnitTest.java b/geode-core/src/test/java/com/gemstone/gemfire/distributed/internal/deadlock/GemFireDeadlockDetectorDUnitTest.java
index 7767432..df8d220 100644
--- a/geode-core/src/test/java/com/gemstone/gemfire/distributed/internal/deadlock/GemFireDeadlockDetectorDUnitTest.java
+++ b/geode-core/src/test/java/com/gemstone/gemfire/distributed/internal/deadlock/GemFireDeadlockDetectorDUnitTest.java
@@ -154,6 +154,7 @@ public class GemFireDeadlockDetectorDUnitTest extends JUnit4CacheTestCase {
});
}
+ @Category(FlakyTest.class) // GEODE-1580 uses asyncs with pauses
@Test
public void testDistributedDeadlockWithDLock() throws Throwable {
Host host = Host.getHost(0);