You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@geode.apache.org by bs...@apache.org on 2017/06/26 16:20:17 UTC
geode git commit: wip - GEODE_3072 unit tests
Repository: geode
Updated Branches:
refs/heads/feature/GEODE-3072 [created] 2477be051
wip - GEODE_3072 unit tests
Project: http://git-wip-us.apache.org/repos/asf/geode/repo
Commit: http://git-wip-us.apache.org/repos/asf/geode/commit/2477be05
Tree: http://git-wip-us.apache.org/repos/asf/geode/tree/2477be05
Diff: http://git-wip-us.apache.org/repos/asf/geode/diff/2477be05
Branch: refs/heads/feature/GEODE-3072
Commit: 2477be051d34d63f59cf41752d86b22a59254699
Parents: 3ee585c
Author: Bruce Schuchardt <bs...@pivotal.io>
Authored: Mon Jun 26 09:08:14 2017 -0700
Committer: Bruce Schuchardt <bs...@pivotal.io>
Committed: Mon Jun 26 09:08:14 2017 -0700
----------------------------------------------------------------------
.../geode/internal/cache/AbstractRegionMap.java | 4 +-
.../apache/geode/internal/cache/EventID.java | 90 +++++++++++++++++---
.../internal/cache/ha/ThreadIdentifier.java | 45 +++++++---
.../cache/tier/sockets/command/PeriodicAck.java | 10 ++-
.../cache/ha/ThreadIdentifierJUnitTest.java | 26 ++++++
.../sockets/ClientServerMiscBCDUnitTest.java | 53 ++++++------
geode-old-versions/build.gradle | 1 +
7 files changed, 176 insertions(+), 53 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/geode/blob/2477be05/geode-core/src/main/java/org/apache/geode/internal/cache/AbstractRegionMap.java
----------------------------------------------------------------------
diff --git a/geode-core/src/main/java/org/apache/geode/internal/cache/AbstractRegionMap.java b/geode-core/src/main/java/org/apache/geode/internal/cache/AbstractRegionMap.java
index a1b4a9d..ece3de1 100644
--- a/geode-core/src/main/java/org/apache/geode/internal/cache/AbstractRegionMap.java
+++ b/geode-core/src/main/java/org/apache/geode/internal/cache/AbstractRegionMap.java
@@ -3486,10 +3486,10 @@ public abstract class AbstractRegionMap implements RegionMap {
}
public void dumpMap() {
- logger.debug("dump of concurrent map of size {} for region {}", this._getMap().size(),
+ logger.info("dump of concurrent map of size {} for region {}", this._getMap().size(),
this._getOwner());
for (Iterator it = this._getMap().values().iterator(); it.hasNext();) {
- logger.trace("dumpMap:" + it.next().toString());
+ logger.info("dumpMap:" + it.next().toString());
}
}
http://git-wip-us.apache.org/repos/asf/geode/blob/2477be05/geode-core/src/main/java/org/apache/geode/internal/cache/EventID.java
----------------------------------------------------------------------
diff --git a/geode-core/src/main/java/org/apache/geode/internal/cache/EventID.java b/geode-core/src/main/java/org/apache/geode/internal/cache/EventID.java
index 4d2ddc1..573409a 100755
--- a/geode-core/src/main/java/org/apache/geode/internal/cache/EventID.java
+++ b/geode-core/src/main/java/org/apache/geode/internal/cache/EventID.java
@@ -388,18 +388,76 @@ public class EventID implements DataSerializableFixedID, Serializable, Externali
return false;
if (threadID != other.threadID)
return false;
- if (!Arrays.equals(membershipID, other.membershipID))
+ return equalMembershipIds(membershipID, other.membershipID);
+ }
+
+ static final int NULL_90_MEMBER_DATA_LENGTH = 17;
+
+ /**
+ * GEODE-3072 - v1.0.0 memberIDs in EventIDs may have 17 trailing bytes
+ * that should be ignored
+ */
+ static public boolean equalMembershipIds(byte[] m1, byte[] m2) {
+// if (true) {
+// return Arrays.equals(m1, m2);
+// }
+ int sizeDifference = Math.abs(m1.length-m2.length);
+ if (sizeDifference != 0 && sizeDifference != NULL_90_MEMBER_DATA_LENGTH) {
+ return false;
+ }
+ for (int i=0; i<m1.length; i++) {
+ if (i >= m2.length) {
+ return nullUUIDCheck(m1, i);
+ }
+ if (m1[i] != m2[i]) {
+ return false;
+ }
+ }
+ if (m1.length != m2.length) {
+ return nullUUIDCheck(m2, m1.length);
+ }
+ assert m1.length == m2.length;
+ return true;
+ }
+
+ /**
+ * GEODE-3072 - v1.0.0 memberIDs in EventIDs may have 17 trailing bytes
+ * that should be ignored
+ */
+ static private boolean nullUUIDCheck(byte[] memberID, int position) {
+ if (memberID.length - position != NULL_90_MEMBER_DATA_LENGTH) {
return false;
+ }
+ for (int i=position; i<memberID.length; i++) {
+ if (memberID[i] != 0) {
+ return false;
+ }
+ }
return true;
}
+ /**
+ * GEODE-3072 - v1.0.0 memberIDs in EventIDs may have 17 trailing bytes
+ * that should be ignored
+ */
+ static public int hashCodeMemberId(byte[] memberID) {
+// if (true) {
+// return Arrays.hashCode(memberID);
+// }
+ if (memberID.length < NULL_90_MEMBER_DATA_LENGTH + 19 // 19 is minimum serialized length of an InternalDistributedMember
+ || !nullUUIDCheck(memberID, memberID.length-NULL_90_MEMBER_DATA_LENGTH)) {
+ return Arrays.hashCode(memberID);
+ }
+ byte[] newID = new byte[memberID.length-NULL_90_MEMBER_DATA_LENGTH];
+ System.arraycopy(memberID, 0, newID, 0, newID.length);
+ return Arrays.hashCode(newID);
+ }
- @Override
public int hashCode() {
if (hashCode == 0) {
final int prime = 31;
int result = 1;
- result = prime * result + Arrays.hashCode(membershipID);
+ result = prime * result + hashCodeMemberId(membershipID);
result = prime * result + (int) (sequenceID ^ (sequenceID >>> 32));
result = prime * result + (int) (threadID ^ (threadID >>> 32));
hashCode = result;
@@ -438,18 +496,14 @@ public class EventID implements DataSerializableFixedID, Serializable, Externali
public String cheapToString() {
final StringBuffer buf = new StringBuffer();
buf.append(getShortClassName());
- if (LOG_ID_BYTES) {
+// if (LOG_ID_BYTES) {
buf.append("[membershipID=");
- for (int i = 0; i < membershipID.length; i++) {
- buf.append(membershipID[i]);
- if (i < membershipID.length - 1) {
- buf.append(',');
- }
- }
+ appendByteArray(buf, membershipID);
+ buf.append(" (").append(membershipID.length).append(" bytes, full=").append(getDistributedMember()).append(")");
buf.append(";");
- } else {
- buf.append("[");
- }
+// } else {
+// buf.append("[");
+// }
// buf.append(this.membershipID.toString());
buf.append("threadID=");
buf.append(ThreadIdentifier.toDisplayString(threadID));
@@ -468,6 +522,16 @@ public class EventID implements DataSerializableFixedID, Serializable, Externali
return buf.toString();
}
+
+ public static void appendByteArray(StringBuffer buf, byte[] membershipID) {
+ for (int i = 0; i < membershipID.length; i++) {
+ buf.append(membershipID[i]);
+ if (i < membershipID.length - 1) {
+ buf.append(',');
+ }
+ }
+ }
+
private static byte[] initializeAndGetDSEventIdentity(DistributedSystem sys) {
if (sys == null) {
// DistributedSystem is required now before handshaking -Kirk
http://git-wip-us.apache.org/repos/asf/geode/blob/2477be05/geode-core/src/main/java/org/apache/geode/internal/cache/ha/ThreadIdentifier.java
----------------------------------------------------------------------
diff --git a/geode-core/src/main/java/org/apache/geode/internal/cache/ha/ThreadIdentifier.java b/geode-core/src/main/java/org/apache/geode/internal/cache/ha/ThreadIdentifier.java
index ec165a5..fb4cb35 100755
--- a/geode-core/src/main/java/org/apache/geode/internal/cache/ha/ThreadIdentifier.java
+++ b/geode-core/src/main/java/org/apache/geode/internal/cache/ha/ThreadIdentifier.java
@@ -21,10 +21,14 @@ import java.io.DataOutput;
import java.io.IOException;
import java.util.Arrays;
+import org.apache.logging.log4j.Logger;
+
import org.apache.geode.DataSerializable;
import org.apache.geode.DataSerializer;
+import org.apache.geode.distributed.DistributedMember;
import org.apache.geode.distributed.internal.membership.InternalDistributedMember;
import org.apache.geode.internal.cache.EventID;
+import org.apache.geode.internal.logging.LogService;
/**
* Class identifying a Thread uniquely across the distributed system. It is composed of two fields
@@ -146,26 +150,45 @@ public class ThreadIdentifier implements DataSerializable {
this.threadID = threadId;
}
+ private InternalDistributedMember getDistributedMember() {
+ ByteArrayInputStream bais = new ByteArrayInputStream(this.membershipID);
+ DataInputStream dis = new DataInputStream(bais);
+ InternalDistributedMember result = null;
+ try {
+ result = InternalDistributedMember.readEssentialData(dis);
+ } catch (IOException e) {
+ // nothing can be done about this
+ } catch (ClassNotFoundException e) {
+ // ditto
+ }
+ return result;
+ }
+
+ private static final Logger logger = LogService.getLogger();
+
@Override
public boolean equals(Object obj) {
if ((obj == null) || !(obj instanceof ThreadIdentifier)) {
return false;
}
- return (this.threadID == ((ThreadIdentifier) obj).threadID
- && Arrays.equals(this.membershipID, ((ThreadIdentifier) obj).membershipID));
+ ThreadIdentifier other = (ThreadIdentifier)obj;
+ boolean result = (this.threadID == other.threadID
+ && EventID.equalMembershipIds(this.membershipID, other.membershipID));
+// logger.info("TID.equals() returning {} for {}.equals({})", result, this, other);
+ return result;
}
- // TODO: Asif : Check this implementation
@Override
public int hashCode() {
- int result = 17;
+ // int result = 17;
final int mult = 37;
- if (this.membershipID != null && this.membershipID.length > 0) {
- for (int i = 0; i < this.membershipID.length; i++) {
- result = mult * result + this.membershipID[i];
- }
- }
+// if (this.membershipID != null && this.membershipID.length > 0) {
+// for (int i = 0; i < this.membershipID.length; i++) {
+// result = mult * result + this.membershipID[i];
+// }
+ int result = EventID.hashCodeMemberId(membershipID);
+// }
result = mult * result + (int) this.threadID;
result = mult * result + (int) (this.threadID >>> 32);
@@ -195,9 +218,11 @@ public class ThreadIdentifier implements DataSerializable {
@Override
public String toString() {
- StringBuilder sb = new StringBuilder();
+ StringBuffer sb = new StringBuffer();
sb.append("ThreadId[");
+ EventID.appendByteArray(sb, membershipID);
+ sb.append("; ");
sb.append(toDisplayString(threadID));
sb.append("]");
http://git-wip-us.apache.org/repos/asf/geode/blob/2477be05/geode-core/src/main/java/org/apache/geode/internal/cache/tier/sockets/command/PeriodicAck.java
----------------------------------------------------------------------
diff --git a/geode-core/src/main/java/org/apache/geode/internal/cache/tier/sockets/command/PeriodicAck.java b/geode-core/src/main/java/org/apache/geode/internal/cache/tier/sockets/command/PeriodicAck.java
index ff8c9f2..0933e61 100644
--- a/geode-core/src/main/java/org/apache/geode/internal/cache/tier/sockets/command/PeriodicAck.java
+++ b/geode-core/src/main/java/org/apache/geode/internal/cache/tier/sockets/command/PeriodicAck.java
@@ -39,22 +39,26 @@ public class PeriodicAck extends BaseCommand {
final SecurityService securityService, long start)
throws IOException, ClassNotFoundException {
serverConnection.setAsTrue(REQUIRES_RESPONSE);
- if (logger.isDebugEnabled()) {
- logger.debug("{}: Received periodic ack request ({} bytes) from {}",
+// if (logger.isDebugEnabled()) {
+ logger.info("{}: Received periodic ack request ({} bytes) from {}",
serverConnection.getName(), clientMessage.getPayloadLength(),
serverConnection.getSocketString());
- }
+// }
try {
int numEvents = clientMessage.getNumberOfParts();
boolean success = false;
CacheClientNotifier ccn = serverConnection.getAcceptor().getCacheClientNotifier();
CacheClientProxy proxy = ccn.getClientProxy(serverConnection.getProxyID());
if (proxy != null) {
+// try {
+// Thread.sleep(5000);
+// } catch (InterruptedException e) {}
proxy.getHARegionQueue().createAckedEventsMap();
for (int i = 0; i < numEvents; i++) {
Part eventIdPart = clientMessage.getPart(i);
eventIdPart.setVersion(serverConnection.getClientVersion());
EventID eid = (EventID) eventIdPart.getObject();
+// logger.info("For {} dispatching ack event {}", serverConnection.getProxyID().getDistributedMember(), eid);
success = ccn.processDispatchedMessage(serverConnection.getProxyID(), eid);
if (!success)
break;
http://git-wip-us.apache.org/repos/asf/geode/blob/2477be05/geode-core/src/test/java/org/apache/geode/internal/cache/ha/ThreadIdentifierJUnitTest.java
----------------------------------------------------------------------
diff --git a/geode-core/src/test/java/org/apache/geode/internal/cache/ha/ThreadIdentifierJUnitTest.java b/geode-core/src/test/java/org/apache/geode/internal/cache/ha/ThreadIdentifierJUnitTest.java
index 29b22be..15a61b9 100644
--- a/geode-core/src/test/java/org/apache/geode/internal/cache/ha/ThreadIdentifierJUnitTest.java
+++ b/geode-core/src/test/java/org/apache/geode/internal/cache/ha/ThreadIdentifierJUnitTest.java
@@ -16,6 +16,12 @@ package org.apache.geode.internal.cache.ha;
import static org.junit.Assert.*;
+import java.net.InetAddress;
+
+import org.apache.geode.distributed.internal.membership.InternalDistributedMember;
+import org.apache.geode.internal.Version;
+import org.apache.geode.internal.cache.EventID;
+import org.apache.geode.internal.cache.tier.sockets.ClientProxyMembershipID;
import org.apache.geode.test.junit.categories.ClientServerTest;
import org.junit.Test;
import org.junit.experimental.categories.Category;
@@ -27,6 +33,26 @@ import org.apache.geode.test.junit.categories.UnitTest;
public class ThreadIdentifierJUnitTest {
@Test
+ public void testEqualsIgnoresUUIDBytes() throws Exception {
+ InternalDistributedMember id = new InternalDistributedMember(InetAddress.getLocalHost(), 1234);
+ id.setVersionObjectForTest(Version.GFE_90);
+ byte[] memberIdBytes = EventID.getMembershipId(new ClientProxyMembershipID(id));
+ byte[] memberIdBytesWithoutUUID = new byte[memberIdBytes.length-(2*8 + 1)];// UUID bytes + weight byte
+ System.arraycopy(memberIdBytes, 0, memberIdBytesWithoutUUID, 0, memberIdBytesWithoutUUID.length);
+ ThreadIdentifier threadIdWithUUID = new ThreadIdentifier(memberIdBytes, 1);
+ ThreadIdentifier threadIdWithoutUUID = new ThreadIdentifier(memberIdBytesWithoutUUID, 1);
+ assertEquals(threadIdWithoutUUID, threadIdWithUUID);
+ assertEquals(threadIdWithUUID, threadIdWithoutUUID);
+ assertEquals(threadIdWithoutUUID.hashCode(), threadIdWithUUID.hashCode());
+
+ EventID eventIDWithUUID = new EventID(memberIdBytes, 1, 1);
+ EventID eventIDWithoutUUID = new EventID(memberIdBytesWithoutUUID, 1,1);
+ assertEquals(eventIDWithUUID, eventIDWithoutUUID);
+ assertEquals(eventIDWithoutUUID, eventIDWithUUID);
+ assertEquals(eventIDWithoutUUID.hashCode(), eventIDWithUUID.hashCode());
+ }
+
+ @Test
public void testPutAllId() {
int id = 42;
int bucketNumber = 113;
http://git-wip-us.apache.org/repos/asf/geode/blob/2477be05/geode-core/src/test/java/org/apache/geode/internal/cache/tier/sockets/ClientServerMiscBCDUnitTest.java
----------------------------------------------------------------------
diff --git a/geode-core/src/test/java/org/apache/geode/internal/cache/tier/sockets/ClientServerMiscBCDUnitTest.java b/geode-core/src/test/java/org/apache/geode/internal/cache/tier/sockets/ClientServerMiscBCDUnitTest.java
index 5fb8fa2..10981ae 100755
--- a/geode-core/src/test/java/org/apache/geode/internal/cache/tier/sockets/ClientServerMiscBCDUnitTest.java
+++ b/geode-core/src/test/java/org/apache/geode/internal/cache/tier/sockets/ClientServerMiscBCDUnitTest.java
@@ -20,6 +20,7 @@ import static org.junit.Assert.assertTrue;
import org.apache.geode.cache.Region;
import org.apache.geode.cache.client.Pool;
+import org.apache.geode.distributed.internal.membership.InternalDistributedMember;
import org.apache.geode.internal.cache.EventID;
import org.apache.geode.internal.cache.LocalRegion;
import org.apache.geode.test.dunit.Host;
@@ -96,31 +97,33 @@ public class ClientServerMiscBCDUnitTest extends ClientServerMiscDUnitTest {
});
}
- // @Test
- @Ignore
- public void testDistributedMemberBytesWithCurrentServerAndOldClient() throws Exception {
- // Start current version server
- int serverPort = initServerCache(true);
-
- // Start old version client and do puts
- VM client = Host.getHost(0).getVM(testVersion, 1);
- String hostname = NetworkUtils.getServerHostName(Host.getHost(0));
- client.invoke("create client cache", () -> {
- createClientCache(hostname, serverPort);
- populateCache();
- });
-
- // Get client member id byte array on client
- byte[] clientMembershipIdBytesOnClient =
- client.invoke(() -> getClientMembershipIdBytesOnClient());
-
- // Get client member id byte array on server
- byte[] clientMembershipIdBytesOnServer =
- server1.invoke(() -> getClientMembershipIdBytesOnServer());
-
- // Verify member id bytes on client and server are equal
- assertTrue(Arrays.equals(clientMembershipIdBytesOnClient, clientMembershipIdBytesOnServer));
- }
+ @Test
+// @Ignore
+ public void testDistributedMemberBytesWithCurrentServerAndOldClient() throws Exception {
+ // Start current version server
+ int serverPort = initServerCache(true);
+
+ // Start old version client and do puts
+ VM client = Host.getHost(0).getVM(testVersion, 1);
+ String hostname = NetworkUtils.getServerHostName(Host.getHost(0));
+ client.invoke("create client cache", () -> {
+ createClientCache(hostname, serverPort);
+ populateCache();
+ });
+
+ // Get client member id byte array on client
+ byte[] clientMembershipIdBytesOnClient =
+ client.invoke(() -> getClientMembershipIdBytesOnClient());
+
+ // Get client member id byte array on server
+ byte[] clientMembershipIdBytesOnServer =
+ server1.invoke(() -> getClientMembershipIdBytesOnServer());
+
+ // Verify member id bytes on client and server are equal
+ String complaint = "size on client=" + clientMembershipIdBytesOnClient.length
+ + "; size on server=" + clientMembershipIdBytesOnServer.length;
+ assertTrue(complaint, Arrays.equals(clientMembershipIdBytesOnClient, clientMembershipIdBytesOnServer));
+ }
private byte[] getClientMembershipIdBytesOnClient() {
return EventID.getMembershipId(getCache().getDistributedSystem());
http://git-wip-us.apache.org/repos/asf/geode/blob/2477be05/geode-old-versions/build.gradle
----------------------------------------------------------------------
diff --git a/geode-old-versions/build.gradle b/geode-old-versions/build.gradle
index d85eb0b..c4ffa54 100644
--- a/geode-old-versions/build.gradle
+++ b/geode-old-versions/build.gradle
@@ -38,6 +38,7 @@ def addTestSource(def source, def geodeVersion) {
// Add sourceSets for backwards compatibility, rolling upgrade, and
// pdx testing.
addTestSource('test100', '1.0.0-incubating')
+addTestSource('test110', '1.1.0')
addTestSource('test111', '1.1.1')
def generatedResources = "$buildDir/generated-resources/main"