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"

Reply via email to