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 <[email protected]> Authored: Mon Jun 26 09:08:14 2017 -0700 Committer: Bruce Schuchardt <[email protected]> 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"
